summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaulo Zanoni <przanoni@src.gnome.org>2007-08-19 05:12:15 +0000
committerPaulo Zanoni <przanoni@src.gnome.org>2007-08-19 05:12:15 +0000
commitb41c8538b6e644bbc3a9fc01d7e008dd2bc3e2f9 (patch)
tree99a6c339f4db8faa3705692efe501639170478c0
parent63ae18084cd580bf2651bc4c4fd152d9c4233ec2 (diff)
downloadmetacity-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.h6
-rw-r--r--src/devices.c23
-rw-r--r--src/devices.h85
-rw-r--r--src/display.c51
-rw-r--r--src/display.h9
-rw-r--r--src/frame.c2
-rw-r--r--src/screen.c1
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");