Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin@sipsolutions.net>2008-08-24 12:31:46 (GMT)
committer Benjamin Berg <benjamin@sipsolutions.net>2008-08-24 12:31:46 (GMT)
commit3d3e453157ec8c1b107fac2bca5c46681c6cb0ad (patch)
tree8dd8b4b410dbf0253846a6fbd3f83b90b20a66c4 /src
parenta73cbc351d15afbf44a9f9c6c44e981b36805082 (diff)
Change the API of the keygrabber so only one gdk_sync is neccessary. (ticket #7999)
Diffstat (limited to 'src')
-rw-r--r--src/sugar/_sugarext.defs6
-rw-r--r--src/sugar/_sugarext.override45
-rw-r--r--src/sugar/sugar-key-grabber.c39
-rw-r--r--src/sugar/sugar-key-grabber.h4
4 files changed, 73 insertions, 21 deletions
diff --git a/src/sugar/_sugarext.defs b/src/sugar/_sugarext.defs
index 6e741dc..87d629f 100644
--- a/src/sugar/_sugarext.defs
+++ b/src/sugar/_sugarext.defs
@@ -102,12 +102,12 @@
(return-type "GType")
)
-(define-method grab
+(define-method grab_keys
(of-object "SugarKeyGrabber")
- (c-name "sugar_key_grabber_grab")
+ (c-name "sugar_key_grabber_grab_keys")
(return-type "none")
(parameters
- '("const-char*" "key")
+ '("const-char*[]" "keys")
)
)
diff --git a/src/sugar/_sugarext.override b/src/sugar/_sugarext.override
index dc54de0..b993600 100644
--- a/src/sugar/_sugarext.override
+++ b/src/sugar/_sugarext.override
@@ -33,3 +33,48 @@ ignore-glob
*_get_type
_*
%%
+override sugar_key_grabber_grab_keys kwargs
+static PyObject *
+_wrap_sugar_key_grabber_grab_keys(PyGObject *self, PyObject *args, PyObject *kwargs)
+{
+ static char *kwlist[] = { "key", NULL };
+ PyObject *py_keys;
+ char **keys;
+ int i, len;
+
+ if (!PyArg_ParseTupleAndKeywords(args,kwargs,
+ "O:SugarKeyGrabber.grab_keys",
+ kwlist, &py_keys))
+ return NULL;
+
+ if (!PySequence_Check(py_keys) || (len = PySequence_Size(py_keys)) < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "keys should be a sequence of strings");
+ return NULL;
+ }
+
+ keys = g_new(char*, len + 1);
+ for (i = 0; i < len; i++) {
+ PyObject *item = PySequence_GetItem(py_keys, i);
+ if (!item) {
+ g_free(keys);
+ return NULL;
+ }
+ if (!PyString_Check(item)) {
+ PyErr_SetString(PyExc_TypeError, "key must be a string");
+ g_free(keys);
+ Py_DECREF(item);
+ return NULL;
+ }
+ keys[i] = PyString_AsString(item);
+ Py_DECREF(item);
+ }
+ keys[len] = NULL;
+
+ sugar_key_grabber_grab_keys (SUGAR_KEY_GRABBER(self->obj), (const char**) keys);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+%%
diff --git a/src/sugar/sugar-key-grabber.c b/src/sugar/sugar-key-grabber.c
index 8e18c86..89b743f 100644
--- a/src/sugar/sugar-key-grabber.c
+++ b/src/sugar/sugar-key-grabber.c
@@ -155,21 +155,15 @@ sugar_key_grabber_init(SugarKeyGrabber *grabber)
* gnome-control-center/gnome-settings-daemon/gnome-settings-multimedia-keys.c
*/
-static gboolean
+static void
grab_key_real (Key *key, GdkWindow *root, gboolean grab, int result)
{
- gdk_error_trap_push ();
if (grab)
XGrabKey (GDK_DISPLAY(), key->keycode, (result | key->state),
GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync);
else
XUngrabKey(GDK_DISPLAY(), key->keycode, (result | key->state),
GDK_WINDOW_XID (root));
- gdk_flush ();
-
- gdk_error_trap_pop ();
-
- return TRUE;
}
#define N_BITS 32
@@ -198,24 +192,37 @@ grab_key (SugarKeyGrabber *grabber, Key *key, gboolean grab)
result |= (1<<indexes[j]);
}
- if (grab_key_real (key, grabber->root, grab, result) == FALSE)
- return;
+ grab_key_real (key, grabber->root, grab, result);
}
}
+
void
-sugar_key_grabber_grab(SugarKeyGrabber *grabber, const char *key)
+sugar_key_grabber_grab_keys(SugarKeyGrabber *grabber, const char **keys)
{
+ char **cur = keys;
+ char *key;
Key *keyinfo;
- keyinfo = g_new0 (Key, 1);
- keyinfo->key = g_strdup(key);
- egg_accelerator_parse_virtual (key, &keyinfo->keysym,
- &keyinfo->keycode, &keyinfo->state);
+ gdk_error_trap_push();
+
+ while (*cur != NULL) {
+ key = *cur;
+ cur += 1;
+
+ keyinfo = g_new0 (Key, 1);
+ keyinfo->key = g_strdup(key);
+
+ egg_accelerator_parse_virtual (key, &keyinfo->keysym,
+ &keyinfo->keycode, &keyinfo->state);
+
+ grab_key(grabber, keyinfo, TRUE);
- grab_key(grabber, keyinfo, TRUE);
+ grabber->keys = g_list_append(grabber->keys, keyinfo);
+ }
- grabber->keys = g_list_append(grabber->keys, keyinfo);
+ gdk_flush();
+ gdk_error_trap_push();
}
gboolean
diff --git a/src/sugar/sugar-key-grabber.h b/src/sugar/sugar-key-grabber.h
index f131ee3..ab02870 100644
--- a/src/sugar/sugar-key-grabber.h
+++ b/src/sugar/sugar-key-grabber.h
@@ -55,8 +55,8 @@ struct _SugarKeyGrabberClass {
};
GType sugar_key_grabber_get_type (void);
-void sugar_key_grabber_grab (SugarKeyGrabber *grabber,
- const char *key);
+void sugar_key_grabber_grab_keys (SugarKeyGrabber *grabber,
+ const char **keys);
char *sugar_key_grabber_get_key (SugarKeyGrabber *grabber,
guint keycode,
guint state);