From a88167dd02d4f942723f35f419d6bcf661b10792 Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Sat, 24 Sep 2011 02:01:43 +0100 Subject: [PATCH] redefine cursors when cursor theme is changed --- src/display.c | 84 ++++++++++++++++++++++++++++++++------------------------ src/display.h | 2 + src/events.c | 20 +++++++++++++ 3 files changed, 70 insertions(+), 36 deletions(-) diff --git a/src/display.c b/src/display.c index d370f26..861f1eb 100644 --- a/src/display.c +++ b/src/display.c @@ -310,28 +310,7 @@ myDisplayInit (GdkDisplay *gdisplay) display->have_xrandr = FALSE; #endif /* HAVE_RANDR */ - display->root_cursor = - XCreateFontCursor (display->dpy, CURSOR_ROOT); - display->move_cursor = - XCreateFontCursor (display->dpy, CURSOR_MOVE); - display->busy_cursor = - cursorCreateSpinning (display->dpy); - display->resize_cursor[CORNER_TOP_LEFT] = - XCreateFontCursor (display->dpy, XC_top_left_corner); - display->resize_cursor[CORNER_TOP_RIGHT] = - XCreateFontCursor (display->dpy, XC_top_right_corner); - display->resize_cursor[CORNER_BOTTOM_LEFT] = - XCreateFontCursor (display->dpy, XC_bottom_left_corner); - display->resize_cursor[CORNER_BOTTOM_RIGHT] = - XCreateFontCursor (display->dpy, XC_bottom_right_corner); - display->resize_cursor[CORNER_COUNT + SIDE_LEFT] = - XCreateFontCursor (display->dpy, XC_left_side); - display->resize_cursor[CORNER_COUNT + SIDE_RIGHT] = - XCreateFontCursor (display->dpy, XC_right_side); - display->resize_cursor[CORNER_COUNT + SIDE_TOP] = - XCreateFontCursor (display->dpy, XC_top_side); - display->resize_cursor[CORNER_COUNT + SIDE_BOTTOM] = - XCreateFontCursor (display->dpy, XC_bottom_side); + myDisplayCreateCursor (display); myDisplayCreateTimestampWin (display); @@ -359,14 +338,7 @@ myDisplayInit (GdkDisplay *gdisplay) DisplayInfo * myDisplayClose (DisplayInfo *display) { - int i; - - XFreeCursor (display->dpy, display->busy_cursor); - display->busy_cursor = None; - XFreeCursor (display->dpy, display->move_cursor); - display->move_cursor = None; - XFreeCursor (display->dpy, display->root_cursor); - display->root_cursor = None; + myDisplayFreeCursor (display); XDestroyWindow (display->dpy, display->timestamp_win); display->timestamp_win = None; @@ -376,12 +348,6 @@ myDisplayClose (DisplayInfo *display) display->hostname = NULL; } - for (i = 0; i < SIDE_COUNT + CORNER_COUNT; i++) - { - XFreeCursor (display->dpy, display->resize_cursor[i]); - display->resize_cursor[i] = None; - } - g_slist_free (display->clients); display->clients = NULL; @@ -415,6 +381,52 @@ myDisplayHaveRender (DisplayInfo *display) return (display->have_render); } +void +myDisplayCreateCursor (DisplayInfo *display) +{ + display->root_cursor = + XCreateFontCursor (display->dpy, CURSOR_ROOT); + display->move_cursor = + XCreateFontCursor (display->dpy, CURSOR_MOVE); + display->busy_cursor = + cursorCreateSpinning (display->dpy); + display->resize_cursor[CORNER_TOP_LEFT] = + XCreateFontCursor (display->dpy, XC_top_left_corner); + display->resize_cursor[CORNER_TOP_RIGHT] = + XCreateFontCursor (display->dpy, XC_top_right_corner); + display->resize_cursor[CORNER_BOTTOM_LEFT] = + XCreateFontCursor (display->dpy, XC_bottom_left_corner); + display->resize_cursor[CORNER_BOTTOM_RIGHT] = + XCreateFontCursor (display->dpy, XC_bottom_right_corner); + display->resize_cursor[CORNER_COUNT + SIDE_LEFT] = + XCreateFontCursor (display->dpy, XC_left_side); + display->resize_cursor[CORNER_COUNT + SIDE_RIGHT] = + XCreateFontCursor (display->dpy, XC_right_side); + display->resize_cursor[CORNER_COUNT + SIDE_TOP] = + XCreateFontCursor (display->dpy, XC_top_side); + display->resize_cursor[CORNER_COUNT + SIDE_BOTTOM] = + XCreateFontCursor (display->dpy, XC_bottom_side); +} + +void +myDisplayFreeCursor (DisplayInfo *display) +{ + int i; + + XFreeCursor (display->dpy, display->busy_cursor); + display->busy_cursor = None; + XFreeCursor (display->dpy, display->move_cursor); + display->move_cursor = None; + XFreeCursor (display->dpy, display->root_cursor); + display->root_cursor = None; + + for (i = 0; i < SIDE_COUNT + CORNER_COUNT; i++) + { + XFreeCursor (display->dpy, display->resize_cursor[i]); + display->resize_cursor[i] = None; + } +} + Cursor myDisplayGetCursorBusy (DisplayInfo *display) { diff --git a/src/display.h b/src/display.h index 6bf7094..bfa8314 100644 --- a/src/display.h +++ b/src/display.h @@ -363,6 +363,8 @@ DisplayInfo *myDisplayClose (DisplayInfo *); gboolean myDisplayHaveShape (DisplayInfo *); gboolean myDisplayHaveShapeInput (DisplayInfo *); gboolean myDisplayHaveRender (DisplayInfo *); +void myDisplayCreateCursor (DisplayInfo *); +void myDisplayFreeCursor (DisplayInfo *); Cursor myDisplayGetCursorBusy (DisplayInfo *); Cursor myDisplayGetCursorMove (DisplayInfo *); Cursor myDisplayGetCursorRoot (DisplayInfo *); diff --git a/src/events.c b/src/events.c index c6f9d82..eab9f9f 100644 --- a/src/events.c +++ b/src/events.c @@ -63,6 +63,7 @@ #include "events.h" #include "event_filter.h" #include "xsync.h" +#include "display.h" #ifndef CHECK_BUTTON_TIME #define CHECK_BUTTON_TIME 0 @@ -2746,6 +2747,21 @@ double_click_distance_cb (GObject * obj, GdkEvent * ev, gpointer data) return (TRUE); } +static void +cursor_theme_cb (GObject * obj, GParamSpec * pspec, gpointer data) +{ + ScreenInfo * screen; + DisplayInfo * display; + + screen = (ScreenInfo *) data; + display = screen->display_info; + + myDisplayFreeCursor (display); + myDisplayCreateCursor (display); + + XDefineCursor (display->dpy, screen->xroot, display->root_cursor); +} + static gboolean client_event_cb (GtkWidget * widget, GdkEventClient * ev, gpointer data) { @@ -2908,6 +2924,10 @@ initGtkCallbacks (ScreenInfo *screen_info) G_CALLBACK (double_click_time_cb), (gpointer) (screen_info->display_info)); g_signal_connect (settings, "notify::gtk-double-click-distance", G_CALLBACK (double_click_distance_cb), (gpointer) (screen_info->display_info)); + g_signal_connect (settings, "notify::gtk-cursor-theme-name", + G_CALLBACK (cursor_theme_cb), (gpointer) (screen_info)); + g_signal_connect (settings, "notify::gtk-cursor-theme-size", + G_CALLBACK (cursor_theme_cb), (gpointer) (screen_info)); g_signal_connect_after (settings, "notify::gtk-xft-antialias", G_CALLBACK (refresh_font_cb), (gpointer) (screen_info)); g_signal_connect_after (settings, "notify::gtk-xft-dpi", -- 1.7.6.3