From 0f9bdb18f51fa25a85d790f121920df51e0f652e Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 23 Aug 2002 18:00:40 +0000 Subject: [PATCH] Place cursors on frames, not root --- src/core.c | 2 +- src/display.c | 5 ++++- src/frame.c | 19 +++++++++++++++++++ src/frame.h | 4 ++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/core.c b/src/core.c index e61eb3840..abcaf9d8c 100644 --- a/src/core.c +++ b/src/core.c @@ -632,7 +632,7 @@ meta_core_set_screen_cursor (Display *xdisplay, if (window == NULL || window->frame == NULL) meta_bug ("No such frame window 0x%lx!\n", frame_on_screen); - meta_screen_set_cursor (window->screen, cursor); + meta_frame_set_screen_cursor (window->frame, cursor); } void diff --git a/src/display.c b/src/display.c index 7715aeb03..ea2508e50 100644 --- a/src/display.c +++ b/src/display.c @@ -2247,6 +2247,8 @@ xcursor_for_op (MetaDisplay *display, break; } + if (cursor == META_CURSOR_DEFAULT) + return None; return meta_display_create_x_cursor (display, cursor); } @@ -2305,7 +2307,8 @@ meta_display_set_grab_op_cursor (MetaDisplay *display, } #undef GRAB_MASK - XFreeCursor (display->xdisplay, cursor); + if (cursor != None) + XFreeCursor (display->xdisplay, cursor); } gboolean diff --git a/src/frame.c b/src/frame.c index 06e14f1fb..dbca89376 100644 --- a/src/frame.c +++ b/src/frame.c @@ -54,6 +54,7 @@ meta_window_ensure_frame (MetaWindow *window) frame->child_y = 0; frame->bottom_height = 0; frame->right_width = 0; + frame->current_cursor = 0; frame->mapped = FALSE; @@ -351,3 +352,21 @@ meta_frame_queue_draw (MetaFrame *frame) meta_ui_queue_frame_draw (frame->window->screen->ui, frame->xwindow); } + +void meta_frame_set_screen_cursor (MetaFrame *frame, + MetaCursor cursor) +{ + Cursor xcursor; + if (cursor == frame->current_cursor) + return; + frame->current_cursor = cursor; + if (cursor == META_CURSOR_DEFAULT) + XUndefineCursor (frame->window->display->xdisplay, frame->xwindow); + else + { + xcursor = meta_display_create_x_cursor (frame->window->display, cursor); + XDefineCursor (frame->window->display->xdisplay, frame->xwindow, xcursor); + XFreeCursor (frame->window->display->xdisplay, xcursor); + } +} + diff --git a/src/frame.h b/src/frame.h index 6447763f2..20f946999 100644 --- a/src/frame.h +++ b/src/frame.h @@ -43,6 +43,8 @@ struct _MetaFrame /* reparent window */ Window xwindow; + MetaCursor current_cursor; + /* This rect is trusted info from where we put the * frame, not the result of ConfigureNotify */ @@ -71,6 +73,8 @@ void meta_frame_sync_to_window (MetaFrame *frame, gboolean need_move, gboolean need_resize); +void meta_frame_set_screen_cursor (MetaFrame *frame, + MetaCursor cursor); #endif