mirror of
https://github.com/brl/mutter.git
synced 2024-11-21 23:50:41 -05:00
core: Make frame handle per-pointer cursors.
This commit is contained in:
parent
2507d20bb7
commit
53bd0c70c9
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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->is_flashing = FALSE;
|
frame->is_flashing = FALSE;
|
||||||
@ -228,9 +229,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);
|
||||||
@ -402,22 +404,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
|
||||||
|
@ -34,7 +34,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
|
||||||
@ -76,7 +76,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
|
||||||
|
@ -734,10 +734,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);
|
||||||
|
|
||||||
@ -1848,8 +1856,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);
|
||||||
@ -1915,6 +1925,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)
|
||||||
|
Loading…
Reference in New Issue
Block a user