From bda80922c29d283d04a5969b0c0785855143f7f4 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 29 Feb 2008 11:36:34 +0900 Subject: [PATCH] Hacks on gtk-window-decorator to give deviceid (this breaks the spec) --- gtk/window-decorator/gtk-window-decorator.c | 197 ++++++++++++++++++++++----- 1 files changed, 161 insertions(+), 36 deletions(-) diff --git a/gtk/window-decorator/gtk-window-decorator.c b/gtk/window-decorator/gtk-window-decorator.c index 41ce6ae..556b228 100644 --- a/gtk/window-decorator/gtk-window-decorator.c +++ b/gtk/window-decorator/gtk-window-decorator.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #ifndef GDK_DISABLE_DEPRECATED @@ -230,6 +232,7 @@ int double_click_action = DOUBLE_CLICK_ACTION_DEFAULT; int middle_click_action = MIDDLE_CLICK_ACTION_DEFAULT; int right_click_action = RIGHT_CLICK_ACTION_DEFAULT; int wheel_action = WHEEL_ACTION_DEFAULT; +static int DeviceButtonPressed; static gboolean minimal = FALSE; @@ -237,6 +240,50 @@ static double decoration_alpha = 0.5; #define SWITCHER_SPACE 40 +typedef struct _ResizePointer ResizePointer; +struct _ResizePointer +{ + XDevice *device; + XID deviceid; + + ResizePointer *next; +}; + +static ResizePointer *pointerHead = NULL; + +static ResizePointer +*addDevice (void) +{ + int i=0; + ResizePointer *p; + + if(pointerHead == NULL) + { + pointerHead = malloc (sizeof(ResizePointer)); + if(pointerHead == NULL) return NULL; + p = pointerHead; + } + else + { + for(p=pointerHead; p->next; p=p->next) i++; + p->next = malloc (sizeof(ResizePointer)); + if(p->next == NULL) return NULL; + p = p->next; + } + return p; +} + +static ResizePointer +*resizeFindDeviceFromDeviceid(XID deviceid) +{ + ResizePointer *dev; + for(dev=pointerHead; dev; dev=dev->next) + { + if(dev->deviceid == deviceid) break; + } + return dev; +} + static decor_extents_t _shadow_extents = { 0, 0, 0, 0 }; static decor_extents_t _win_extents = { 6, 6, 4, 6 }; static decor_extents_t _max_win_extents = { 6, 6, 4, 6 }; @@ -3489,11 +3536,66 @@ add_frame_window (WnckWindow *win, xdisplay = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); - attr.event_mask = ButtonPressMask | EnterWindowMask | LeaveWindowMask; + attr.event_mask = EnterWindowMask | LeaveWindowMask; attr.override_redirect = TRUE; gdk_error_trap_push (); + + /* *** MPX *** * + int num; + int num_pointers; + + XDeviceInfo* devs = XListInputDevices(xdisplay, &num); + XDevice **pointers = (XDevice**)calloc(sizeof(XDevice*), num); + XEventClass *evclasses = (XEventClass*)calloc(sizeof(XEventClass), num); + num_pointers = 0; + + while(num-- > 0) + { + if (devs[num].use == IsXPointer) //only care about master pointers + { + XDevice* dev = XOpenDevice(xdisplay, devs[num].id); + DeviceButtonPress(dev, DeviceButtonPressed, evclasses[num_pointers]); + pointers[num_pointers++] = dev; + } + } + + pointers = realloc(pointers, sizeof(XDevice**) * num_pointers); + evclasses = realloc(evclasses, sizeof(XEventClass) * num_pointers); + + + /*************/ + pointerHead = NULL; + + XDeviceInfo* devs; + int num; + int tempNum = 0; + + devs = XListInputDevices(xdisplay, &num); + ResizePointer *dev; + + XEventClass *evclasses = (XEventClass*)calloc(sizeof(XEventClass), num); + + while(num-- > 0) + { + if (devs[num].use == IsXPointer) + { + dev = addDevice(); + if(dev == NULL) fprintf (stderr, "FAILED\n"); + dev->device = XOpenDevice(xdisplay, devs[num].id); + dev->deviceid = devs[num].id; + dev->next = NULL; + DeviceButtonPress(dev->device, DeviceButtonPressed, evclasses[++tempNum]); + fprintf(stderr, "Add a device: %d \n", devs[num].id); + } + } + fprintf(stderr, "%d", tempNum); + evclasses = realloc(evclasses, sizeof(XEventClass) * tempNum); + + XFreeDeviceList(devs); + /* ***** */ + for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) @@ -3504,6 +3606,8 @@ add_frame_window (WnckWindow *win, 0, 0, 1, 1, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWEventMask, &attr); + + XSelectExtensionEvent(xdisplay, d->event_windows[i][j], evclasses, tempNum); /* MPX */ if (cursor[i][j].cursor) XDefineCursor (xdisplay, d->event_windows[i][j], @@ -3512,6 +3616,7 @@ add_frame_window (WnckWindow *win, } attr.event_mask |= ButtonReleaseMask; + attr.event_mask |= ButtonPressMask; for (i = 0; i < BUTTON_NUM; i++) { @@ -4021,49 +4126,59 @@ move_resize_window (WnckWindow *win, int direction, XEvent *xevent) { - Display *xdisplay; - GdkDisplay *gdkdisplay; - GdkScreen *screen; - Window xroot; - XEvent ev; + if(xevent->type == DeviceButtonPressed) //XXX should use the return type from ButtonPressMacro + { + Display *xdisplay; + GdkDisplay *gdkdisplay; + GdkScreen *screen; + Window xroot; + XEvent ev; - gdkdisplay = gdk_display_get_default (); - xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); - screen = gdk_display_get_default_screen (gdkdisplay); - xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); + gdkdisplay = gdk_display_get_default (); + xdisplay = GDK_DISPLAY_XDISPLAY (gdkdisplay); + screen = gdk_display_get_default_screen (gdkdisplay); + xroot = RootWindowOfScreen (gdk_x11_screen_get_xscreen (screen)); - if (action_menu_mapped) - { - gtk_object_destroy (GTK_OBJECT (action_menu)); - action_menu_mapped = FALSE; - action_menu = NULL; - return; - } + if (action_menu_mapped) + { + gtk_object_destroy (GTK_OBJECT (action_menu)); + action_menu_mapped = FALSE; + action_menu = NULL; + return; + } - ev.xclient.type = ClientMessage; - ev.xclient.display = xdisplay; + ev.xclient.type = ClientMessage; + ev.xclient.display = xdisplay; - ev.xclient.serial = 0; - ev.xclient.send_event = TRUE; + ev.xclient.serial = 0; + ev.xclient.send_event = TRUE; - ev.xclient.window = wnck_window_get_xid (win); - ev.xclient.message_type = wm_move_resize_atom; - ev.xclient.format = 32; + ev.xclient.window = wnck_window_get_xid (win); + ev.xclient.message_type = wm_move_resize_atom; + ev.xclient.format = 32; - ev.xclient.data.l[0] = xevent->xbutton.x_root; - ev.xclient.data.l[1] = xevent->xbutton.y_root; - ev.xclient.data.l[2] = direction; - ev.xclient.data.l[3] = xevent->xbutton.button; - ev.xclient.data.l[4] = 1; + XDeviceButtonEvent *bev = xevent; + ev.xclient.data.l[0] = bev->x_root; + ev.xclient.data.l[1] = bev->y_root; + ev.xclient.data.l[2] = direction; + ev.xclient.data.l[3] = bev->button; + ev.xclient.data.l[4] = bev->deviceid; //breaks spec, I don't care + + fprintf (stderr, "yup: %d \n", bev->deviceid); + +// XUngrabPointer (xdisplay, xevent->xbutton.time); //XXX + XUngrabKeyboard (xdisplay, xevent->xbutton.time); //XXX - XUngrabPointer (xdisplay, xevent->xbutton.time); - XUngrabKeyboard (xdisplay, xevent->xbutton.time); + ResizePointer *dev = resizeFindDeviceFromDeviceid( bev->deviceid); + + XUngrabDevice (xdisplay, dev->device , CurrentTime); XSendEvent (xdisplay, xroot, FALSE, SubstructureRedirectMask | SubstructureNotifyMask, &ev); XSync (xdisplay, FALSE); + } } static void @@ -4794,14 +4909,17 @@ frame_common_event (WnckWindow *win, int direction, XEvent *xevent) { - if (xevent->type != ButtonPress) + if(xevent->type == DeviceButtonPressed) //XXX + { + move_resize_window(win,direction,xevent); + restack_window (win, Above); + } + + if (xevent->type != DeviceButtonPressed ) return; switch (xevent->xbutton.button) { - case 1: - move_resize_window (win, direction, xevent); - restack_window (win, Above); - break; + case 1: break; case 2: handle_title_button_event (win, middle_click_action, &xevent->xbutton); @@ -5222,6 +5340,11 @@ event_filter_func (GdkXEvent *gdkxevent, break; } + if(xevent->type == DeviceButtonPressed) + {xid = (gulong) + g_hash_table_lookup (frame_table, + GINT_TO_POINTER (xevent->xbutton.window));} + if (xid) { WnckWindow *win; @@ -6832,6 +6955,8 @@ main (int argc, char *argv[]) gdkdisplay = gdk_display_get_default (); xdisplay = gdk_x11_display_get_xdisplay (gdkdisplay); gdkscreen = gdk_display_get_default_screen (gdkdisplay); + + frame_window_atom = XInternAtom (xdisplay, "_NET_FRAME_WINDOW", FALSE); win_decor_atom = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, FALSE); -- 1.5.4.2