summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@pobox.com>2002-02-24 19:58:27 +0000
committerHavoc Pennington <hp@src.gnome.org>2002-02-24 19:58:27 +0000
commitbedddaa717e8350ae2d22a2ea28094a794218a97 (patch)
tree61adb43ff5c9877af2039e2161d32863d2311aa6
parent2d0141957759fafea4fb64bfe160b8efbb26ca41 (diff)
downloadmetacity-bedddaa717e8350ae2d22a2ea28094a794218a97.tar.gz
switch on the op passed in, not the active op. Gives us the right cursor
2002-02-24 Havoc Pennington <hp@pobox.com> * src/display.c (xcursor_for_op): switch on the op passed in, not the active op. Gives us the right cursor during resizing, etc. * src/errors.c: rearrange all the error stuff to adapt to the GDK change a while back, so now we print our X errors again * src/display.c (meta_display_begin_grab_op): remove KeyPressMask and KeyReleaseMask from the XGrabPointer(), this caused BadValue and kept the grab from ever succeeding. Fixes the problem with the GTK resize grip - this is why you shouldn't break your X error spew. ;-) * src/display.c: debug spew tweaks * src/window.c (meta_window_client_message): do some s/verbose/topic/ stuff
-rw-r--r--ChangeLog19
-rw-r--r--src/display.c56
-rw-r--r--src/display.h4
-rw-r--r--src/errors.c87
-rw-r--r--src/frame.c11
-rw-r--r--src/window.c10
6 files changed, 145 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
index 328f25e1..e92b365d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2002-02-24 Havoc Pennington <hp@pobox.com>
+
+ * src/display.c (xcursor_for_op): switch on the op passed in, not
+ the active op. Gives us the right cursor during resizing, etc.
+
+ * src/errors.c: rearrange all the error stuff to adapt to the GDK
+ change a while back, so now we print our X errors again
+
+ * src/display.c (meta_display_begin_grab_op): remove KeyPressMask
+ and KeyReleaseMask from the XGrabPointer(), this caused BadValue
+ and kept the grab from ever succeeding. Fixes the problem with the
+ GTK resize grip - this is why you shouldn't break your X error
+ spew. ;-)
+
+ * src/display.c: debug spew tweaks
+
+ * src/window.c (meta_window_client_message): do some
+ s/verbose/topic/ stuff
+
2002-02-23 Havoc Pennington <hp@pobox.com>
* src/ui.c (meta_ui_init): fix the
diff --git a/src/display.c b/src/display.c
index 65a28222..aa12c6c5 100644
--- a/src/display.c
+++ b/src/display.c
@@ -177,7 +177,8 @@ meta_display_open (const char *name)
*/
display->name = g_strdup (XDisplayName (name));
display->xdisplay = xdisplay;
- display->error_traps = NULL;
+ display->error_traps = 0;
+ display->error_trap_handler = NULL;
display->server_grab_count = 0;
display->workspaces = NULL;
@@ -430,7 +431,7 @@ meta_display_close (MetaDisplay *display)
GSList *winlist;
GSList *tmp;
- if (display->error_traps)
+ if (display->error_traps > 0)
meta_bug ("Display closed with error traps pending\n");
winlist = meta_display_list_windows (display);
@@ -685,7 +686,9 @@ event_callback (XEvent *event,
event->xbutton.time < (display->last_button_time + display->double_click_time))
{
display->is_double_click = TRUE;
- meta_verbose ("This was the second click of a double click\n");
+ meta_topic (META_DEBUG_EVENTS,
+ "This was the second click of a double click\n");
+
}
else
{
@@ -1381,6 +1384,10 @@ meta_spew_event (MetaDisplay *display,
break;
case MotionNotify:
name = "MotionNotify";
+ extra = g_strdup_printf ("win: 0x%lx x: %d y: %d",
+ event->xmotion.window,
+ event->xmotion.x,
+ event->xmotion.y);
break;
case EnterNotify:
name = "EnterNotify";
@@ -1695,7 +1702,7 @@ xcursor_for_op (MetaDisplay *display,
{
MetaCursor cursor = META_CURSOR_DEFAULT;
- switch (display->grab_op)
+ switch (op)
{
case META_GRAB_OP_RESIZING_SE:
cursor = META_CURSOR_SE_RESIZE;
@@ -1743,8 +1750,9 @@ meta_display_begin_grab_op (MetaDisplay *display,
Window grabwindow;
Cursor cursor;
- meta_verbose ("Doing grab op %d on window %s button %d pointer already grabbed: %d\n",
- op, window->desc, button, pointer_already_grabbed);
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "Doing grab op %d on window %s button %d pointer already grabbed: %d\n",
+ op, window->desc, button, pointer_already_grabbed);
grabwindow = window->frame ? window->frame->xwindow : window->xwindow;
@@ -1757,35 +1765,41 @@ meta_display_begin_grab_op (MetaDisplay *display,
if (pointer_already_grabbed)
display->grab_have_pointer = TRUE;
-
- /* We XGrabPointer even if we already have an autograb,
- * just to set the cursor and event mask
- */
cursor = xcursor_for_op (display, op);
-
+
+#define GRAB_MASK (PointerMotionMask | PointerMotionHintMask | \
+ ButtonPressMask | ButtonReleaseMask)
+
meta_error_trap_push (display);
if (XGrabPointer (display->xdisplay,
grabwindow,
False,
- PointerMotionMask | PointerMotionHintMask |
- ButtonPressMask | ButtonReleaseMask |
- KeyPressMask | KeyReleaseMask,
+ GRAB_MASK,
GrabModeAsync, GrabModeAsync,
None,
cursor,
timestamp) == GrabSuccess)
{
display->grab_have_pointer = TRUE;
- meta_debug_spew ("Successful XGrabPointer()\n");
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "XGrabPointer() returned GrabSuccess\n");
+ }
+ if (meta_error_trap_pop (display) != Success)
+ {
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "Error trapped from XGrabPointer()\n");
+ if (display->grab_have_pointer)
+ display->grab_have_pointer = FALSE;
}
- meta_error_trap_pop (display);
+#undef GRAB_MASK
XFreeCursor (display->xdisplay, cursor);
if (!display->grab_have_pointer)
{
- meta_verbose ("XGrabPointer() failed\n");
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "XGrabPointer() failed\n");
return FALSE;
}
@@ -1796,7 +1810,8 @@ meta_display_begin_grab_op (MetaDisplay *display,
if (!display->grab_have_keyboard)
{
- meta_verbose ("grabbing all keys failed\n");
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "grabbing all keys failed\n");
return FALSE;
}
}
@@ -1811,8 +1826,9 @@ meta_display_begin_grab_op (MetaDisplay *display,
&display->grab_initial_window_pos.x,
&display->grab_initial_window_pos.y);
- meta_verbose ("Grab op %d on window %s successful\n",
- display->grab_op, display->grab_window->desc);
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "Grab op %d on window %s successful\n",
+ display->grab_op, display->grab_window->desc);
g_assert (display->grab_window != NULL);
g_assert (display->grab_op != META_GRAB_OP_NONE);
diff --git a/src/display.h b/src/display.h
index 12c43812..4ab5750f 100644
--- a/src/display.h
+++ b/src/display.h
@@ -130,7 +130,9 @@ struct _MetaDisplay
MetaEventQueue *events;
GSList *screens;
GHashTable *window_ids;
- GSList *error_traps;
+ int error_traps;
+ int (* error_trap_handler) (Display *display,
+ XErrorEvent *error);
int server_grab_count;
/* This window holds the focus when we don't want to focus
diff --git a/src/errors.c b/src/errors.c
index 95d1a33a..0ae29465 100644
--- a/src/errors.c
+++ b/src/errors.c
@@ -26,11 +26,6 @@
#include <stdlib.h>
#include <gdk/gdk.h>
-static int (* saved_gdk_error_handler) (Display *display,
- XErrorEvent *error);
-
-static int (* saved_gdk_io_error_handler) (Display *display);
-
static int x_error_handler (Display *display,
XErrorEvent *error);
static int x_io_error_handler (Display *display);
@@ -38,23 +33,66 @@ static int x_io_error_handler (Display *display);
void
meta_errors_init (void)
{
- saved_gdk_error_handler = XSetErrorHandler (x_error_handler);
- saved_gdk_io_error_handler = XSetIOErrorHandler (x_io_error_handler);
+ XSetErrorHandler (x_error_handler);
+ XSetIOErrorHandler (x_io_error_handler);
}
void
meta_error_trap_push (MetaDisplay *display)
{
+ /* GDK resets the error handler on each push */
+ int (* old_error_handler) (Display *,
+ XErrorEvent *);
+
gdk_error_trap_push ();
+
+ /* old_error_handler will just be equal to x_error_handler
+ * for nested traps
+ */
+ old_error_handler = XSetErrorHandler (x_error_handler);
+
+ /* Replace GDK handler, but save it so we can chain up */
+ if (display->error_trap_handler == NULL)
+ {
+ g_assert (display->error_traps == 0);
+ display->error_trap_handler = old_error_handler;
+ g_assert (display->error_trap_handler != x_error_handler);
+ }
+
+ display->error_traps += 1;
}
int
meta_error_trap_pop (MetaDisplay *display)
{
+ int result;
+
+ g_assert (display->error_traps > 0);
+
/* just use GDK trap, but we do the sync since GDK doesn't */
XSync (display->xdisplay, False);
- return gdk_error_trap_pop ();
+ result = gdk_error_trap_pop ();
+
+ display->error_traps -= 1;
+
+ if (display->error_traps == 0)
+ {
+ /* check that GDK put our handler back; this
+ * assumes that there are no pending GDK traps from GDK itself
+ */
+
+ int (* restored_error_handler) (Display *,
+ XErrorEvent *);
+
+ restored_error_handler = XSetErrorHandler (x_error_handler);
+ g_assert (restored_error_handler == x_error_handler);
+
+ /* remove this */
+ display->error_trap_handler = NULL;
+ }
+
+ return result;
}
static int
@@ -63,17 +101,40 @@ x_error_handler (Display *xdisplay,
{
int retval;
gchar buf[64];
+ MetaDisplay *display;
- XGetErrorText (xdisplay, error->error_code, buf, 63);
+ XGetErrorText (xdisplay, error->error_code, buf, 63);
+
+ display = meta_display_for_x_display (xdisplay);
- meta_verbose ("X error: %s serial %ld error_code %d request_code %d minor_code %d)\n",
+ if (display->error_traps > 0)
+ {
+ /* we're in an error trap, chain to the trap handler
+ * saved from GDK
+ */
+ meta_verbose ("X error: %s serial %ld error_code %d request_code %d minor_code %d)\n",
+ buf,
+ error->serial,
+ error->error_code,
+ error->request_code,
+ error->minor_code);
+
+ g_assert (display->error_trap_handler != NULL);
+ g_assert (display->error_trap_handler != x_error_handler);
+
+ retval = (* display->error_trap_handler) (xdisplay, error);
+ }
+ else
+ {
+ meta_bug ("Unexpected X error: %s serial %ld error_code %d request_code %d minor_code %d)\n",
buf,
error->serial,
error->error_code,
error->request_code,
error->minor_code);
-
- retval = saved_gdk_error_handler (xdisplay, error);
+
+ retval = 1; /* compiler warning */
+ }
return retval;
}
@@ -107,3 +168,5 @@ x_io_error_handler (Display *xdisplay)
return 0;
}
+
+
diff --git a/src/frame.c b/src/frame.c
index f02c4264..0c0b3198 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -267,11 +267,12 @@ meta_frame_sync_to_window (MetaFrame *frame,
if (!(need_move || need_resize))
return;
- meta_verbose ("Syncing frame geometry %d,%d %dx%d (SE: %d,%d)\n",
- frame->rect.x, frame->rect.y,
- frame->rect.width, frame->rect.height,
- frame->rect.x + frame->rect.width,
- frame->rect.y + frame->rect.height);
+ meta_topic (META_DEBUG_GEOMETRY,
+ "Syncing frame geometry %d,%d %dx%d (SE: %d,%d)\n",
+ frame->rect.x, frame->rect.y,
+ frame->rect.width, frame->rect.height,
+ frame->rect.x + frame->rect.width,
+ frame->rect.y + frame->rect.height);
/* set bg to none to avoid flicker */
if (need_resize)
diff --git a/src/window.c b/src/window.c
index 59dc1272..e2aa4a00 100644
--- a/src/window.c
+++ b/src/window.c
@@ -2969,9 +2969,10 @@ meta_window_client_message (MetaWindow *window,
y_root = event->xclient.data.l[1];
action = event->xclient.data.l[2];
- meta_verbose ("Received _NET_WM_MOVERESIZE message on %s, %d,%d action = %d\n",
- window->desc,
- x_root, y_root, action);
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "Received _NET_WM_MOVERESIZE message on %s, %d,%d action = %d\n",
+ window->desc,
+ x_root, y_root, action);
op = META_GRAB_OP_NONE;
switch (action)
@@ -3040,7 +3041,8 @@ meta_window_client_message (MetaWindow *window,
if (button != 0)
{
- meta_verbose ("Beginning move/resize with button = %d\n", button);
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "Beginning move/resize with button = %d\n", button);
meta_display_begin_grab_op (window->display,
window,
op,