X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fx11.c;h=6d5cb0a9ffe513e25af43487da2dad744eb53aff;hb=201eaae5ae325e0c99e43ab240163a99dc5c0db9;hp=61d1a1a5d2b06d7759ea32533004215b3ffe6286;hpb=de8b3ae622eae10f1caf96872fb1790f7bd9644b;p=rocksndiamonds.git diff --git a/src/libgame/x11.c b/src/libgame/x11.c index 61d1a1a5..6d5cb0a9 100644 --- a/src/libgame/x11.c +++ b/src/libgame/x11.c @@ -198,12 +198,10 @@ static DrawWindow *X11InitWindow() /* Select event types wanted */ window_event_mask = ExposureMask | StructureNotifyMask | FocusChangeMask | - ButtonPressMask | ButtonReleaseMask | PointerMotionMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | PointerMotionHintMask | KeyPressMask | KeyReleaseMask; - /* unwanted mouse motion events now get filtered out by filter function */ - /* window_event_mask |= PointerMotionHintMask; */ - XSelectInput(display, new_window->drawable, window_event_mask); #endif @@ -216,7 +214,7 @@ static DrawWindow *X11InitWindow() XCreateGC(display, new_window->drawable, gc_valuemask, &gc_values); /* create GCs for line drawing (black and white) */ - for(i=0; i<2; i++) + for (i = 0; i < 2; i++) { gc_values.graphics_exposures = False; gc_values.foreground = (i ? pen_fg : pen_bg); @@ -401,11 +399,12 @@ inline Pixel X11GetPixel(Bitmap *bitmap, int x, int y) AllPlanes, ZPixmap); pixel_value = XGetPixel(pixel_image, 0, 0); - XDestroyImage(pixel_image); + X11DestroyImage(pixel_image); return pixel_value; } +#if defined(TARGET_X11_NATIVE) inline Pixel X11GetPixelFromRGB(unsigned int color_r, unsigned int color_g, unsigned int color_b) { @@ -422,6 +421,22 @@ inline Pixel X11GetPixelFromRGB(unsigned int color_r, unsigned int color_g, return pixel; } +#endif /* TARGET_X11_NATIVE */ + +inline void X11DestroyImage(XImage *ximage) +{ +#if defined(TARGET_X11_NATIVE) + /* this seems to be needed for OS/2, but does not hurt on other platforms */ + if (ximage->data != NULL) + { + free(ximage->data); + ximage->data = NULL; + } +#endif /* TARGET_X11_NATIVE */ + + XDestroyImage(ximage); +} + /* ------------------------------------------------------------------------- */ /* mouse pointer functions */ @@ -429,82 +444,46 @@ inline Pixel X11GetPixelFromRGB(unsigned int color_r, unsigned int color_g, #if defined(TARGET_X11_NATIVE) -static Cursor create_cursor(const char **image) +static Cursor create_cursor(struct MouseCursorInfo *cursor_info) { Pixmap pixmap_data, pixmap_mask; XColor color_fg, color_bg; Cursor cursor; - int i, row, col; - char data[4*32]; - char mask[4*32]; - int hot_x, hot_y; - - int data_width = 32, data_height = 32; - int mask_width = 32, mask_height = 32; - - i = -1; - for (row=0; row<32; ++row) - { - for (col=0; col<32; ++col) - { - if (col % 8) - { - data[i] <<= 1; - mask[i] <<= 1; - } - else - { - i++; - data[i] = mask[i] = 0; - } - - switch (image[4+row][col]) - { - case 'X': - data[i] |= 0x01; - mask[i] |= 0x01; - break; - case '.': - mask[i] |= 0x01; - break; - case ' ': - break; - } - } - } - - sscanf(image[4+row], "%d,%d", &hot_x, &hot_y); - /* shape and mask are single plane pixmaps */ - pixmap_data = XCreatePixmapFromBitmapData(display, window->drawable, data, - data_width, data_height, 1, 0, 1); - pixmap_mask = XCreatePixmapFromBitmapData(display, window->drawable, mask, - mask_width, mask_height, 1, 0, 1); + pixmap_data = + XCreatePixmapFromBitmapData(display, window->drawable, cursor_info->data, + cursor_info->width, cursor_info->height, + 1, 0, 1); + pixmap_mask = + XCreatePixmapFromBitmapData(display, window->drawable, cursor_info->mask, + cursor_info->width, cursor_info->height, + 1, 0, 1); XParseColor(display, cmap, "black", &color_fg); XParseColor(display, cmap, "white", &color_bg); cursor = XCreatePixmapCursor(display, pixmap_data, pixmap_mask, - &color_fg, &color_bg, hot_x, hot_y); + &color_fg, &color_bg, + cursor_info->hot_x, cursor_info->hot_y); return cursor; } -void X11SetMouseCursor(const char **cursor_image) +void X11SetMouseCursor(struct MouseCursorInfo *cursor_info) { - static const char **last_cursor_image = NULL; + static struct MouseCursorInfo *last_cursor_info = NULL; static Cursor cursor_default = None; static Cursor cursor_current = None; - if (cursor_image != NULL && cursor_image != last_cursor_image) + if (cursor_info != NULL && cursor_info != last_cursor_info) { - cursor_current = create_cursor(cursor_image); - last_cursor_image = cursor_image; + cursor_current = create_cursor(cursor_info); + last_cursor_info = cursor_info; } XDefineCursor(display, window->drawable, - cursor_image ? cursor_current : cursor_default); + cursor_info ? cursor_current : cursor_default); } #endif /* TARGET_X11_NATIVE */