diff options
author | Paulo Zanoni <przanoni@src.gnome.org> | 2007-08-19 05:12:15 +0000 |
---|---|---|
committer | Paulo Zanoni <przanoni@src.gnome.org> | 2007-08-19 05:12:15 +0000 |
commit | b41c8538b6e644bbc3a9fc01d7e008dd2bc3e2f9 (patch) | |
tree | 99a6c339f4db8faa3705692efe501639170478c0 | |
parent | 63ae18084cd580bf2651bc4c4fd152d9c4233ec2 (diff) | |
download | metacity-b41c8538b6e644bbc3a9fc01d7e008dd2bc3e2f9.tar.gz |
- Fixed a memory leak
- Fixed bugs that happened when the number of keyboards was different than the
number of mice
- Fixed a bug with key events
- Changed the way we store paired devices
- More debug info...
- Discovered that reason we're not getting the button events when someone clicks
a window (not window frame). This only happens with applications that have
implicit grabs on the mouse: happens with xterm, doesn't happen with xeyes. It
is not a problem with metacity: it is a "feature" of mpx. Won't be solved for
now...
- Added useless code that will be used in the next commit, when we'll allow
multiple operations at the same time.
svn path=/branches/multiple_pointer_x/; revision=3306
-rw-r--r-- | src/common.h | 6 | ||||
-rw-r--r-- | src/devices.c | 23 | ||||
-rw-r--r-- | src/devices.h | 85 | ||||
-rw-r--r-- | src/display.c | 51 | ||||
-rw-r--r-- | src/display.h | 9 | ||||
-rw-r--r-- | src/frame.c | 2 | ||||
-rw-r--r-- | src/screen.c | 1 |
7 files changed, 111 insertions, 66 deletions
diff --git a/src/common.h b/src/common.h index 3cfb1b50..6845214f 100644 --- a/src/common.h +++ b/src/common.h @@ -84,8 +84,11 @@ typedef struct _MetaWindowMenu MetaWindowMenu; #ifdef MPX /* This was defined here so I don't need to include devices.h on this file */ typedef struct _MetaDevInfo MetaDevInfo; -/* XXX */ +/* Stuff moved from display.h to here! */ typedef struct _MetaDisplay MetaDisplay; +typedef struct _MetaScreen MetaScreen; +typedef struct _MetaWindow MetaWindow; +typedef struct MetaEdgeResistanceData MetaEdgeResistanceData; typedef void (* MetaWindowMenuFunc) (MetaWindowMenu *menu, Display *xdisplay, @@ -109,6 +112,7 @@ typedef void (* MetaWindowMenuFunc) (MetaWindowMenu *menu, /* when changing this enum, there are various switch statements * you have to update */ +/* There is now one operation per device pair! Remember! */ typedef enum { META_GRAB_OP_NONE, diff --git a/src/devices.c b/src/devices.c index d873cfdc..54a4eff9 100644 --- a/src/devices.c +++ b/src/devices.c @@ -82,13 +82,19 @@ meta_devices_find_keyboard_by_id (MetaDisplay *display, MetaDevInfo* meta_devices_find_paired_mouse (MetaDisplay *display, XID id) { - int i; + int i, j; for (i = 0; i < display->devices->keybsUsed; i++) if (id == display->devices->keyboards[i].xdev->device_id) - return &display->devices->pairedPointers[i]; - - meta_warning("Error! Could not find mouse paired with keyboard XID = %d\n", + { + for (j = 0; j < display->devices->miceUsed; j++) + if (display->devices->pairedPointers[i] == + display->devices->mice[j].xdev->device_id) + return &display->devices->mice[j]; + } + + meta_warning("Error! Could not find mouse paired with keyboard XID = %d." + " This should never happen!!!.\n", (int) id); return NULL; @@ -97,15 +103,18 @@ meta_devices_find_paired_mouse (MetaDisplay *display, XID id) MetaDevInfo* meta_devices_find_paired_keyboard (MetaDisplay *display, XID id) { + + /* FIXME: there can be more than one keyboard paired with the mouse... */ int i; for (i = 0; i < display->devices->keybsUsed; i++) - if (id == display->devices->pairedPointers[i].xdev->device_id) + if (id == display->devices->pairedPointers[i]) return &display->devices->keyboards[i]; - meta_warning("Error! Could not find keyboard paired with mouse XID = %d\n", + meta_warning("Could not find keyboard paired with mouse XID = %d." + " Using another device.\n", (int) id); - return NULL; + return &display->devices->keyboards[0]; } #endif diff --git a/src/devices.h b/src/devices.h index 73adff4d..9dce947b 100644 --- a/src/devices.h +++ b/src/devices.h @@ -29,52 +29,93 @@ #include <X11/extensions/XInput.h> #include "common.h" -/* #include "display.h" XXX ? */ +#include "boxes.h" -/* By default, the MetaDevInfo lists have size 8. Almost no client has more - * than 8 mice or keyboards... */ -/* FIXME setting this define to 1 or 2 causes memory corruption!!!! */ -#define DEFAULT_INPUT_ARRAY_SIZE 8 +/* By default, the MetaDevInfo lists have size 4. Almost no client has more + * than 4 mice or keyboards... */ +#define DEFAULT_INPUT_ARRAY_SIZE 4 typedef struct _MetaDevices MetaDevices; /* typedef struct _MetaDevInfo MetaDevInfo; This guy was declared at common.h */ +typedef struct _MetaGrabOpInfo MetaGrabOpInfo; + /* TODO: create MetaPtrInfo and MetaKbdInfo, so that you can differentiate it * and force correct type using in function prototypes */ +#if 0 +--> To be used soon!! (next commit) +struct _MetaGrabOpInfo +{ + /* current window operation */ + MetaGrabOp op; + MetaScreen *screen; + MetaWindow *window; + Window xwindow; + int button; + int anchor_root_x; + int anchor_root_y; + MetaRectangle anchor_window_pos; + int latest_motion_x; + int latest_motion_y; + gulong mask; + guint have_pointer : 1; + guint grabbed_pointer : 1; + guint have_keyboard : 1; + guint wireframe_active : 1; + guint was_cancelled : 1; /* Only used in wireframe mode */ + guint frame_action : 1; + MetaRectangle wireframe_rect; + MetaRectangle wireframe_last_xor_rect; + MetaRectangle initial_window_pos; + int initial_x, grab_initial_y; /* These are only relevant for */ + gboolean threshold_movement_reached; /* raise_on_click == FALSE. */ + MetaResizePopup *resize_popup; + GTimeVal last_moveresize_time; + guint32 motion_notify_time; + int wireframe_last_display_width; + int wireframe_last_display_height; + GList* old_window_stacking; + MetaEdgeResistanceData *edge_resistance_data; + unsigned int last_user_action_was_snap; +}; +#endif + struct _MetaDevInfo { - XDevice *xdev; - gchar *name; + XDevice *xdev; + gchar *name; + MetaGrabOpInfo *grab_op; }; struct _MetaDevices { MetaDevInfo *mice; - int miceUsed; - int miceSize; + int miceUsed; + int miceSize; MetaDevInfo *keyboards; - int keybsUsed; /* XXX :%s/keybsUsed/kbdsUsed/g or something else? */ - int keybsSize; /* I don't like "keybs" */ - MetaDevInfo *pairedPointers; + int keybsUsed; /* XXX :%s/keybsUsed/kbdsUsed/g or something else? */ + int keybsSize; /* I don't like "keybs" */ + XID *pairedPointers; /* indexed by the keyboards! */ + /* TODO: consider creating a structure to store the pairs!! */ }; -MetaDevInfo* meta_devices_find_mouse_by_name (MetaDisplay *display, - gchar *name); +MetaDevInfo* meta_devices_find_mouse_by_name (MetaDisplay *display, + gchar *name); -MetaDevInfo* meta_devices_find_mouse_by_id (MetaDisplay *display, - XID id); +MetaDevInfo* meta_devices_find_mouse_by_id (MetaDisplay *display, + XID id); -MetaDevInfo* meta_devices_find_keyboard_by_id (MetaDisplay *display, - XID id); +MetaDevInfo* meta_devices_find_keyboard_by_id (MetaDisplay *display, + XID id); -MetaDevInfo* meta_devices_find_paired_mouse (MetaDisplay *display, - XID id); +MetaDevInfo* meta_devices_find_paired_mouse (MetaDisplay *display, + XID id); -MetaDevInfo* meta_devices_find_paired_keyboard (MetaDisplay *display, - XID id); +MetaDevInfo* meta_devices_find_paired_keyboard (MetaDisplay *display, + XID id); #else #error "This branch will ONLY compile if you enable --enable-mpx!" diff --git a/src/display.c b/src/display.c index 94c415ed..ef7b5d7d 100644 --- a/src/display.c +++ b/src/display.c @@ -533,8 +533,8 @@ meta_display_open (void) { /* Check to see the available input devices */ - XDeviceInfo *devsInfo, *devInfo, *auxDevsInfo, *auxDevInfo; - int howManyDevices, i, j; + XDeviceInfo *devsInfo, *devInfo; + int howManyDevices, i; XID pDevId; XDevice *kDev; @@ -548,8 +548,8 @@ meta_display_open (void) /* We should register ourselves as the pairing client here * XXX XRegisterPairingClient */ - d->mice = g_malloc(sizeof(XID) * DEFAULT_INPUT_ARRAY_SIZE); - d->keyboards = g_malloc(sizeof(XID) * DEFAULT_INPUT_ARRAY_SIZE); + d->mice = g_malloc(sizeof(MetaDevInfo) * DEFAULT_INPUT_ARRAY_SIZE); + d->keyboards = g_malloc(sizeof(MetaDevInfo) * DEFAULT_INPUT_ARRAY_SIZE); d->pairedPointers = g_malloc(sizeof(XID) * DEFAULT_INPUT_ARRAY_SIZE); d->miceUsed = 0; @@ -566,9 +566,8 @@ meta_display_open (void) { if (d->keybsUsed == d->keybsSize) { - /* FIXME This is broken! See comment in devices.h! */ d->keyboards = g_realloc (d->keyboards, - sizeof(XID) * (d->keybsSize + DEFAULT_INPUT_ARRAY_SIZE)); + sizeof(MetaDevInfo) * (d->keybsSize + DEFAULT_INPUT_ARRAY_SIZE)); d->pairedPointers = g_realloc(d->pairedPointers, sizeof(XID) * (d->keybsSize + DEFAULT_INPUT_ARRAY_SIZE)); d->keybsSize += DEFAULT_INPUT_ARRAY_SIZE; @@ -580,36 +579,21 @@ meta_display_open (void) d->keyboards[d->keybsUsed].xdev = kDev; d->keyboards[d->keybsUsed].name = g_strdup_printf("%s", devInfo->name); + d->keyboards[d->keybsUsed].grab_op = NULL; XGetPairedPointer(display->xdisplay, kDev, &pDevId); - meta_warning("opening paired device id %d\n", - (int)pDevId); /* XXX */ - open = XOpenDevice(display->xdisplay, pDevId); - d->pairedPointers[d->keybsUsed].xdev = open; - - /* Look in the device list for a device with the id pDevId - * and then find its name */ - auxDevsInfo = devsInfo; - for (j = 0; j < howManyDevices; j++) - { - auxDevInfo = &auxDevsInfo[j]; - if (auxDevInfo->id == pDevId) - break; + d->pairedPointers[d->keybsUsed] = pDevId; + meta_warning(" its paired device has id %d\n", + (int)pDevId); - } - /* XXX if howManyDevices < 1, auxDevInfo is invalid and we will - * segfault here... */ - d->pairedPointers[d->keybsUsed].name = - g_strdup_printf("%s", auxDevInfo->name); d->keybsUsed++; - meta_warning(" device name = %s\n", auxDevInfo->name); /* XXX */ } else if (devInfo->use == IsXExtensionPointer) { if (d->miceUsed == d->miceSize) { d->mice = g_realloc(d->mice, - sizeof(XID) * (d->miceSize + DEFAULT_INPUT_ARRAY_SIZE)); + sizeof(MetaDevInfo) * (d->miceSize + DEFAULT_INPUT_ARRAY_SIZE)); d->miceSize += DEFAULT_INPUT_ARRAY_SIZE; } meta_warning("opening device id %d, name %s\n", @@ -617,6 +601,7 @@ meta_display_open (void) open = XOpenDevice(display->xdisplay, devInfo->id); d->mice[d->miceUsed].xdev = open; d->mice[d->miceUsed].name = g_strdup_printf("%s", devInfo->name); + d->mice[d->miceUsed].grab_op = NULL; d->miceUsed++; } } @@ -1574,7 +1559,7 @@ event_callback (XEvent *event, XDeviceButtonPressedEvent *xdbe; xdbe = (XDeviceButtonPressedEvent *)event; meta_warning("event_callback: XDeviceButtonPress received... XID = %d\n", - xdbe->deviceid); + (int)xdbe->deviceid); // return 0; } /* XXX */ @@ -2818,6 +2803,10 @@ event_get_modified_window (MetaDisplay *display, } #endif + if (event->type == display->dev_key_press_type) + return ((XDeviceKeyPressedEvent *)event)->window; + if (event->type == display->dev_key_release_type) + return ((XDeviceKeyReleasedEvent *)event)->window; if (event->type == display->dev_btn_press_type) return ((XDeviceButtonPressedEvent *)event)->window; else if (event->type == display->dev_btn_release_type) @@ -3578,9 +3567,9 @@ meta_display_set_grab_op_cursor (MetaDisplay *display, DeviceButtonPress (dev->xdev, display->dev_btn_press_type, evclasses[0]); /* XXX use 0!! */ -// meta_warning("display->dev_btn_press_type = %d\n", display->dev_btn_press_type); -// if (display->dev_btn_press_type == 0) -// meta_warning("AQUIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n"); + //meta_warning("display->dev_btn_press_type = %d\n", display->dev_btn_press_type); + if (display->dev_btn_press_type == 0) + meta_warning("HEREEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n"); DeviceButtonRelease (dev->xdev, display->dev_btn_release_type, evclasses[1]); DeviceMotionNotify (dev->xdev, display->dev_motion_notify_type, @@ -4164,7 +4153,7 @@ meta_change_button_grab (MetaDisplay *display, DeviceButtonPress (dev->xdev, display->dev_btn_press_type, evclasses[0]); -// meta_warning("display->dev_btn_press_type = %d\n", display->dev_btn_press_type); + //meta_warning("display->dev_btn_press_type = %d\n", display->dev_btn_press_type); if (display->dev_btn_press_type == 0) meta_warning("DOOOOOOOOOOODOOOOOOOOOOCAAAAAAACAAAAAAAAA!!\n"); DeviceButtonRelease (dev->xdev, display->dev_btn_release_type, diff --git a/src/display.h b/src/display.h index 02c286da..075bdd6e 100644 --- a/src/display.h +++ b/src/display.h @@ -55,16 +55,16 @@ typedef struct MetaCompositor MetaCompositor; /* typedef struct _MetaDisplay MetaDisplay; XXX */ typedef struct _MetaFrame MetaFrame; typedef struct _MetaKeyBinding MetaKeyBinding; -typedef struct _MetaScreen MetaScreen; +//typedef struct _MetaScreen MetaScreen; typedef struct _MetaStack MetaStack; typedef struct _MetaUISlave MetaUISlave; -typedef struct _MetaWindow MetaWindow; +//typedef struct _MetaWindow MetaWindow; typedef struct _MetaWorkspace MetaWorkspace; typedef struct _MetaWindowPropHooks MetaWindowPropHooks; typedef struct _MetaGroupPropHooks MetaGroupPropHooks; -typedef struct MetaEdgeResistanceData MetaEdgeResistanceData; +//typedef struct MetaEdgeResistanceData MetaEdgeResistanceData; typedef void (* MetaWindowPingFunc) (MetaDisplay *display, Window xwindow, @@ -254,7 +254,7 @@ struct _MetaDisplay /* Alt+click button grabs */ unsigned int window_grab_modifiers; - +//#if 0 /* current window operation */ MetaGrabOp grab_op; MetaScreen *grab_screen; @@ -286,6 +286,7 @@ struct _MetaDisplay GList* grab_old_window_stacking; MetaEdgeResistanceData *grab_edge_resistance_data; unsigned int grab_last_user_action_was_snap; +//#endif /* we use property updates as sentinels for certain window focus events * to avoid some race conditions on EnterNotify events diff --git a/src/frame.c b/src/frame.c index 03b96e15..8fb7d012 100644 --- a/src/frame.c +++ b/src/frame.c @@ -171,7 +171,7 @@ meta_window_ensure_frame (MetaWindow *window) } /* XXX Should these be called with the keybs as arguments? */ - for (idev = 0; idev < window->display->devices->miceUsed; idev++) + for (idev = 0; idev < window->display->devices->keybsUsed; idev++) { DeviceFocusIn (window->display->devices->keyboards[idev].xdev, window->display->dev_focus_in_type, diff --git a/src/screen.c b/src/screen.c index 8afe50ec..adb65008 100644 --- a/src/screen.c +++ b/src/screen.c @@ -528,6 +528,7 @@ meta_screen_new (MetaDisplay *display, display->dev_key_press_type, evclasses[nclasses]); nclasses++; + meta_warning("DEVICE_KEY_PRESS_TYPE = %d\n", display->dev_key_press_type); if (display->dev_key_press_type == 0) { meta_warning("MAPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULULULULU\n"); |