- int i;
-
- if (global_joystick_status == JOYSTICK_OFF)
- return;
-
- joystick_status = JOYSTICK_OFF;
-
-#ifndef MSDOS
- for (i=0; i<MAX_PLAYERS; i++)
- {
- char *device_name = setup.input[i].joy.device_name;
-
- /* this allows subsequent calls to 'InitJoysticks' for re-initialization */
- if (stored_player[i].joystick_fd != -1)
- {
- close(stored_player[i].joystick_fd);
- stored_player[i].joystick_fd = -1;
- }
-
- if (!setup.input[i].use_joystick)
- continue;
-
- if (access(device_name, R_OK) != 0)
- {
- Error(ERR_WARN, "cannot access joystick device '%s'", device_name);
- continue;
- }
-
- if ((stored_player[i].joystick_fd = open(device_name, O_RDONLY)) < 0)
- {
- Error(ERR_WARN, "cannot open joystick device '%s'", device_name);
- continue;
- }
-
- joystick_status = JOYSTICK_AVAILABLE;
- }
-
-#else /* MSDOS */
-
- /* try to access two joysticks; if that fails, try to access just one */
- if (install_joystick(JOY_TYPE_2PADS) == 0 ||
- install_joystick(JOY_TYPE_AUTODETECT) == 0)
- joystick_status = JOYSTICK_AVAILABLE;
-
- /*
- load_joystick_data(JOYSTICK_FILENAME);
- */
-
- for (i=0; i<MAX_PLAYERS; i++)
- {
- char *device_name = setup.input[i].joy.device_name;
- int joystick_nr = getJoystickNrFromDeviceName(device_name);
-
- if (joystick_nr >= num_joysticks)
- joystick_nr = -1;
-
- /* misuse joystick file descriptor variable to store joystick number */
- stored_player[i].joystick_fd = joystick_nr;
- }
-#endif
-}
-
-void InitDisplay()
-{
-#ifndef MSDOS
- XVisualInfo vinfo_template, *vinfo;
- int num_visuals;
-#endif
- unsigned int depth;
-
- /* connect to X server */
- if (!(display = XOpenDisplay(options.display_name)))
- Error(ERR_EXIT, "cannot connect to X server %s",
- XDisplayName(options.display_name));
-
- screen = DefaultScreen(display);
- visual = DefaultVisual(display, screen);
- depth = DefaultDepth(display, screen);
- cmap = DefaultColormap(display, screen);
-
-#ifndef MSDOS
- /* look for good enough visual */
- vinfo_template.screen = screen;
- vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor);
- vinfo_template.depth = depth;
- if ((vinfo = XGetVisualInfo(display, VisualScreenMask | VisualClassMask |
- VisualDepthMask, &vinfo_template, &num_visuals)))
- {
- visual = vinfo->visual;
- XFree((void *)vinfo);
- }
-
- /* got appropriate visual? */
- if (depth < 8)
- {
- printf("Sorry, displays with less than 8 bits per pixel not supported.\n");
- exit(-1);
- }
- else if ((depth ==8 && visual->class != PseudoColor) ||
- (depth > 8 && visual->class != TrueColor &&
- visual->class != DirectColor))
- {
- printf("Sorry, cannot get appropriate visual.\n");
- exit(-1);
- }
-#endif
-}
-
-void InitWindow(int argc, char *argv[])
-{
- unsigned int border_width = 4;
- XGCValues gc_values;
- unsigned long gc_valuemask;
-#ifndef MSDOS
- XTextProperty windowName, iconName;
- Pixmap icon_pixmap, iconmask_pixmap;
- unsigned int icon_width, icon_height;
- int icon_hot_x, icon_hot_y;
- char icon_filename[256];
- XSizeHints size_hints;
- XWMHints wm_hints;
- XClassHint class_hints;
- char *window_name = WINDOWTITLE_STRING;
- char *icon_name = WINDOWTITLE_STRING;
- long window_event_mask;
- Atom proto_atom = None, delete_atom = None;
-#endif
- int screen_width, screen_height;
- int win_xpos = WIN_XPOS, win_ypos = WIN_YPOS;
- unsigned long pen_fg = WhitePixel(display,screen);
- unsigned long pen_bg = BlackPixel(display,screen);
- const int width = WIN_XSIZE, height = WIN_YSIZE;
-
-#ifndef MSDOS
- static struct IconFileInfo icon_pic =
- {
- "rocks_icon.xbm",
- "rocks_iconmask.xbm"
- };
-#endif
-
- screen_width = XDisplayWidth(display, screen);
- screen_height = XDisplayHeight(display, screen);
-
- win_xpos = (screen_width - width) / 2;
- win_ypos = (screen_height - height) / 2;
-
- window = XCreateSimpleWindow(display, RootWindow(display, screen),
- win_xpos, win_ypos, width, height, border_width,
- pen_fg, pen_bg);
-
-#ifndef MSDOS
- proto_atom = XInternAtom(display, "WM_PROTOCOLS", FALSE);
- delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", FALSE);
- if ((proto_atom != None) && (delete_atom != None))
- XChangeProperty(display, window, proto_atom, XA_ATOM, 32,
- PropModePrepend, (unsigned char *) &delete_atom, 1);
-
- sprintf(icon_filename, "%s/%s/%s",
- options.base_directory, GRAPHICS_DIRECTORY,
- icon_pic.picture_filename);
- XReadBitmapFile(display,window,icon_filename,
- &icon_width,&icon_height,
- &icon_pixmap,&icon_hot_x,&icon_hot_y);
- if (!icon_pixmap)
- Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename);
-
- sprintf(icon_filename, "%s/%s/%s",
- options.base_directory, GRAPHICS_DIRECTORY,
- icon_pic.picturemask_filename);
- XReadBitmapFile(display,window,icon_filename,
- &icon_width,&icon_height,
- &iconmask_pixmap,&icon_hot_x,&icon_hot_y);
- if (!iconmask_pixmap)
- Error(ERR_EXIT, "cannot read icon bitmap file '%s'", icon_filename);
-
- size_hints.width = size_hints.min_width = size_hints.max_width = width;
- size_hints.height = size_hints.min_height = size_hints.max_height = height;
- size_hints.flags = PSize | PMinSize | PMaxSize;
-
- if (win_xpos || win_ypos)
- {
- size_hints.x = win_xpos;
- size_hints.y = win_ypos;
- size_hints.flags |= PPosition;
- }
-
- if (!XStringListToTextProperty(&window_name, 1, &windowName))
- Error(ERR_EXIT, "structure allocation for windowName failed");
-
- if (!XStringListToTextProperty(&icon_name, 1, &iconName))
- Error(ERR_EXIT, "structure allocation for iconName failed");
-
- wm_hints.initial_state = NormalState;
- wm_hints.input = True;
- wm_hints.icon_pixmap = icon_pixmap;
- wm_hints.icon_mask = iconmask_pixmap;
- wm_hints.flags = StateHint | IconPixmapHint | IconMaskHint | InputHint;
-
- class_hints.res_name = program_name;
- class_hints.res_class = "Rocks'n'Diamonds";
-
- XSetWMProperties(display, window, &windowName, &iconName,
- argv, argc, &size_hints, &wm_hints,
- &class_hints);
-
- XFree(windowName.value);
- XFree(iconName.value);
-
- /* Select event types wanted */
- window_event_mask = ExposureMask | StructureNotifyMask | FocusChangeMask |
- ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
- KeyPressMask | KeyReleaseMask;
- XSelectInput(display, window, window_event_mask);
-#endif
-
- /* create GC for drawing with window depth */
- gc_values.graphics_exposures = False;
- gc_values.foreground = pen_bg;
- gc_values.background = pen_bg;
- gc_valuemask = GCGraphicsExposures | GCForeground | GCBackground;
- gc = XCreateGC(display, window, gc_valuemask, &gc_values);
-}
-
-void DrawInitText(char *text, int ypos, int color)
-{
- if (display && window && pix[PIX_SMALLFONT])
- {
- XFillRectangle(display,window,gc,0,ypos, WIN_XSIZE,FONT2_YSIZE);
- DrawTextExt(window,gc,(WIN_XSIZE-strlen(text)*FONT2_XSIZE)/2,
- ypos,text,FS_SMALL,color);
- XFlush(display);
- }
-}
-
-void InitGfx()
-{
- int i,j;