From 34a7ee18749e258ef4c095ed6a7596462f0badde Mon Sep 17 00:00:00 2001 From: Julien Bonjean <julien@bonjean.info> Date: Fri, 5 Mar 2010 16:44:53 -0500 Subject: [PATCH] [#2916] Fixed hashmap update for shortcuts --- sflphone-client-gnome/src/shortcuts.c | 171 ++++++++++++++------------ 1 file changed, 89 insertions(+), 82 deletions(-) diff --git a/sflphone-client-gnome/src/shortcuts.c b/sflphone-client-gnome/src/shortcuts.c index 44ba711b23..e52e5f109b 100644 --- a/sflphone-client-gnome/src/shortcuts.c +++ b/sflphone-client-gnome/src/shortcuts.c @@ -43,27 +43,28 @@ static GHashTable* shortcutsMap; */ static void -pick_up_callback() +pick_up_callback () { - sflphone_pick_up(); + sflphone_pick_up (); } static void -hang_up_callback() +hang_up_callback () { - sflphone_hang_up(); + sflphone_hang_up (); } static void -popup_window_callback() +popup_window_callback () { - gtk_widget_hide(GTK_WIDGET(get_main_window())); - gtk_widget_show(GTK_WIDGET(get_main_window())); - gtk_window_move (GTK_WINDOW (get_main_window ()), dbus_get_window_position_x (), dbus_get_window_position_y ()); + gtk_widget_hide (GTK_WIDGET(get_main_window())); + gtk_widget_show (GTK_WIDGET(get_main_window())); + gtk_window_move (GTK_WINDOW (get_main_window ()), + dbus_get_window_position_x (), dbus_get_window_position_y ()); } static void -default_callback() +default_callback () { ERROR("Missing shortcut callback"); } @@ -72,15 +73,15 @@ default_callback() * return callback corresponding to a specific action */ static void* -get_action_callback(const gchar* action) +get_action_callback (const gchar* action) { - if(strcmp(action, "pick_up") == 0) + if (strcmp (action, "pick_up") == 0) return pick_up_callback; - if(strcmp(action, "hang_up") == 0) + if (strcmp (action, "hang_up") == 0) return hang_up_callback; - if(strcmp(action, "popup_window") == 0) + if (strcmp (action, "popup_window") == 0) return popup_window_callback; return default_callback; @@ -94,13 +95,13 @@ get_action_callback(const gchar* action) * Remove all existing bindings */ static void -remove_bindings() +remove_bindings () { GdkDisplay *display; GdkScreen *screen; GdkWindow *root; - display = gdk_display_get_default(); + display = gdk_display_get_default (); int i = 0; int j = 0; @@ -108,15 +109,15 @@ remove_bindings() { if (accelerators_list[i].value != 0) { - for (j = 0; j < gdk_display_get_n_screens(display); j++) + for (j = 0; j < gdk_display_get_n_screens (display); j++) { - screen = gdk_display_get_screen(display, j); + screen = gdk_display_get_screen (display, j); if (screen != NULL) { - root = gdk_screen_get_root_window(screen); - ungrab_key(accelerators_list[i].value, root); - gdk_window_remove_filter(root, filter_keys, NULL); + root = gdk_screen_get_root_window (screen); + ungrab_key (accelerators_list[i].value, root); + gdk_window_remove_filter (root, filter_keys, NULL); } } } @@ -129,13 +130,13 @@ remove_bindings() * Create all bindings, using stored configuration */ static void -create_bindings() +create_bindings () { GdkDisplay *display; GdkScreen *screen; GdkWindow *root; - display = gdk_display_get_default(); + display = gdk_display_get_default (); int i = 0; int j = 0; @@ -143,23 +144,20 @@ create_bindings() { if (accelerators_list[i].value != 0) { - // update value in hashtable (used for dbus calls) - g_hash_table_replace(shortcutsMap, g_strdup(accelerators_list[i].action), - GINT_TO_POINTER(accelerators_list[i].value)); - // updated GDK bindings - for (j = 0; j < gdk_display_get_n_screens(display); j++) + for (j = 0; j < gdk_display_get_n_screens (display); j++) { - screen = gdk_display_get_screen(display, j); + screen = gdk_display_get_screen (display, j); if (screen != NULL) { - root = gdk_screen_get_root_window(screen); - grab_key(accelerators_list[i].value, root); - gdk_window_add_filter(root, filter_keys, NULL); + root = gdk_screen_get_root_window (screen); + grab_key (accelerators_list[i].value, root); + gdk_window_add_filter (root, filter_keys, NULL); } } } + i++; } } @@ -168,13 +166,13 @@ create_bindings() * Initialize a specific binding */ static void -initialize_binding(const gchar* action, const guint code) +initialize_binding (const gchar* action, const guint code) { //initialize_shortcuts_keys(); int index = 0; while (accelerators_list[index].action != NULL) { - if (strcmp(action, accelerators_list[index].action) == 0) + if (strcmp (action, accelerators_list[index].action) == 0) { break; } @@ -191,18 +189,19 @@ initialize_binding(const gchar* action, const guint code) accelerators_list[index].value = code; // update bindings - create_bindings(); + create_bindings (); } /* * Prepare accelerators list */ static void -initialize_accelerators_list() +initialize_accelerators_list () { - GList* shortcutsKeys = g_hash_table_get_keys(shortcutsMap); + GList* shortcutsKeys = g_hash_table_get_keys (shortcutsMap); - accelerators_list = (Accelerator*)malloc((g_list_length(shortcutsKeys) + 1) *sizeof(Accelerator)); + accelerators_list = (Accelerator*) malloc ( + (g_list_length (shortcutsKeys) + 1) * sizeof(Accelerator)); GList* shortcutsKeysElement; int index = 0; @@ -211,8 +210,8 @@ initialize_accelerators_list() { gchar* action = shortcutsKeysElement->data; - accelerators_list[index].action = g_strdup(action); - accelerators_list[index].callback = get_action_callback(action); + accelerators_list[index].action = g_strdup (action); + accelerators_list[index].callback = get_action_callback (action); accelerators_list[index].mask = 0; accelerators_list[index].value = 0; @@ -234,43 +233,48 @@ initialize_accelerators_list() * Update current bindings with a new value */ void -shortcuts_update_bindings(const guint index, const guint code) +shortcuts_update_bindings (const guint index, const guint code) { // first remove all existing bindings - remove_bindings(); + remove_bindings (); // store new value accelerators_list[index].value = code; + // update value in hashtable (used for dbus calls) + g_hash_table_replace (shortcutsMap, + g_strdup (accelerators_list[index].action), GINT_TO_POINTER ( + accelerators_list[index].value)); + // recreate all bindings - create_bindings(); + create_bindings (); // update configuration - dbus_set_shortcuts(shortcutsMap); + dbus_set_shortcuts (shortcutsMap); } /* * Initialize bindings with configuration retrieved from dbus */ void -shortcuts_initialize_bindings() +shortcuts_initialize_bindings () { // get shortcuts stored in config through dbus - shortcutsMap = dbus_get_shortcuts(); + shortcutsMap = dbus_get_shortcuts (); // initialize list of keys - initialize_accelerators_list(); + initialize_accelerators_list (); // iterate through keys to initialize bindings - GList* shortcutsKeys = g_hash_table_get_keys(shortcutsMap); + GList* shortcutsKeys = g_hash_table_get_keys (shortcutsMap); GList* shortcutsKeysElement; for (shortcutsKeysElement = shortcutsKeys; shortcutsKeysElement; shortcutsKeysElement = shortcutsKeysElement->next) { gchar* key = shortcutsKeysElement->data; - int shortcut = (size_t) g_hash_table_lookup(shortcutsMap, key); - if(shortcut != 0) - initialize_binding(key, shortcut); + int shortcut = (size_t) g_hash_table_lookup (shortcutsMap, key); + if (shortcut != 0) + initialize_binding (key, shortcut); } } @@ -278,23 +282,23 @@ shortcuts_initialize_bindings() * Initialize bindings with configuration retrieved from dbus */ void -shortcuts_destroy_bindings() +shortcuts_destroy_bindings () { // remove bindings - remove_bindings(); + remove_bindings (); // free pointers int index = 0; while (accelerators_list[index].action != NULL) { - g_free(accelerators_list[index].action); + g_free (accelerators_list[index].action); index++; } - free(accelerators_list); + free (accelerators_list); } Accelerator* -shortcuts_get_list() +shortcuts_get_list () { return accelerators_list; } @@ -307,7 +311,7 @@ shortcuts_get_list() * filter used when an event is catched */ static GdkFilterReturn -filter_keys(GdkXEvent *xevent, GdkEvent *event, gpointer data) +filter_keys (GdkXEvent *xevent, GdkEvent *event, gpointer data) { XEvent *xev; XKeyEvent *key; @@ -330,7 +334,7 @@ filter_keys(GdkXEvent *xevent, GdkEvent *event, gpointer data) accelerators_list[i].value); // call associated callback function - accelerators_list[i].callback(); + accelerators_list[i].callback (); return GDK_FILTER_REMOVE; } @@ -345,22 +349,25 @@ filter_keys(GdkXEvent *xevent, GdkEvent *event, gpointer data) * Remove key "catcher" from GDK layer */ static void -ungrab_key(int key_code, GdkWindow *root) +ungrab_key (int key_code, GdkWindow *root) { - gdk_error_trap_push(); - - XUngrabKey(GDK_DISPLAY(), key_code, 0, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, Mod2Mask, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, Mod5Mask, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, LockMask, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, Mod2Mask | LockMask, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, Mod5Mask | LockMask, GDK_WINDOW_XID(root)); - XUngrabKey(GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask | LockMask, + gdk_error_trap_push (); + + XUngrabKey (GDK_DISPLAY(), key_code, 0, GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, Mod2Mask, GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, Mod5Mask, GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, LockMask, GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask, + GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, Mod2Mask | LockMask, + GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, Mod5Mask | LockMask, + GDK_WINDOW_XID(root)); + XUngrabKey (GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask | LockMask, GDK_WINDOW_XID(root)); - gdk_flush(); - if (gdk_error_trap_pop()) + gdk_flush (); + if (gdk_error_trap_pop ()) { ERROR("Error ungrabbing key"); } @@ -370,30 +377,30 @@ ungrab_key(int key_code, GdkWindow *root) * Add key "catcher" to GDK layer */ static void -grab_key(int key_code, GdkWindow *root) +grab_key (int key_code, GdkWindow *root) { - gdk_error_trap_push(); + gdk_error_trap_push (); - XGrabKey(GDK_DISPLAY(), key_code, 0, GDK_WINDOW_XID(root), True, + XGrabKey (GDK_DISPLAY(), key_code, 0, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, Mod2Mask, GDK_WINDOW_XID(root), True, + XGrabKey (GDK_DISPLAY(), key_code, Mod2Mask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, Mod5Mask, GDK_WINDOW_XID(root), True, + XGrabKey (GDK_DISPLAY(), key_code, Mod5Mask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, LockMask, GDK_WINDOW_XID(root), True, + XGrabKey (GDK_DISPLAY(), key_code, LockMask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask, GDK_WINDOW_XID(root), + XGrabKey (GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, Mod2Mask | LockMask, GDK_WINDOW_XID(root), + XGrabKey (GDK_DISPLAY(), key_code, Mod2Mask | LockMask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, Mod5Mask | LockMask, GDK_WINDOW_XID(root), + XGrabKey (GDK_DISPLAY(), key_code, Mod5Mask | LockMask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - XGrabKey(GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask | LockMask, + XGrabKey (GDK_DISPLAY(), key_code, Mod2Mask | Mod5Mask | LockMask, GDK_WINDOW_XID(root), True, GrabModeAsync, GrabModeAsync); - gdk_flush(); - if (gdk_error_trap_pop()) + gdk_flush (); + if (gdk_error_trap_pop ()) { ERROR("Error grabbing key"); } -- GitLab