X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibgame%2Fx11.c;h=38365464e3d8617bf4d7c512f84e25cc9f46a0a1;hb=7a7f090296fc140cb8d51bcc02759eb0d09ed8c8;hp=fcf316019c9775a36ec2ec6d2819cdfa22617c4e;hpb=b8114966908299df586165e00446f21c2ce343bb;p=rocksndiamonds.git diff --git a/src/libgame/x11.c b/src/libgame/x11.c index fcf31601..38365464 100644 --- a/src/libgame/x11.c +++ b/src/libgame/x11.c @@ -198,8 +198,9 @@ static DrawWindow *X11InitWindow() /* Select event types wanted */ window_event_mask = ExposureMask | StructureNotifyMask | FocusChangeMask | - ButtonPressMask | ButtonReleaseMask | PointerMotionMask | - PointerMotionHintMask | KeyPressMask | KeyReleaseMask; + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | PointerMotionHintMask | + KeyPressMask | KeyReleaseMask; XSelectInput(display, new_window->drawable, window_event_mask); #endif @@ -420,4 +421,53 @@ inline Pixel X11GetPixelFromRGB(unsigned int color_r, unsigned int color_g, return pixel; } +/* ------------------------------------------------------------------------- */ +/* mouse pointer functions */ +/* ------------------------------------------------------------------------- */ + +#if defined(TARGET_X11_NATIVE) + +static Cursor create_cursor(struct MouseCursorInfo *cursor_info) +{ + Pixmap pixmap_data, pixmap_mask; + XColor color_fg, color_bg; + Cursor cursor; + + /* shape and mask are single plane pixmaps */ + 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, + cursor_info->hot_x, cursor_info->hot_y); + + return cursor; +} + +void X11SetMouseCursor(struct MouseCursorInfo *cursor_info) +{ + static struct MouseCursorInfo *last_cursor_info = NULL; + static Cursor cursor_default = None; + static Cursor cursor_current = None; + + if (cursor_info != NULL && cursor_info != last_cursor_info) + { + cursor_current = create_cursor(cursor_info); + last_cursor_info = cursor_info; + } + + XDefineCursor(display, window->drawable, + cursor_info ? cursor_current : cursor_default); +} +#endif /* TARGET_X11_NATIVE */ + #endif /* TARGET_X11 */