diff --git a/ChangeLog b/ChangeLog index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 64097ce0b6..c4b8d2bafa 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,51 @@ +2001-01-17 + + * gdk/linux-fb/gdkdrawable-fb2.c (gdk_shadow_fb_draw_arc): + Doh! Mixed up x and y. + + * gdk/linux-fb/gdkglobals-fb.c: + Removed gdk_fb_pointer_grab_window_events, + added _gdk_fb_pointer_grab_owner_events and + _gdk_fb_keyboard_grab_owner_events. + + * gdk/linux-fb/gdkmain-fb.c (gdk_fb_pointer_grab): + Set all button mask if GDK_BUTTON_MOTION_MASK set. Send + crossing events before grabbing. Set _gdk_fb_pointer_grab_owner_events. + (gdk_fb_pointer_ungrab): Unset _gdk_fb_pointer_grab_owner_events + Send crossing events after ungrab finished. + (gdk_keyboard_grab): Set ..._owner_events + (type_masks): Move out of function. + (gdk_fb_other_event_window, gdk_fb_pointer_event_window, + gdk_fb_keyboard_event_window): New functions, return the + window an event should be targeted at. Handles grabs and + event propagation. Can return NULL. + (gdk_event_make): Remove event_mask checking. Now always + returns an event. + + * gdk/linux-fb/gdkkeyboard-fb.c: + * gdk/linux-fb/gdkproperty-fb.c: + * gdk/linux-fb/gdkselection-fb.c: + Use new event_window/gdk_event_make() behaviour. + + * gdk/linux-fb/gdkmouse-fb.c: + Use new event_window/gdk_event_make() behaviour. + Only send motion events if in the same window. + If grabbed, use cursor from window if sibling of grabbed + window, and cursor from grabbed window otherwise. + + * gdk/linux-fb/gdkprivate-fb.h: + Update gdk_fb_window_send_crossing_events, gdk_event_make + and grab varaible declarations. Add gdk_fb_*_event_window(). + + * gdk/linux-fb/gdkwindow-fb.c: + Use new event_window/gdk_event_make() behaviour. + Keep correct track of focus window. + (gdk_window_set_events): Set all specific button motion masks + if GDK_BUTTON_MOTION_MASK set. + + * gtk/gtkdnd.c (gtk_drag_update): + Free info->last_event if gdk_drag_motion returned FALSE. + Tue Jan 16 13:13:13 GMT 2001 Tony Gale * docs/faq/gtk-faq.sgml: FAQ update: diff --git a/gdk/linux-fb/gdkdrawable-fb2.c b/gdk/linux-fb/gdkdrawable-fb2.c index ba6387e8f0..0d476779a7 100644 --- a/gdk/linux-fb/gdkdrawable-fb2.c +++ b/gdk/linux-fb/gdkdrawable-fb2.c @@ -1249,9 +1249,9 @@ gdk_shadow_fb_draw_arc (GdkDrawable *drawable, gint extra_width; minx = x + private->abs_x; - miny = x + private->abs_y; + miny = y + private->abs_y; maxx = x + width + private->abs_x; - maxy = y + height + private->abs_x; + maxy = y + height + private->abs_y; if (!filled) { diff --git a/gdk/linux-fb/gdkglobals-fb.c b/gdk/linux-fb/gdkglobals-fb.c index cab2c87383..a48852f309 100644 --- a/gdk/linux-fb/gdkglobals-fb.c +++ b/gdk/linux-fb/gdkglobals-fb.c @@ -33,7 +33,9 @@ const gchar *gdk_progclass = "none"; gboolean gdk_null_window_warnings = TRUE; -GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL; +GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL; +gboolean _gdk_fb_pointer_grab_owner_events; +gboolean _gdk_fb_keyboard_grab_owner_events; GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events; GdkFBWindow *gdk_root_window = NULL; diff --git a/gdk/linux-fb/gdkkeyboard-fb.c b/gdk/linux-fb/gdkkeyboard-fb.c index 812694701a..7b1eb00dd0 100644 --- a/gdk/linux-fb/gdkkeyboard-fb.c +++ b/gdk/linux-fb/gdkkeyboard-fb.c @@ -371,12 +371,14 @@ gdk_fb_handle_key (guint hw_keycode, gdk_fb_redraw_all (); } - win = gdk_fb_window_find_focus (); - event = gdk_event_make (win, - key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS, - TRUE); - if (event) + win = gdk_fb_keyboard_event_window (gdk_fb_window_find_focus (), + key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS); + if (win) { + event = gdk_event_make (win, + key_up ? GDK_KEY_RELEASE : GDK_KEY_PRESS, + TRUE); + event->key.state = modifier_state; event->key.keyval = keyval; event->key.string = string; diff --git a/gdk/linux-fb/gdkmain-fb.c b/gdk/linux-fb/gdkmain-fb.c index 63f914feb7..a25618ac2a 100644 --- a/gdk/linux-fb/gdkmain-fb.c +++ b/gdk/linux-fb/gdkmain-fb.c @@ -743,21 +743,30 @@ gdk_fb_pointer_grab (GdkWindow * window, gdk_pointer_ungrab (time); } + gdk_fb_window_send_crossing_events (NULL, + window, + GDK_CROSSING_GRAB); + + if (event_mask & GDK_BUTTON_MOTION_MASK) + event_mask |= + GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON2_MOTION_MASK | + GDK_BUTTON3_MOTION_MASK; + _gdk_fb_pointer_implicit_grab = implicit_grab; _gdk_fb_pointer_grab_window = gdk_window_ref (window); - _gdk_fb_pointer_grab_window_events = owner_events ? NULL : _gdk_fb_pointer_grab_window; + _gdk_fb_pointer_grab_owner_events = owner_events; _gdk_fb_pointer_grab_confine = confine_to ? gdk_window_ref (confine_to) : NULL; _gdk_fb_pointer_grab_events = event_mask; _gdk_fb_pointer_grab_cursor = cursor ? gdk_cursor_ref (cursor) : NULL; + + if (cursor) gdk_fb_cursor_reset (); - gdk_fb_window_send_crossing_events (window, - GDK_CROSSING_GRAB); - return GDK_GRAB_SUCCESS; } @@ -787,6 +796,7 @@ gdk_fb_pointer_ungrab (guint32 time, gboolean implicit_grab) { gboolean have_grab_cursor = _gdk_fb_pointer_grab_cursor && 1; GdkWindow *mousewin; + GdkWindow *old_grab_window; if (!_gdk_fb_pointer_grab_window) return; @@ -805,16 +815,19 @@ gdk_fb_pointer_ungrab (guint32 time, gboolean implicit_grab) if (have_grab_cursor) gdk_fb_cursor_reset (); - mousewin = gdk_window_at_pointer (NULL, NULL); - gdk_fb_window_send_crossing_events (mousewin, - GDK_CROSSING_UNGRAB); + old_grab_window = _gdk_fb_pointer_grab_window; - if (_gdk_fb_pointer_grab_window) - gdk_window_unref (_gdk_fb_pointer_grab_window); _gdk_fb_pointer_grab_window = NULL; - _gdk_fb_pointer_grab_window_events = NULL; _gdk_fb_pointer_implicit_grab = FALSE; + + mousewin = gdk_window_at_pointer (NULL, NULL); + gdk_fb_window_send_crossing_events (old_grab_window, + mousewin, + GDK_CROSSING_UNGRAB); + + if (old_grab_window) + gdk_window_unref (old_grab_window); } /* @@ -869,8 +882,8 @@ gdk_keyboard_grab (GdkWindow * window, if (_gdk_fb_pointer_grab_window) gdk_keyboard_ungrab (time); - if (!owner_events) - _gdk_fb_keyboard_grab_window = gdk_window_ref (window); + _gdk_fb_keyboard_grab_window = gdk_window_ref (window); + _gdk_fb_keyboard_grab_owner_events = owner_events; return GDK_GRAB_SUCCESS; } @@ -1074,148 +1087,257 @@ gdk_beep (void) } /* utils */ +static const guint type_masks[] = { + GDK_SUBSTRUCTURE_MASK, /* GDK_DELETE = 0, */ + GDK_STRUCTURE_MASK, /* GDK_DESTROY = 1, */ + GDK_EXPOSURE_MASK, /* GDK_EXPOSE = 2, */ + GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY = 3, */ + GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS = 4, */ + GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS = 5, */ + GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS = 6, */ + GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE = 7, */ + GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS = 8, */ + GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE = 9, */ + GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY = 10, */ + GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY = 11, */ + GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE = 12, */ + GDK_STRUCTURE_MASK, /* GDK_CONFIGURE = 13, */ + GDK_VISIBILITY_NOTIFY_MASK, /* GDK_MAP = 14, */ + GDK_VISIBILITY_NOTIFY_MASK, /* GDK_UNMAP = 15, */ + GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY = 16, */ + GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR = 17, */ + GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */ + GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY = 19, */ + GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN = 20, */ + GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT = 21, */ + GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER = 22, */ + GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE = 23, */ + GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION = 24, */ + GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS = 25, */ + GDK_ALL_EVENTS_MASK, /* GDK_DROP_START = 26, */ + GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED = 27, */ + GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT = 28, */ + GDK_VISIBILITY_NOTIFY_MASK, /* GDK_VISIBILITY_NOTIFY = 29, */ + GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE = 30, */ + GDK_SCROLL_MASK /* GDK_SCROLL = 31 */ +}; + +GdkWindow * +gdk_fb_other_event_window (GdkWindow *window, + GdkEventType type) +{ + guint32 evmask; + GdkWindow *w; + + w = window; + while (w != gdk_parent_root) + { + /* Huge hack, so that we don't propagate events to GtkWindow->frame */ + if ((w != window) && + (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) && + (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler"))) + break; + + evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask; + + if (evmask & type_masks[type]) + return w; + + w = gdk_window_get_parent (w); + } + + return NULL; +} + +GdkWindow * +gdk_fb_pointer_event_window (GdkWindow *window, + GdkEventType type) +{ + guint evmask; + GdkModifierType mask; + GdkWindow *w; + + gdk_fb_mouse_get_info (NULL, NULL, &mask); + + if (_gdk_fb_pointer_grab_window && + !_gdk_fb_pointer_grab_owner_events) + { + evmask = _gdk_fb_pointer_grab_events; + + if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) + { + if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) || + ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) || + ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK))) + evmask |= GDK_POINTER_MOTION_MASK; + } + + if (evmask & type_masks[type]) + return _gdk_fb_pointer_grab_window; + else + return NULL; + } + + w = window; + while (w != gdk_parent_root) + { + /* Huge hack, so that we don't propagate events to GtkWindow->frame */ + if ((w != window) && + (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) && + (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler"))) + break; + + evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask; + + if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) + { + if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) || + ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) || + ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK))) + evmask |= GDK_POINTER_MOTION_MASK; + } + + if (evmask & type_masks[type]) + return w; + + w = gdk_window_get_parent (w); + } + + if (_gdk_fb_pointer_grab_window && + _gdk_fb_pointer_grab_owner_events) + { + evmask = _gdk_fb_pointer_grab_events; + + if (evmask & (GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK)) + { + if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) || + ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) || + ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK))) + evmask |= GDK_POINTER_MOTION_MASK; + } + + if (evmask & type_masks[type]) + return _gdk_fb_pointer_grab_window; + } + + return NULL; +} + +GdkWindow * +gdk_fb_keyboard_event_window (GdkWindow *window, + GdkEventType type) +{ + guint32 evmask; + GdkWindow *w; + + if (_gdk_fb_keyboard_grab_window && + !_gdk_fb_keyboard_grab_owner_events) + { + return _gdk_fb_keyboard_grab_window; + } + + w = window; + while (w != gdk_parent_root) + { + /* Huge hack, so that we don't propagate events to GtkWindow->frame */ + if ((w != window) && + (GDK_WINDOW_P (w)->window_type != GDK_WINDOW_CHILD) && + (g_object_get_data (G_OBJECT (w), "gdk-window-child-handler"))) + break; + + evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask; + + if (evmask & type_masks[type]) + return w; + + w = gdk_window_get_parent (w); + } + + if (_gdk_fb_keyboard_grab_window && + _gdk_fb_keyboard_grab_owner_events) + { + return _gdk_fb_keyboard_grab_window; + } + + return NULL; +} + GdkEvent * gdk_event_make (GdkWindow *window, GdkEventType type, gboolean append_to_queue) { - static const guint type_masks[] = { - GDK_SUBSTRUCTURE_MASK, /* GDK_DELETE = 0, */ - GDK_STRUCTURE_MASK, /* GDK_DESTROY = 1, */ - GDK_EXPOSURE_MASK, /* GDK_EXPOSE = 2, */ - GDK_POINTER_MOTION_MASK, /* GDK_MOTION_NOTIFY = 3, */ - GDK_BUTTON_PRESS_MASK, /* GDK_BUTTON_PRESS = 4, */ - GDK_BUTTON_PRESS_MASK, /* GDK_2BUTTON_PRESS = 5, */ - GDK_BUTTON_PRESS_MASK, /* GDK_3BUTTON_PRESS = 6, */ - GDK_BUTTON_RELEASE_MASK, /* GDK_BUTTON_RELEASE = 7, */ - GDK_KEY_PRESS_MASK, /* GDK_KEY_PRESS = 8, */ - GDK_KEY_RELEASE_MASK, /* GDK_KEY_RELEASE = 9, */ - GDK_ENTER_NOTIFY_MASK, /* GDK_ENTER_NOTIFY = 10, */ - GDK_LEAVE_NOTIFY_MASK, /* GDK_LEAVE_NOTIFY = 11, */ - GDK_FOCUS_CHANGE_MASK, /* GDK_FOCUS_CHANGE = 12, */ - GDK_STRUCTURE_MASK, /* GDK_CONFIGURE = 13, */ - GDK_VISIBILITY_NOTIFY_MASK, /* GDK_MAP = 14, */ - GDK_VISIBILITY_NOTIFY_MASK, /* GDK_UNMAP = 15, */ - GDK_PROPERTY_CHANGE_MASK, /* GDK_PROPERTY_NOTIFY = 16, */ - GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_CLEAR = 17, */ - GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_REQUEST = 18, */ - GDK_PROPERTY_CHANGE_MASK, /* GDK_SELECTION_NOTIFY = 19, */ - GDK_PROXIMITY_IN_MASK, /* GDK_PROXIMITY_IN = 20, */ - GDK_PROXIMITY_OUT_MASK, /* GDK_PROXIMITY_OUT = 21, */ - GDK_ALL_EVENTS_MASK, /* GDK_DRAG_ENTER = 22, */ - GDK_ALL_EVENTS_MASK, /* GDK_DRAG_LEAVE = 23, */ - GDK_ALL_EVENTS_MASK, /* GDK_DRAG_MOTION = 24, */ - GDK_ALL_EVENTS_MASK, /* GDK_DRAG_STATUS = 25, */ - GDK_ALL_EVENTS_MASK, /* GDK_DROP_START = 26, */ - GDK_ALL_EVENTS_MASK, /* GDK_DROP_FINISHED = 27, */ - GDK_ALL_EVENTS_MASK, /* GDK_CLIENT_EVENT = 28, */ - GDK_VISIBILITY_NOTIFY_MASK, /* GDK_VISIBILITY_NOTIFY = 29, */ - GDK_EXPOSURE_MASK, /* GDK_NO_EXPOSE = 30, */ - GDK_SCROLL_MASK /* GDK_SCROLL = 31 */ - }; - guint evmask; - - evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask; - - /* Bad hack to make sure that things work semi-properly with owner_events */ - if (_gdk_fb_pointer_grab_window) - evmask |= _gdk_fb_pointer_grab_events; - if (_gdk_fb_keyboard_grab_window) - evmask |= _gdk_fb_keyboard_grab_events; - - if (evmask & GDK_BUTTON_MOTION_MASK) + GdkEvent *event = gdk_event_new (); + guint32 the_time; + + the_time = gdk_fb_get_time (); + + event->any.type = type; + event->any.window = gdk_window_ref (window); + event->any.send_event = FALSE; + switch (type) { - evmask |= GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK; + case GDK_MOTION_NOTIFY: + event->motion.time = the_time; + event->motion.axes = NULL; + break; + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + event->button.time = the_time; + event->button.axes = NULL; + break; + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + event->key.time = the_time; + break; + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + event->crossing.time = the_time; + break; + + case GDK_PROPERTY_NOTIFY: + event->property.time = the_time; + break; + + case GDK_SELECTION_CLEAR: + case GDK_SELECTION_REQUEST: + case GDK_SELECTION_NOTIFY: + event->selection.time = the_time; + break; + case GDK_PROXIMITY_IN: + case GDK_PROXIMITY_OUT: + event->proximity.time = the_time; + break; + case GDK_DRAG_ENTER: + case GDK_DRAG_LEAVE: + case GDK_DRAG_MOTION: + case GDK_DRAG_STATUS: + case GDK_DROP_START: + case GDK_DROP_FINISHED: + event->dnd.time = the_time; + break; + + case GDK_FOCUS_CHANGE: + case GDK_CONFIGURE: + case GDK_MAP: + case GDK_UNMAP: + case GDK_CLIENT_EVENT: + case GDK_VISIBILITY_NOTIFY: + case GDK_NO_EXPOSE: + case GDK_SCROLL: + case GDK_DELETE: + case GDK_DESTROY: + case GDK_EXPOSE: + default: + break; } - - if (evmask & (GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK)) - { - GdkModifierType mask; - - gdk_fb_mouse_get_info (NULL, NULL, &mask); - - if (((mask & GDK_BUTTON1_MASK) && (evmask & GDK_BUTTON1_MOTION_MASK)) || - ((mask & GDK_BUTTON2_MASK) && (evmask & GDK_BUTTON2_MOTION_MASK)) || - ((mask & GDK_BUTTON3_MASK) && (evmask & GDK_BUTTON3_MOTION_MASK))) - evmask |= GDK_POINTER_MOTION_MASK; - } - - if (evmask & type_masks[type]) - { - GdkEvent *event = gdk_event_new (); - guint32 the_time; - - the_time = gdk_fb_get_time (); - - event->any.type = type; - event->any.window = gdk_window_ref (window); - event->any.send_event = FALSE; - switch (type) - { - case GDK_MOTION_NOTIFY: - event->motion.time = the_time; - event->motion.axes = NULL; - break; - case GDK_BUTTON_PRESS: - case GDK_2BUTTON_PRESS: - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - event->button.time = the_time; - event->button.axes = NULL; - break; - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - event->key.time = the_time; - break; - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - event->crossing.time = the_time; - break; - - case GDK_PROPERTY_NOTIFY: - event->property.time = the_time; - break; - - case GDK_SELECTION_CLEAR: - case GDK_SELECTION_REQUEST: - case GDK_SELECTION_NOTIFY: - event->selection.time = the_time; - break; - case GDK_PROXIMITY_IN: - case GDK_PROXIMITY_OUT: - event->proximity.time = the_time; - break; - case GDK_DRAG_ENTER: - case GDK_DRAG_LEAVE: - case GDK_DRAG_MOTION: - case GDK_DRAG_STATUS: - case GDK_DROP_START: - case GDK_DROP_FINISHED: - event->dnd.time = the_time; - break; - - case GDK_FOCUS_CHANGE: - case GDK_CONFIGURE: - case GDK_MAP: - case GDK_UNMAP: - case GDK_CLIENT_EVENT: - case GDK_VISIBILITY_NOTIFY: - case GDK_NO_EXPOSE: - case GDK_SCROLL: - case GDK_DELETE: - case GDK_DESTROY: - case GDK_EXPOSE: - default: - break; - } - - if (append_to_queue) - gdk_event_queue_append (event); - - return event; - } - - return NULL; + + if (append_to_queue) + gdk_event_queue_append (event); + + return event; } void diff --git a/gdk/linux-fb/gdkmouse-fb.c b/gdk/linux-fb/gdkmouse-fb.c index b4908f45d3..5e6fc3de5c 100644 --- a/gdk/linux-fb/gdkmouse-fb.c +++ b/gdk/linux-fb/gdkmouse-fb.c @@ -73,10 +73,12 @@ handle_mouse_movement(GdkFBMouse *mouse) GdkWindow *mousewin; GdkEvent *event; gint x, y; - GdkWindow *win, *grabwin; + GdkWindow *old_win, *win, *event_win, *cursor_win; guint state; GdkDrawableFBData *mousewin_private; + old_win = gdk_window_at_pointer (NULL, NULL); + if (_gdk_fb_pointer_grab_confine) mousewin = _gdk_fb_pointer_grab_confine; else @@ -95,25 +97,42 @@ handle_mouse_movement(GdkFBMouse *mouse) mouse->y = mousewin_private->lim_y - 1; win = gdk_window_at_pointer (NULL, NULL); - if (_gdk_fb_pointer_grab_window_events) - grabwin = _gdk_fb_pointer_grab_window_events; - else - grabwin = win; - - gdk_fb_cursor_move (mouse->x, mouse->y, grabwin); - - gdk_window_get_origin (grabwin, &x, &y); - x = mouse->x - x; - y = mouse->y - y; - state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) | - (mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) | - (mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) | - gdk_fb_keyboard_modifiers (); - - event = gdk_event_make (grabwin, GDK_MOTION_NOTIFY, TRUE); - if (event) + cursor_win = win; + if (_gdk_fb_pointer_grab_window) { + GdkWindow *w; + + cursor_win = _gdk_fb_pointer_grab_window; + w = win; + while (w != gdk_parent_root) + { + if (w == _gdk_fb_pointer_grab_window) + { + cursor_win = win; + break; + } + w = gdk_window_get_parent (w); + } + } + + gdk_fb_cursor_move (mouse->x, mouse->y, cursor_win); + + event_win = gdk_fb_pointer_event_window (win, GDK_MOTION_NOTIFY); + + if (event_win && (win == old_win)) + { + /* Only send motion events in the same window */ + gdk_window_get_origin (event_win, &x, &y); + x = mouse->x - x; + y = mouse->y - y; + + state = (mouse->button_pressed[0]?GDK_BUTTON1_MASK:0) | + (mouse->button_pressed[1]?GDK_BUTTON2_MASK:0) | + (mouse->button_pressed[2]?GDK_BUTTON3_MASK:0) | + gdk_fb_keyboard_modifiers (); + + event = gdk_event_make (event_win, GDK_MOTION_NOTIFY, TRUE); event->motion.x = x; event->motion.y = y; event->motion.state = state; @@ -122,8 +141,8 @@ handle_mouse_movement(GdkFBMouse *mouse) event->motion.x_root = mouse->x; event->motion.y_root = mouse->y; } - - gdk_fb_window_send_crossing_events (win, GDK_CROSSING_NORMAL); + + gdk_fb_window_send_crossing_events (NULL, win, GDK_CROSSING_NORMAL); } static void @@ -133,19 +152,20 @@ send_button_event (GdkFBMouse *mouse, { GdkEvent *event; gint x, y, i; - GdkWindow *window; + GdkWindow *mouse_win; + GdkWindow *event_win; int nbuttons; - if (_gdk_fb_pointer_grab_window_events) - window = _gdk_fb_pointer_grab_window_events; - else - window = gdk_window_at_pointer(NULL, NULL); - - event = gdk_event_make (window, press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE, FALSE); - - if (event) + + mouse_win = gdk_window_at_pointer(NULL, NULL); + event_win = gdk_fb_pointer_event_window (mouse_win, + press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE); + + if (event_win) { - gdk_window_get_origin (window, &x, &y); + event = gdk_event_make (event_win, press_event ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE, FALSE); + + gdk_window_get_origin (event_win, &x, &y); x = mouse->x - x; y = mouse->y - y; @@ -176,8 +196,8 @@ send_button_event (GdkFBMouse *mouse, /* Handle implicit button grabs: */ if (press_event && nbuttons == 1) { - gdk_fb_pointer_grab (window, FALSE, - gdk_window_get_events (window), + gdk_fb_pointer_grab (mouse_win, FALSE, + gdk_window_get_events (mouse_win), NULL, NULL, GDK_CURRENT_TIME, TRUE); mouse->click_grab = TRUE; diff --git a/gdk/linux-fb/gdkprivate-fb.h b/gdk/linux-fb/gdkprivate-fb.h index 998b44169e..c390dbcf1c 100644 --- a/gdk/linux-fb/gdkprivate-fb.h +++ b/gdk/linux-fb/gdkprivate-fb.h @@ -262,7 +262,8 @@ void gdk_window_invalidate_region_clear (GdkWindow *window, GdkRegion *region); void gdk_window_invalidate_rect_clear (GdkWindow *window, GdkRectangle *rect); -void gdk_fb_window_send_crossing_events (GdkWindow *dest, +void gdk_fb_window_send_crossing_events (GdkWindow *src, + GdkWindow *dest, GdkCrossingMode mode); void gdk_fb_window_move_resize (GdkWindow *window, gint x, @@ -384,14 +385,29 @@ void gdk_fb_recompute_all (void); extern GdkFBAngle _gdk_fb_screen_angle; -extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine; -extern GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events; +/* Pointer grab info */ +extern GdkWindow *_gdk_fb_pointer_grab_window; +extern gboolean _gdk_fb_pointer_grab_owner_events; +extern GdkWindow *_gdk_fb_pointer_grab_confine; +extern GdkEventMask _gdk_fb_pointer_grab_events; extern GdkCursor *_gdk_fb_pointer_grab_cursor; +/* Keyboard grab info */ +extern GdkWindow *_gdk_fb_keyboard_grab_window; +extern GdkEventMask _gdk_fb_keyboard_grab_events; +extern gboolean _gdk_fb_keyboard_grab_owner_events; + extern GdkFBDisplay *gdk_display; extern GdkDrawableClass _gdk_fb_drawable_class; extern FILE *debug_out; -GdkEvent *gdk_event_make(GdkWindow *window, GdkEventType type, gboolean append_to_queue); -GdkEvent *gdk_event_make_2(GdkWindow *window, GdkEventType type, gboolean append_to_queue, gint button_press_num); +GdkEvent *gdk_event_make(GdkWindow *window, + GdkEventType type, + gboolean append_to_queue); +GdkWindow * gdk_fb_pointer_event_window (GdkWindow *window, + GdkEventType type); +GdkWindow *gdk_fb_keyboard_event_window (GdkWindow *window, + GdkEventType type); +GdkWindow *gdk_fb_other_event_window (GdkWindow *window, + GdkEventType type); void gdk_fb_get_cursor_rect(GdkRectangle *rect); gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect); diff --git a/gdk/linux-fb/gdkproperty-fb.c b/gdk/linux-fb/gdkproperty-fb.c index fd23186555..530622b150 100644 --- a/gdk/linux-fb/gdkproperty-fb.c +++ b/gdk/linux-fb/gdkproperty-fb.c @@ -54,13 +54,15 @@ gdk_property_delete_2 (GdkWindow *window, { GdkWindowFBData *fbd = GDK_WINDOW_IMPL_FBDATA(window); GdkEvent *event; + GdkWindow *event_window; g_hash_table_remove (fbd->properties, GUINT_TO_POINTER (property)); g_free (prop); - event = gdk_event_make (window, GDK_PROPERTY_NOTIFY, TRUE); - if (event) + event_window = gdk_fb_other_event_window (window, GDK_PROPERTY_NOTIFY); + if (event_window) { + event = gdk_event_make (event_window, GDK_PROPERTY_NOTIFY, TRUE); event->property.atom = property; event->property.state = GDK_PROPERTY_DELETE; } @@ -147,6 +149,7 @@ gdk_property_change (GdkWindow *window, GdkWindowProperty *prop, *new_prop; int new_size = 0; GdkEvent *event; + GdkWindow *event_window; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); @@ -195,9 +198,10 @@ gdk_property_change (GdkWindow *window, g_hash_table_insert (fbd->properties, GUINT_TO_POINTER (property), new_prop); g_free (prop); - event = gdk_event_make (window, GDK_PROPERTY_NOTIFY, TRUE); - if (event) + event_window = gdk_fb_other_event_window (window, GDK_PROPERTY_NOTIFY); + if (event_window) { + event = gdk_event_make (event_window, GDK_PROPERTY_NOTIFY, TRUE); event->property.atom = property; event->property.state = GDK_PROPERTY_NEW_VALUE; } diff --git a/gdk/linux-fb/gdkselection-fb.c b/gdk/linux-fb/gdkselection-fb.c index 91ad6f159b..dc7409da69 100644 --- a/gdk/linux-fb/gdkselection-fb.c +++ b/gdk/linux-fb/gdkselection-fb.c @@ -125,14 +125,16 @@ gdk_selection_convert (GdkWindow *requestor, { GdkEvent *event; GdkWindow *owner; + GdkWindow *event_window; owner = gdk_selection_owner_get (selection); if (owner) { - event = gdk_event_make (owner, GDK_SELECTION_REQUEST, TRUE); - if (event) + event_window = gdk_fb_other_event_window (owner, GDK_SELECTION_REQUEST); + if (event_window) { + event = gdk_event_make (event_window, GDK_SELECTION_REQUEST, TRUE); event->selection.requestor = requestor; event->selection.selection = selection; event->selection.target = target; @@ -209,10 +211,12 @@ gdk_selection_send_notify (guint32 requestor, guint32 time) { GdkEvent *event; + GdkWindow *event_window; - event = gdk_event_make (gdk_window_lookup (requestor), GDK_SELECTION_NOTIFY, TRUE); - if (event) + event_window = gdk_fb_other_event_window (gdk_window_lookup (requestor), GDK_SELECTION_NOTIFY); + if (event_window) { + event = gdk_event_make (event_window, GDK_SELECTION_NOTIFY, TRUE); event->selection.selection = selection; event->selection.target = target; event->selection.property = property; diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c index ebc4835af9..d649328301 100644 --- a/gdk/linux-fb/gdkwindow-fb.c +++ b/gdk/linux-fb/gdkwindow-fb.c @@ -36,6 +36,7 @@ /* Global variables: */ static GdkWindow *gdk_fb_window_containing_pointer = NULL; +static GdkWindow *gdk_fb_focused_window = NULL; static gpointer parent_class = NULL; static void recompute_drawable (GdkDrawable *drawable); @@ -315,15 +316,19 @@ send_map_events (GdkWindowObject *private, gboolean is_map) { GList *l; GdkWindow *parent = (GdkWindow *)private->parent; - + GdkWindow *event_win; + g_assert (is_map); if (!private->mapped) return; if (is_map) - gdk_event_make ((GdkWindow *)private, GDK_MAP, TRUE); - + { + event_win = gdk_fb_other_event_window ((GdkWindow *)private, GDK_MAP); + if (event_win) + gdk_event_make (event_win, GDK_MAP, TRUE); + } if (private->input_only) return; @@ -462,20 +467,15 @@ gdk_fb_redraw_all (void) /* Focus follows pointer */ -GdkWindow * -_gdk_fb_window_find_focus (GdkWindow *window_with_mouse) +static GdkWindow * +gdk_fb_window_find_toplevel (GdkWindow *window) { - if (_gdk_fb_keyboard_grab_window) - return _gdk_fb_keyboard_grab_window; - else if (window_with_mouse) + GdkWindowObject *priv = (GdkWindowObject *)window; + while (priv != (GdkWindowObject *)gdk_parent_root) { - GdkWindowObject *priv = (GdkWindowObject *)window_with_mouse; - while (priv != (GdkWindowObject *)gdk_parent_root) - { - if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped) - return (GdkWindow *)priv; - priv = priv->parent; - } + if ((priv->parent == (GdkWindowObject *)gdk_parent_root) && priv->mapped) + return (GdkWindow *)priv; + priv = priv->parent; } return gdk_parent_root; @@ -484,28 +484,49 @@ _gdk_fb_window_find_focus (GdkWindow *window_with_mouse) GdkWindow * gdk_fb_window_find_focus (void) { - return _gdk_fb_window_find_focus (gdk_fb_window_containing_pointer); + if (_gdk_fb_keyboard_grab_window) + return _gdk_fb_keyboard_grab_window; + + if (!gdk_fb_focused_window) + gdk_fb_focused_window = gdk_parent_root; + + return gdk_fb_focused_window; } static void -gdk_fb_send_focus_change (GdkWindow *old_window_containing_pointer, - GdkWindow *new_window_containing_pointer) +gdk_fb_change_focus (GdkWindow *new_focus_window) { GdkEventFocus *event; GdkWindow *old_win, *new_win; - old_win = _gdk_fb_window_find_focus (old_window_containing_pointer); - new_win = _gdk_fb_window_find_focus (new_window_containing_pointer); + GdkWindow *event_win; + + /* No focus changes while the pointer is grabbed */ + if (_gdk_fb_pointer_grab_window) + return; + + old_win = gdk_fb_focused_window; + new_win = gdk_fb_window_find_toplevel (new_focus_window); if (old_win != new_win) { - event = (GdkEventFocus *)gdk_event_make (old_win, GDK_FOCUS_CHANGE, TRUE); - if (event) - event->in = FALSE; - event = (GdkEventFocus *)gdk_event_make (new_win, GDK_FOCUS_CHANGE, TRUE); - if (event) - event->in = TRUE; + if (old_win) + { + event_win = gdk_fb_keyboard_event_window (old_win, GDK_FOCUS_CHANGE); + if (event_win) + { + event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE); + event->in = FALSE; + } + } + event_win = gdk_fb_keyboard_event_window (new_win, GDK_FOCUS_CHANGE); + if (event_win) + { + event = (GdkEventFocus *)gdk_event_make (event_win, GDK_FOCUS_CHANGE, TRUE); + event->in = TRUE; + } } + gdk_fb_focused_window = new_win; } static GdkWindow * @@ -545,7 +566,8 @@ gdk_fb_find_common_ancestor (GdkWindow *win1, } void -gdk_fb_window_send_crossing_events (GdkWindow *dest, +gdk_fb_window_send_crossing_events (GdkWindow *src, + GdkWindow *dest, GdkCrossingMode mode) { GdkWindow *c; @@ -555,9 +577,9 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, GdkModifierType my_mask; GList *path, *list; gboolean non_linear; - gboolean only_grabbed_window; GdkWindow *a; GdkWindow *b; + GdkWindow *event_win; if ((mode == GDK_CROSSING_NORMAL) && (dest == gdk_fb_window_containing_pointer)) @@ -566,18 +588,12 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, if (gdk_fb_window_containing_pointer == NULL) gdk_fb_window_containing_pointer = gdk_window_ref (gdk_parent_root); - if (mode == GDK_CROSSING_UNGRAB) - a = _gdk_fb_pointer_grab_window; + if (src) + a = src; else a = gdk_fb_window_containing_pointer; b = dest; - /* When grab in progress only send normal crossing events about - * the grabbed window. - */ - only_grabbed_window = (_gdk_fb_pointer_grab_window_events != NULL) && - (mode == GDK_CROSSING_NORMAL); - if (a==b) return; @@ -587,12 +603,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, non_linear = (c != a) && (c != b); - if (!only_grabbed_window || (a == _gdk_fb_pointer_grab_window)) - event = gdk_event_make (a, GDK_LEAVE_NOTIFY, TRUE); - else - event = NULL; - if (event) + event_win = gdk_fb_pointer_event_window (a, GDK_LEAVE_NOTIFY); + if (event_win) { + event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE); event->crossing.subwindow = NULL; gdk_window_get_root_origin (a, &x_int, &y_int); event->crossing.x = x - x_int; @@ -617,12 +631,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent); while (win != c) { - if (!only_grabbed_window || (win == _gdk_fb_pointer_grab_window)) - event = gdk_event_make (win, GDK_LEAVE_NOTIFY, TRUE); - else - event = NULL; - if (event) + event_win = gdk_fb_pointer_event_window (win, GDK_LEAVE_NOTIFY); + if (event_win) { + event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE); event->crossing.subwindow = gdk_window_ref (last); gdk_window_get_root_origin (win, &x_int, &y_int); event->crossing.x = x - x_int; @@ -663,12 +675,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, else next = b; - if (!only_grabbed_window || (win == _gdk_fb_pointer_grab_window)) - event = gdk_event_make (win, GDK_ENTER_NOTIFY, TRUE); - else - event = NULL; - if (event) + event_win = gdk_fb_pointer_event_window (win, GDK_ENTER_NOTIFY); + if (event_win) { + event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE); event->crossing.subwindow = gdk_window_ref (next); gdk_window_get_root_origin (win, &x_int, &y_int); event->crossing.x = x - x_int; @@ -687,12 +697,10 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, g_list_free (path); } - if (!only_grabbed_window || (b == _gdk_fb_pointer_grab_window)) - event = gdk_event_make (b, GDK_ENTER_NOTIFY, TRUE); - else - event = NULL; - if (event) + event_win = gdk_fb_pointer_event_window (b, GDK_ENTER_NOTIFY); + if (event_win) { + event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE); event->crossing.subwindow = NULL; gdk_window_get_root_origin (b, &x_int, &y_int); event->crossing.x = x - x_int; @@ -710,13 +718,14 @@ gdk_fb_window_send_crossing_events (GdkWindow *dest, event->crossing.state = my_mask; } - if ((mode != GDK_CROSSING_GRAB) && - (b != gdk_fb_window_containing_pointer) && - !only_grabbed_window) + if (mode != GDK_CROSSING_GRAB) { - gdk_fb_send_focus_change (gdk_fb_window_containing_pointer, b); - gdk_window_unref (gdk_fb_window_containing_pointer); - gdk_fb_window_containing_pointer = gdk_window_ref (b); + gdk_fb_change_focus (b); + if (b != gdk_fb_window_containing_pointer) + { + gdk_window_unref (gdk_fb_window_containing_pointer); + gdk_fb_window_containing_pointer = gdk_window_ref (b); + } } } @@ -744,7 +753,8 @@ gdk_window_show (GdkWindow *window) send_map_events (private, TRUE); mousewin = gdk_window_at_pointer (NULL, NULL); - gdk_fb_window_send_crossing_events (mousewin, + gdk_fb_window_send_crossing_events (NULL, + mousewin, GDK_CROSSING_NORMAL); if (private->input_only) @@ -764,6 +774,7 @@ gdk_window_hide (GdkWindow *window) { GdkWindowObject *private; GdkWindow *mousewin; + GdkWindow *event_win; g_return_if_fail (window != NULL); @@ -775,7 +786,9 @@ gdk_window_hide (GdkWindow *window) GdkRectangle r; gboolean do_hide; - event = gdk_event_make (window, GDK_UNMAP, TRUE); + event_win = gdk_fb_other_event_window (window, GDK_UNMAP); + if (event_win) + event = gdk_event_make (event_win, GDK_UNMAP, TRUE); r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x; r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y; @@ -785,7 +798,8 @@ gdk_window_hide (GdkWindow *window) private->mapped = FALSE; mousewin = gdk_window_at_pointer (NULL, NULL); - gdk_fb_window_send_crossing_events (mousewin, + gdk_fb_window_send_crossing_events (NULL, + mousewin, GDK_CROSSING_NORMAL); do_hide = gdk_fb_cursor_need_hide (&r); @@ -1113,9 +1127,11 @@ gdk_fb_window_move_resize (GdkWindow *window, /* Send GdkEventConfigure for toplevel windows */ if (private->window_type != GDK_WINDOW_CHILD) { - event = gdk_event_make (window, GDK_CONFIGURE, TRUE); - if (event) + GdkWindow *event_win; + event_win = gdk_fb_other_event_window (window, GDK_CONFIGURE); + if (event_win) { + event = gdk_event_make (event_win, GDK_CONFIGURE, TRUE); event->configure.x = private->x; event->configure.y = private->y; event->configure.width = GDK_DRAWABLE_IMPL_FBDATA (private)->width; @@ -1125,7 +1141,8 @@ gdk_fb_window_move_resize (GdkWindow *window, /* The window the pointer is in might have changed */ mousewin = gdk_window_at_pointer (NULL, NULL); - gdk_fb_window_send_crossing_events (mousewin, + gdk_fb_window_send_crossing_events (NULL, + mousewin, GDK_CROSSING_NORMAL); } } @@ -1682,6 +1699,11 @@ gdk_window_set_events (GdkWindow *window, g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); + + if (event_mask & GDK_BUTTON_MOTION_MASK) + event_mask |= + GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | + GDK_BUTTON3_MOTION_MASK; if (!GDK_WINDOW_DESTROYED (window)) GDK_WINDOW_IMPL_FBDATA (window)->event_mask = event_mask; diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index e566b04970..0abb2d9d63 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -2658,12 +2658,22 @@ gtk_drag_update (GtkDragSourceInfo *info, possible_actions, time)) { - if (info->last_event) - gdk_event_free ((GdkEvent *)info->last_event); - - info->last_event = gdk_event_copy ((GdkEvent *)event); + if (info->last_event != event) /* Paranoia, should not happen */ + { + if (info->last_event) + gdk_event_free ((GdkEvent *)info->last_event); + info->last_event = gdk_event_copy ((GdkEvent *)event); + } } - + else + { + if (info->last_event) + { + gdk_event_free ((GdkEvent *)info->last_event); + info->last_event = NULL; + } + } + if (dest_window) gdk_window_unref (dest_window);