/* Add a shortkey to a framewindow shortkey table. */ void EvalCcRqADDMENUSHORTKEY (CrossCallInfo *pcci) /* frameptr, cmd, key; no result. */ { GtkAccelGroup* accel_group; GObject* frame; GtkWidget* menu_item; guint key; printf("EvalCcRqADDMENUSHORTKEY\n"); frame = G_OBJECT(pcci->p1); menu_item = GTK_WIDGET(pcci->p2); key = (guint) pcci->p3; printf("Creating accellerators\n"); accel_group = (GtkAccelGroup*) gtk_accel_groups_from_object(frame)->data; printf("Accel groups: %p, %p\n", accel_group, gtk_accel_groups_from_object(frame)->next); gtk_widget_activate(menu_item); gtk_widget_add_accelerator(menu_item, "activate", accel_group, key, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); MakeReturn0Cci (pcci); }
void EvalCcRqREMOVEMENUSHORTKEY (CrossCallInfo *pcci) /* frameptr, cmd; no result. */ { GtkWidget *frame; GtkWidget *box; GtkWidget *menu_item; GtkAccelGroup *accel_group; printf("EvalCcRqREMOVEMENUSHORTKEY\n"); frame = GTK_WIDGET(pcci->p1); menu_item = GTK_WIDGET(pcci->p2); accel_group = ((GtkAccelGroup*)gtk_accel_groups_from_object(G_OBJECT(frame))->data); for (;;) { GtkAccelKey *key = gtk_accel_group_find(accel_group, dummy_find_accel, NULL); if (!key) break; gtk_widget_remove_accelerator(menu_item, accel_group, key->accel_key, key->accel_mods); } MakeReturn0Cci (pcci); }
int clip_GTK_ACCELGROUPSFROMOBJECT(ClipMachine * ClipMachineMemory) { C_widget *cobj = _fetch_cw_arg(ClipMachineMemory); GSList *list; CHECKCWID(cobj, GTK_IS_OBJECT); list = gtk_accel_groups_from_object((GObject *) (cobj->widget)); if (list) { ClipVar *cv = RETPTR(ClipMachineMemory); long n = g_slist_length(list); _clip_array(ClipMachineMemory, cv, 1, &n); for (n = 0; list; list = g_slist_next(list)) { C_widget *caccelg; GtkAccelGroup *accelg; accelg = list->data; caccelg = _register_widget(ClipMachineMemory, GTK_WIDGET(accelg), NULL); if (caccelg) _clip_aset(ClipMachineMemory, cv, &caccelg->obj, 1, &n); } } return 0; err: return 1; }
void accel_group_test(GtkWindow* toplevel, GtkAccelGroup* accel) { guint n_entries; gtk_accel_group_query(accel, '4', (GdkModifierType)0, &n_entries); globalOutputStream() << "grid4: " << n_entries << "\n"; globalOutputStream() << "toplevel accelgroups: " << g_slist_length(gtk_accel_groups_from_object(G_OBJECT(toplevel))) << "\n"; }
/* Send keyboard accelerators to the parent window, if necessary. * This code is heavily based on gtk_menu_key_press () */ static gboolean hildon_app_menu_key_press (GtkWidget *widget, GdkEventKey *event) { GtkWindow *parent_window; HildonAppMenuPrivate *priv; g_return_val_if_fail (HILDON_IS_APP_MENU (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_CLASS (hildon_app_menu_parent_class)->key_press_event (widget, event)) return TRUE; priv = HILDON_APP_MENU_GET_PRIVATE (widget); parent_window = priv->parent_window; if (parent_window) { guint accel_key, accel_mods; GdkModifierType consumed_modifiers; GdkDisplay *display; GSList *accel_groups; GSList *list; display = gtk_widget_get_display (widget); /* Figure out what modifiers went into determining the key symbol */ gdk_keymap_translate_keyboard_state (gdk_keymap_get_for_display (display), event->hardware_keycode, event->state, event->group, NULL, NULL, NULL, &consumed_modifiers); accel_key = gdk_keyval_to_lower (event->keyval); accel_mods = event->state & gtk_accelerator_get_default_mod_mask () & ~consumed_modifiers; /* If lowercasing affects the keysym, then we need to include SHIFT in the modifiers, * We re-upper case when we match against the keyval, but display and save in caseless form. */ if (accel_key != event->keyval) accel_mods |= GDK_SHIFT_MASK; accel_groups = gtk_accel_groups_from_object (G_OBJECT (parent_window)); for (list = accel_groups; list; list = list->next) { GtkAccelGroup *accel_group = list->data; if (gtk_accel_group_query (accel_group, accel_key, accel_mods, NULL)) { gtk_window_activate_key (parent_window, event); priv->hide_idle_id = gdk_threads_add_idle (hildon_app_menu_hide_idle, widget); break; } } } return TRUE; }
/* Insert a menu into the menu bar. */ void EvalCcRqINSERTMENU (CrossCallInfo *pcci) { gint i; gchar *title; GtkWidget *parent_menu, *root_menu, *sub_menu; GtkAccelGroup *accel_group; printf("EvalCcRqINSERTMENU\n"); title = createMnemonicString((gchar *) pcci->p3); parent_menu = GTK_WIDGET(pcci->p2); sub_menu = GTK_WIDGET(pcci->p4); if (GTK_IS_MENU_BAR(parent_menu)) { printf("Adding to a menu bar.\n"); GtkWidget *frame = gtk_widget_get_parent(gtk_widget_get_parent(parent_menu)); if (!G_IS_OBJECT(frame)) frame = gtk_widget_get_parent(parent_menu); accel_group = ((GtkAccelGroup*)gtk_accel_groups_from_object (G_OBJECT(frame))->data); } else { printf("We're not adding to a menu bar!?!\n"); accel_group = gtk_menu_get_accel_group (GTK_MENU(parent_menu)); } gtk_menu_set_accel_group (GTK_MENU(sub_menu), accel_group); root_menu = gtk_menu_item_new_with_mnemonic(title); gtk_widget_set_sensitive(root_menu, (gboolean) pcci->p1); gtk_widget_show (root_menu); gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), sub_menu); if (GTK_IS_MENU_BAR(parent_menu)) { gtk_menu_shell_insert(GTK_MENU_SHELL(parent_menu), root_menu, (gint) pcci->p5); } else { gtk_menu_insert(GTK_MENU(parent_menu), root_menu, (gint) pcci->p5); } rfree(title); MakeReturn1Cci (pcci, (int64_t) sub_menu); }
void libbalsa_window_set_accels(GtkApplicationWindow * window, GMenuModel * menu_model) { GSList *accel_groups; GtkAccelGroup *accel_group; /* Remove current accelerators: */ accel_groups = gtk_accel_groups_from_object(G_OBJECT(window)); if (accel_groups) /* Last is first... */ gtk_window_remove_accel_group(GTK_WINDOW(window), accel_groups->data); accel_group = get_accel_group(menu_model, G_ACTION_MAP(window)); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); g_object_unref(accel_group); }
gboolean check_emacs_key_theme(GtkWindow *window, GtkItemFactory *ifactory) { GtkAccelGroup *accel_group; GSList *groups; gchar *key_theme = NULL; gboolean emacs_flag = FALSE; GtkSettings *settings = gtk_settings_get_default(); g_object_get(settings, "gtk-key-theme-name", &key_theme, NULL); if (key_theme) { if (!g_ascii_strcasecmp(key_theme, "Emacs")) emacs_flag = TRUE; g_free(key_theme); } if (!emacs_flag) return FALSE; groups = gtk_accel_groups_from_object(G_OBJECT(window)); accel_group = groups->data; if (accel_group) { gtk_window_remove_accel_group(GTK_WINDOW(window), accel_group); g_object_unref(accel_group); } accel_group = gtk_accel_group_new(); gtk_rc_parse_string ( "binding \"gtk-emacs-text-entry\"" "{\n" "bind \"<ctrl>w\" { \"cut-clipboard\" () }" "}\n" ); /* gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/File/New"), accel_group, GDK_N, GDK_CONTROL_MASK); gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/File/Open..."), accel_group, GDK_O, GDK_CONTROL_MASK); gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/File/Save"), accel_group, GDK_S, GDK_CONTROL_MASK); gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/File/Save As..."), accel_group, GDK_S, GDK_SHIFT_MASK | GDK_CONTROL_MASK); #ifdef ENABLE_PRINT gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/File/Print..."), accel_group, GDK_P, GDK_CONTROL_MASK); #endif gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/Edit/Undo"), accel_group, GDK_Z, GDK_CONTROL_MASK); */ gtk_widget_add_accelerator( gtk_item_factory_get_widget(ifactory, "/Edit/Undo"), "activate", accel_group, GDK_underscore, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); /* gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/Edit/Select All"), accel_group, GDK_A, GDK_CONTROL_MASK); gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Find..."), accel_group, GDK_F, GDK_CONTROL_MASK); */ gtk_widget_add_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Find..."), "activate", accel_group, GDK_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); /* gtk_widget_add_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Find Next"), "activate", accel_group, GDK_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); */ gtk_widget_add_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"), "activate", accel_group, GDK_R, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); /* gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Replace..."), accel_group, GDK_H, GDK_CONTROL_MASK); */ gtk_widget_add_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Replace..."), "activate", accel_group, GDK_percent, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); /* gtk_widget_remove_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Jump To..."), accel_group, GDK_J, GDK_CONTROL_MASK); */ gtk_widget_add_accelerator( gtk_item_factory_get_widget(ifactory, "/Search/Jump To..."), "activate", accel_group, GDK_G, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); gtk_accel_group_connect( accel_group, GDK_X, GDK_CONTROL_MASK, 0, g_cclosure_new_swap(G_CALLBACK(emacs_key_prefix), NULL, NULL)); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); return TRUE; }
/* if simulate==TRUE, return whether accel_path can be changed to * accel_key && accel_mods. otherwise, return whether accel_path * was actually changed. */ static gboolean internal_change_entry (const gchar *accel_path, guint accel_key, GdkModifierType accel_mods, gboolean replace, gboolean simulate) { GSList *node, *slist, *win_list, *group_list, *replace_list = NULL; GHashTable *group_hm, *window_hm; gboolean change_accel, removable, can_change = TRUE, seen_accel = FALSE; GQuark entry_quark; AccelEntry *entry = accel_path_lookup (accel_path); /* not much todo if there's no entry yet */ if (!entry) { if (!simulate) { gtk_accel_map_add_entry (accel_path, 0, 0); entry = accel_path_lookup (accel_path); entry->accel_key = accel_key; entry->accel_mods = accel_mods; entry->changed = TRUE; do_accel_map_changed (entry); } return TRUE; } /* if there's nothing to change, not much todo either */ if (entry->accel_key == accel_key && entry->accel_mods == accel_mods) { if (!simulate) entry->changed = TRUE; return simulate ? TRUE : FALSE; } /* The no-change case has already been handled, so * simulate doesn't make a difference here. */ if (entry->lock_count > 0) return FALSE; /* nobody's interested, easy going */ if (!entry->groups) { if (!simulate) { entry->accel_key = accel_key; entry->accel_mods = accel_mods; entry->changed = TRUE; do_accel_map_changed (entry); } return TRUE; } /* 1) fetch all accel groups affected by this entry */ entry_quark = g_quark_try_string (entry->accel_path); group_hm = g_hash_table_new (NULL, NULL); window_hm = g_hash_table_new (NULL, NULL); for (slist = entry->groups; slist; slist = slist->next) g_hash_table_insert (group_hm, slist->data, slist->data); /* 2) collect acceleratables affected */ group_list = g_hash_table_slist_values (group_hm); for (slist = group_list; slist; slist = slist->next) { GtkAccelGroup *group = slist->data; for (node = _gtk_accel_group_get_accelerables (group); node; node = node->next) g_hash_table_insert (window_hm, node->data, node->data); } g_slist_free (group_list); /* 3) include all accel groups used by acceleratables */ win_list = g_hash_table_slist_values (window_hm); g_hash_table_destroy (window_hm); for (slist = win_list; slist; slist = slist->next) for (node = gtk_accel_groups_from_object (slist->data); node; node = node->next) g_hash_table_insert (group_hm, node->data, node->data); group_list = g_hash_table_slist_values (group_hm); g_hash_table_destroy (group_hm); /* 4) walk the acceleratables and figure whether they occupy accel_key&accel_mods */ if (accel_key) for (slist = win_list; slist; slist = slist->next) if (GTK_IS_WINDOW (slist->data)) /* bad kludge in lack of a GtkAcceleratable */ if (_gtk_window_query_nonaccels (slist->data, accel_key, accel_mods)) { seen_accel = TRUE; break; } removable = !seen_accel; /* 5) walk all accel groups and search for locks */ if (removable) for (slist = group_list; slist; slist = slist->next) { GtkAccelGroup *group = slist->data; GtkAccelGroupEntry *ag_entry; guint i, n; n = 0; ag_entry = entry->accel_key ? gtk_accel_group_query (group, entry->accel_key, entry->accel_mods, &n) : NULL; for (i = 0; i < n; i++) if (ag_entry[i].accel_path_quark == entry_quark) { can_change = !(ag_entry[i].key.accel_flags & GTK_ACCEL_LOCKED); if (!can_change) goto break_loop_step5; } n = 0; ag_entry = accel_key ? gtk_accel_group_query (group, accel_key, accel_mods, &n) : NULL; for (i = 0; i < n; i++) { seen_accel = TRUE; removable = !gtk_accel_group_get_is_locked (group) && !(ag_entry[i].key.accel_flags & GTK_ACCEL_LOCKED); if (!removable) goto break_loop_step5; if (ag_entry[i].accel_path_quark) replace_list = g_slist_prepend (replace_list, GUINT_TO_POINTER (ag_entry[i].accel_path_quark)); } } break_loop_step5: /* 6) check whether we can remove existing accelerators */ if (removable && can_change) for (slist = replace_list; slist; slist = slist->next) if (!internal_change_entry (g_quark_to_string (GPOINTER_TO_UINT (slist->data)), 0, 0, FALSE, TRUE)) { removable = FALSE; break; } /* 7) check conditions and proceed if possible */ change_accel = can_change && (!seen_accel || (removable && replace)); if (change_accel && !simulate) { /* ref accel groups */ for (slist = group_list; slist; slist = slist->next) g_object_ref (slist->data); /* 8) remove existing accelerators */ for (slist = replace_list; slist; slist = slist->next) internal_change_entry (g_quark_to_string (GPOINTER_TO_UINT (slist->data)), 0, 0, FALSE, FALSE); /* 9) install new accelerator */ entry->accel_key = accel_key; entry->accel_mods = accel_mods; entry->changed = TRUE; for (slist = group_list; slist; slist = slist->next) _gtk_accel_group_reconnect (slist->data, g_quark_from_string (entry->accel_path)); /* unref accel groups */ for (slist = group_list; slist; slist = slist->next) g_object_unref (slist->data); do_accel_map_changed (entry); } g_slist_free (replace_list); g_slist_free (group_list); g_slist_free (win_list); return change_accel; }
bool window_has_accel( ui::Window toplevel ){ return g_slist_length( gtk_accel_groups_from_object( G_OBJECT( toplevel ) ) ) != 0; }