core: Make frame handle per-pointer cursors.

This commit is contained in:
Carlos Garnacho 2011-07-04 19:24:04 +02:00
parent 95b2e6fafc
commit 855095ad1a
5 changed files with 52 additions and 26 deletions

View File

@ -757,13 +757,24 @@ meta_core_grab_buttons (Display *xdisplay,
} }
void void
meta_core_set_screen_cursor (Display *xdisplay, meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen, Window frame_on_screen,
MetaCursor cursor) gint device_id,
MetaCursor cursor)
{ {
MetaWindow *window = get_window (xdisplay, frame_on_screen); MetaWindow *window = get_window (xdisplay, frame_on_screen);
MetaDevice *pointer;
meta_frame_set_screen_cursor (window->frame, cursor); pointer = meta_device_map_lookup (window->display->device_map,
device_id);
if (pointer == NULL)
return;
if (!META_IS_DEVICE_POINTER (pointer))
pointer = meta_device_get_paired_device (pointer);
meta_frame_set_screen_cursor (window->frame, pointer, cursor);
} }
void void

View File

@ -200,9 +200,10 @@ Window meta_core_get_frame (Display *xdisplay,
void meta_core_grab_buttons (Display *xdisplay, void meta_core_grab_buttons (Display *xdisplay,
Window frame_xwindow); Window frame_xwindow);
void meta_core_set_screen_cursor (Display *xdisplay, void meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen, Window frame_on_screen,
MetaCursor cursor); int device_id,
MetaCursor cursor);
void meta_core_select_events (Display *xdisplay, void meta_core_select_events (Display *xdisplay,
Window xwindow, Window xwindow,

View File

@ -28,6 +28,7 @@
#include "bell.h" #include "bell.h"
#include <meta/errors.h> #include <meta/errors.h>
#include "keybindings-private.h" #include "keybindings-private.h"
#include "device-pointer.h"
#include <X11/extensions/Xrender.h> #include <X11/extensions/Xrender.h>
@ -64,7 +65,7 @@ meta_window_ensure_frame (MetaWindow *window)
frame->child_y = 0; frame->child_y = 0;
frame->bottom_height = 0; frame->bottom_height = 0;
frame->right_width = 0; frame->right_width = 0;
frame->current_cursor = 0; frame->cursors = g_hash_table_new (NULL, NULL);
frame->mapped = FALSE; frame->mapped = FALSE;
frame->need_reapply_frame_shape = TRUE; frame->need_reapply_frame_shape = TRUE;
@ -229,9 +230,10 @@ meta_window_destroy_frame (MetaWindow *window)
/* Move keybindings to window instead of frame */ /* Move keybindings to window instead of frame */
meta_window_grab_keys (window); meta_window_grab_keys (window);
g_hash_table_destroy (frame->cursors);
g_free (frame); g_free (frame);
/* Put our state back where it should be */ /* Put our state back where it should be */
meta_window_queue (window, META_QUEUE_CALC_SHOWING); meta_window_queue (window, META_QUEUE_CALC_SHOWING);
meta_window_queue (window, META_QUEUE_MOVE_RESIZE); meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
@ -425,22 +427,22 @@ meta_frame_queue_draw (MetaFrame *frame)
} }
void void
meta_frame_set_screen_cursor (MetaFrame *frame, meta_frame_set_screen_cursor (MetaFrame *frame,
MetaCursor cursor) MetaDevice *pointer,
MetaCursor cursor)
{ {
Cursor xcursor; MetaCursor old_cursor;
if (cursor == frame->current_cursor)
old_cursor = GPOINTER_TO_UINT (g_hash_table_lookup (frame->cursors, pointer));
if (cursor == old_cursor)
return; return;
frame->current_cursor = cursor;
if (cursor == META_CURSOR_DEFAULT) g_hash_table_insert (frame->cursors, pointer,
XUndefineCursor (frame->window->display->xdisplay, frame->xwindow); GUINT_TO_POINTER (cursor));
else meta_device_pointer_set_window_cursor (META_DEVICE_POINTER (pointer),
{ frame->xwindow, cursor);
xcursor = meta_display_create_x_cursor (frame->window->display, cursor); XFlush (frame->window->display->xdisplay);
XDefineCursor (frame->window->display->xdisplay, frame->xwindow, xcursor);
XFlush (frame->window->display->xdisplay);
XFreeCursor (frame->window->display->xdisplay, xcursor);
}
} }
Window Window

View File

@ -45,7 +45,7 @@ struct _MetaFrame
/* reparent window */ /* reparent window */
Window xwindow; Window xwindow;
MetaCursor current_cursor; GHashTable *cursors;
/* This rect is trusted info from where we put the /* This rect is trusted info from where we put the
* frame, not the result of ConfigureNotify * frame, not the result of ConfigureNotify
@ -80,7 +80,8 @@ gboolean meta_frame_sync_to_window (MetaFrame *frame,
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame); cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
void meta_frame_set_screen_cursor (MetaFrame *frame, void meta_frame_set_screen_cursor (MetaFrame *frame,
MetaDevice *pointer,
MetaCursor cursor); MetaCursor cursor);
#endif #endif

View File

@ -725,10 +725,18 @@ meta_frames_unmanage_window (MetaFrames *frames,
*/ */
invalidate_all_caches (frames); invalidate_all_caches (frames);
#if 0
/* This function is only called when destroying the frame
* in core/frame.c, ideally this should be done for every
* device with a cursor on the frame, but in practical
* effects it doesn't matter.
*/
/* restore the cursor */ /* restore the cursor */
meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
frame->xwindow, frame->xwindow,
META_CURSOR_DEFAULT); META_CURSOR_DEFAULT);
#endif
gdk_window_set_user_data (frame->window, NULL); gdk_window_set_user_data (frame->window, NULL);
@ -1971,8 +1979,10 @@ meta_frames_update_prelit_control (MetaFrames *frames,
MetaFrameControl control) MetaFrameControl control)
{ {
MetaFrameControl old_control; MetaFrameControl old_control;
GdkDevice *device;
MetaCursor cursor; MetaCursor cursor;
device = gtk_get_current_event_device ();
meta_verbose ("Updating prelit control from %u to %u\n", meta_verbose ("Updating prelit control from %u to %u\n",
frame->prelit_control, control); frame->prelit_control, control);
@ -2038,6 +2048,7 @@ meta_frames_update_prelit_control (MetaFrames *frames,
/* set/unset the prelight cursor */ /* set/unset the prelight cursor */
meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), meta_core_set_screen_cursor (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
frame->xwindow, frame->xwindow,
gdk_x11_device_get_id (device),
cursor); cursor);
switch (control) switch (control)