summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkevents-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11/gdkevents-x11.c')
-rw-r--r--gdk/x11/gdkevents-x11.c197
1 files changed, 108 insertions, 89 deletions
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index 159e0ee9e5..4f6f577f29 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -27,7 +27,6 @@
#include "gdk.h"
#include "gdkx.h"
#include "gdkprivate.h"
-#include "gdkinput.h"
#include "gdkkeysyms.h"
#if HAVE_CONFIG_H
@@ -37,6 +36,7 @@
# endif
#endif
+#include "gdkinput.h"
typedef struct _GdkIOClosure GdkIOClosure;
typedef struct _GdkEventPrivate GdkEventPrivate;
@@ -88,9 +88,11 @@ static GdkEvent* gdk_event_unqueue (void);
static gboolean gdk_event_prepare (gpointer source_data,
GTimeVal *current_time,
- gint *timeout);
+ gint *timeout,
+ gpointer user_data);
static gboolean gdk_event_check (gpointer source_data,
- GTimeVal *current_time);
+ GTimeVal *current_time,
+ gpointer user_data);
static gboolean gdk_event_dispatch (gpointer source_data,
GTimeVal *current_time,
gpointer user_data);
@@ -434,6 +436,10 @@ gdk_compress_exposures (XEvent *xevent,
rect1.width = xevent->xexpose.width;
rect1.height = xevent->xexpose.height;
+ event.any.type = GDK_EXPOSE;
+ event.any.window = None;
+ event.any.send_event = FALSE;
+
while (1)
{
if (count == 0)
@@ -449,6 +455,8 @@ gdk_compress_exposures (XEvent *xevent,
&tmp_event,
expose_predicate,
(XPointer)&info);
+
+ event.any.window = window;
/* We apply filters here, and if it was filtered, completely
* ignore the return
@@ -849,6 +857,12 @@ gdk_io_destroy (gpointer data)
g_free (closure);
}
+/* What do we do with G_IO_NVAL?
+ */
+#define READ_CONDITION (G_IO_IN | G_IO_HUP | G_IO_ERR)
+#define WRITE_CONDITION (G_IO_OUT | G_IO_ERR)
+#define EXCEPTION_CONDITION (G_IO_PRI)
+
static gboolean
gdk_io_invoke (GIOChannel *source,
GIOCondition condition,
@@ -857,11 +871,11 @@ gdk_io_invoke (GIOChannel *source,
GdkIOClosure *closure = data;
GdkInputCondition gdk_cond = 0;
- if (condition & (G_IO_IN | G_IO_PRI))
+ if (condition & READ_CONDITION)
gdk_cond |= GDK_INPUT_READ;
- if (condition & G_IO_OUT)
+ if (condition & WRITE_CONDITION)
gdk_cond |= GDK_INPUT_WRITE;
- if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
+ if (condition & EXCEPTION_CONDITION)
gdk_cond |= GDK_INPUT_EXCEPTION;
if (closure->condition & gdk_cond)
@@ -888,11 +902,11 @@ gdk_input_add_full (gint source,
closure->data = data;
if (condition & GDK_INPUT_READ)
- cond |= (G_IO_IN | G_IO_PRI);
+ cond |= READ_CONDITION;
if (condition & GDK_INPUT_WRITE)
- cond |= G_IO_OUT;
+ cond |= WRITE_CONDITION;
if (condition & GDK_INPUT_EXCEPTION)
- cond |= G_IO_ERR|G_IO_HUP|G_IO_NVAL;
+ cond |= EXCEPTION_CONDITION;
channel = g_io_channel_unix_new (source);
result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, cond,
@@ -923,7 +937,6 @@ gdk_event_apply_filters (XEvent *xevent,
GdkEvent *event,
GList *filters)
{
- GdkEventFilter *filter;
GList *tmp_list;
GdkFilterReturn result;
@@ -931,13 +944,12 @@ gdk_event_apply_filters (XEvent *xevent,
while (tmp_list)
{
- filter = (GdkEventFilter*) tmp_list->data;
+ GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data;
- result = (*filter->function) (xevent, event, filter->data);
+ tmp_list = tmp_list->next;
+ result = filter->function (xevent, event, filter->data);
if (result != GDK_FILTER_CONTINUE)
return result;
-
- tmp_list = tmp_list->next;
}
return GDK_FILTER_CONTINUE;
@@ -1002,7 +1014,7 @@ gdk_event_translate (GdkEvent *event,
gdk_window_ref (window);
event->any.window = window;
- event->any.send_event = xevent->xany.send_event;
+ event->any.send_event = xevent->xany.send_event ? TRUE : FALSE;
if (window_private && window_private->destroyed)
{
@@ -1057,9 +1069,6 @@ gdk_event_translate (GdkEvent *event,
}
#endif
- if (window == NULL)
- g_message ("Got event for unknown window: %#lx\n", xevent->xany.window);
-
/* We do a "manual" conversion of the XEvent to a
* GdkEvent. The structures are mostly the same so
* the conversion is fairly straightforward. We also
@@ -1513,10 +1522,11 @@ gdk_event_translate (GdkEvent *event,
/* Print debugging info.
*/
GDK_NOTE (EVENTS,
- g_message ("expose:\t\twindow: %ld %d x,y: %d %d w,h: %d %d",
+ g_message ("expose:\t\twindow: %ld %d x,y: %d %d w,h: %d %d%s",
xevent->xexpose.window, xevent->xexpose.count,
xevent->xexpose.x, xevent->xexpose.y,
- xevent->xexpose.width, xevent->xexpose.height));
+ xevent->xexpose.width, xevent->xexpose.height,
+ event->any.send_event ? " (send)" : ""));
gdk_compress_exposures (xevent, window);
event->expose.type = GDK_EXPOSE;
@@ -1601,7 +1611,17 @@ gdk_event_translate (GdkEvent *event,
break;
case CreateNotify:
- /* Not currently handled */
+ GDK_NOTE (EVENTS,
+ g_message ("create notify:\twindow: %ld x,y: %d %d w,h: %d %d b-w: %d parent: %ld ovr: %d",
+ xevent->xcreatewindow.window,
+ xevent->xcreatewindow.x,
+ xevent->xcreatewindow.y,
+ xevent->xcreatewindow.width,
+ xevent->xcreatewindow.height,
+ xevent->xcreatewindow.border_width,
+ xevent->xcreatewindow.parent,
+ xevent->xcreatewindow.override_redirect));
+ /* not really handled */
break;
case DestroyNotify:
@@ -1616,7 +1636,7 @@ gdk_event_translate (GdkEvent *event,
return_val = window_private && !window_private->destroyed;
- if(window && window_private->xwindow != GDK_ROOT_WINDOW())
+ if (window && window_private->xwindow != GDK_ROOT_WINDOW())
gdk_window_destroy_notify (window);
break;
@@ -1651,8 +1671,12 @@ gdk_event_translate (GdkEvent *event,
/* Print debugging info.
*/
GDK_NOTE (EVENTS,
- g_message ("reparent notify:\twindow: %ld",
- xevent->xreparent.window));
+ g_message ("reparent notify:\twindow: %ld x,y: %d %d parent: %ld ovr: %d",
+ xevent->xreparent.window,
+ xevent->xreparent.x,
+ xevent->xreparent.y,
+ xevent->xreparent.parent,
+ xevent->xreparent.override_redirect));
/* Not currently handled */
return_val = FALSE;
@@ -1661,36 +1685,8 @@ gdk_event_translate (GdkEvent *event,
case ConfigureNotify:
/* Print debugging info.
*/
- while ((XPending (gdk_display) > 0) &&
- XCheckTypedWindowEvent(gdk_display, xevent->xany.window,
- ConfigureNotify, xevent))
- {
- GdkFilterReturn result;
-
- GDK_NOTE (EVENTS,
- g_message ("configure notify discarded:\twindow: %ld",
- xevent->xconfigure.window));
-
- result = gdk_event_apply_filters (xevent, event,
- window_private
- ?window_private->filters
- :gdk_default_filters);
-
- /* If the result is GDK_FILTER_REMOVE, there will be
- * trouble, but anybody who filtering the Configure events
- * better know what they are doing
- */
- if (result != GDK_FILTER_CONTINUE)
- {
- return (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
- }
-
- /*XSync (gdk_display, 0);*/
- }
-
-
GDK_NOTE (EVENTS,
- g_message ("configure notify:\twindow: %ld x,y: %d %d w,h: %d %d b-w: %d above: %ld ovr: %d",
+ g_message ("configure notify:\twindow: %ld x,y: %d %d w,h: %d %d b-w: %d above: %ld ovr: %d%s",
xevent->xconfigure.window,
xevent->xconfigure.x,
xevent->xconfigure.y,
@@ -1698,14 +1694,19 @@ gdk_event_translate (GdkEvent *event,
xevent->xconfigure.height,
xevent->xconfigure.border_width,
xevent->xconfigure.above,
- xevent->xconfigure.override_redirect));
-
- if (!window_private->destroyed &&
+ xevent->xconfigure.override_redirect,
+ !window
+ ? " (discarding)"
+ : window_private->window_type == GDK_WINDOW_CHILD
+ ? " (discarding child)"
+ : ""));
+ if (window &&
+ !window_private->destroyed &&
(window_private->extension_events != 0) &&
gdk_input_vtable.configure_event)
gdk_input_vtable.configure_event (&xevent->xconfigure, window);
- if (window_private->window_type == GDK_WINDOW_CHILD)
+ if (!window || window_private->window_type == GDK_WINDOW_CHILD)
return_val = FALSE;
else
{
@@ -1721,17 +1722,23 @@ gdk_event_translate (GdkEvent *event,
gint tx = 0;
gint ty = 0;
Window child_window = 0;
-
- if (!XTranslateCoordinates (window_private->xdisplay,
- window_private->xwindow,
- gdk_root_window,
- 0, 0,
- &tx, &ty,
- &child_window))
- g_warning ("GdkWindow %ld doesn't share root windows display?",
- window_private->xwindow);
- event->configure.x = tx;
- event->configure.y = ty;
+
+ gdk_error_trap_push ();
+ if (XTranslateCoordinates (window_private->xdisplay,
+ window_private->xwindow,
+ gdk_root_window,
+ 0, 0,
+ &tx, &ty,
+ &child_window))
+ {
+ if (!gdk_error_trap_pop ())
+ {
+ event->configure.x = tx;
+ event->configure.y = ty;
+ }
+ }
+ else
+ gdk_error_trap_pop ();
}
else
{
@@ -1751,8 +1758,15 @@ gdk_event_translate (GdkEvent *event,
/* Print debugging info.
*/
GDK_NOTE (EVENTS,
- g_message ("property notify:\twindow: %ld",
- xevent->xproperty.window));
+ gchar *atom = gdk_atom_name (xevent->xproperty.atom);
+ g_message ("property notify:\twindow: %ld, atom(%ld): %s%s%s",
+ xevent->xproperty.window,
+ xevent->xproperty.atom,
+ atom ? "\"" : "",
+ atom ? atom : "unknown",
+ atom ? "\"" : "");
+ g_free (atom);
+ );
event->property.type = GDK_PROPERTY_NOTIFY;
event->property.window = window;
@@ -1910,8 +1924,8 @@ gdk_event_translate (GdkEvent *event,
GdkFilterReturn
gdk_wm_protocols_filter (GdkXEvent *xev,
- GdkEvent *event,
- gpointer data)
+ GdkEvent *event,
+ gpointer data)
{
XEvent *xevent = (XEvent *)xev;
@@ -1993,8 +2007,7 @@ gdk_events_queue (void)
event->any.type = GDK_NOTHING;
event->any.window = NULL;
- event->any.send_event = FALSE;
- event->any.send_event = xevent.xany.send_event;
+ event->any.send_event = xevent.xany.send_event ? TRUE : FALSE;
((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING;
@@ -2017,7 +2030,8 @@ gdk_events_queue (void)
static gboolean
gdk_event_prepare (gpointer source_data,
GTimeVal *current_time,
- gint *timeout)
+ gint *timeout,
+ gpointer user_data)
{
gboolean retval;
@@ -2034,7 +2048,8 @@ gdk_event_prepare (gpointer source_data,
static gboolean
gdk_event_check (gpointer source_data,
- GTimeVal *current_time)
+ GTimeVal *current_time,
+ gpointer user_data)
{
gboolean retval;
@@ -2133,29 +2148,29 @@ gdk_event_send_client_message_to_all_recurse (XEvent *xev,
guint level)
{
static GdkAtom wm_state_atom = GDK_NONE;
-
Atom type = None;
int format;
unsigned long nitems, after;
unsigned char *data;
-
Window *ret_children, ret_root, ret_parent;
unsigned int ret_nchildren;
- int i;
-
+ gint old_warnings = gdk_error_warnings;
gboolean send = FALSE;
gboolean found = FALSE;
+ int i;
if (!wm_state_atom)
wm_state_atom = gdk_atom_intern ("WM_STATE", FALSE);
+ gdk_error_warnings = FALSE;
gdk_error_code = 0;
XGetWindowProperty (gdk_display, xid, wm_state_atom, 0, 0, False, AnyPropertyType,
&type, &format, &nitems, &after, &data);
if (gdk_error_code)
{
- gdk_error_code = 0;
+ gdk_error_warnings = old_warnings;
+
return FALSE;
}
@@ -2167,18 +2182,20 @@ gdk_event_send_client_message_to_all_recurse (XEvent *xev,
else
{
/* OK, we're all set, now let's find some windows to send this to */
- if (XQueryTree(gdk_display, xid, &ret_root, &ret_parent,
- &ret_children, &ret_nchildren) != True)
- return FALSE;
-
- if (gdk_error_code)
- return FALSE;
+ if (XQueryTree (gdk_display, xid, &ret_root, &ret_parent,
+ &ret_children, &ret_nchildren) != True ||
+ gdk_error_code)
+ {
+ gdk_error_warnings = old_warnings;
+
+ return FALSE;
+ }
for(i = 0; i < ret_nchildren; i++)
- if (gdk_event_send_client_message_to_all_recurse(xev, ret_children[i], level + 1))
+ if (gdk_event_send_client_message_to_all_recurse (xev, ret_children[i], level + 1))
found = TRUE;
- XFree(ret_children);
+ XFree (ret_children);
}
if (send || (!found && (level == 1)))
@@ -2187,6 +2204,8 @@ gdk_event_send_client_message_to_all_recurse (XEvent *xev,
gdk_send_xevent (xid, False, NoEventMask, xev);
}
+ gdk_error_warnings = old_warnings;
+
return (send || found);
}