Doh! Mixed up x and y.

2001-01-17    <alexl@redhat.com>

	* 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.
This commit is contained in:
7 2001-01-17 15:52:22 +00:00 committed by Alexander Larsson
parent 2d28a30379
commit 9012254c1e
17 changed files with 811 additions and 273 deletions

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -1,3 +1,51 @@
2001-01-17 <alexl@redhat.com>
* 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 <gale@gtk.org>
* docs/faq/gtk-faq.sgml: FAQ update:

View File

@ -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)
{

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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);