📄 gtkitemfactory.c
字号:
accel_key = gtk_label_parse_uline (GTK_LABEL (label), name); if (accel_key != GDK_VoidSymbol) { if (GTK_IS_MENU_BAR (parent)) gtk_widget_add_accelerator (widget, "activate_item", ifactory->accel_group, accel_key, GDK_MOD1_MASK, GTK_ACCEL_LOCKED); if (GTK_IS_MENU (parent)) gtk_widget_add_accelerator (widget, "activate_item", gtk_menu_ensure_uline_accel_group (GTK_MENU (parent)), accel_key, 0, GTK_ACCEL_LOCKED); } } g_free (name); if (type_id == quark_type_branch || type_id == quark_type_last_branch) { if (entry->callback) g_warning ("gtk_item_factory_create_item(): Can't specify a callback on a branch: \"%s\"", entry->path); if (type_id == quark_type_last_branch) gtk_menu_item_right_justify (GTK_MENU_ITEM (widget)); parent = widget; widget = gtk_widget_new (GTK_TYPE_MENU, NULL); gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), widget); } gtk_item_factory_add_item (ifactory, path, entry->accelerator, (type_id == quark_type_branch || type_id == quark_type_last_branch) ? (GtkItemFactoryCallback) NULL : entry->callback, entry->callback_action, callback_data, callback_type, item_type_path, widget); g_free (path);}voidgtk_item_factory_create_menu_entries (guint n_entries, GtkMenuEntry *entries){ static GtkPatternSpec pspec_separator = { 42, 0 }; static GtkPatternSpec pspec_check = { 42, 0 }; guint i; if (!n_entries) return; g_return_if_fail (entries != NULL); if (pspec_separator.pattern_length == 0) { gtk_pattern_spec_init (&pspec_separator, "*<separator>*"); gtk_pattern_spec_init (&pspec_check, "*<check>*"); } for (i = 0; i < n_entries; i++) { GtkItemFactory *ifactory; GtkItemFactoryEntry entry; gchar *path; gchar *cpath; path = entries[i].path; ifactory = gtk_item_factory_from_path (path); if (!ifactory) { g_warning ("gtk_item_factory_create_menu_entries(): " "entry[%u] refers to unknown item factory: \"%s\"", i, entries[i].path); continue; } while (*path != '>') path++; path++; cpath = NULL; entry.path = path; entry.accelerator = entries[i].accelerator; entry.callback = entries[i].callback; entry.callback_action = 0; if (gtk_pattern_match_string (&pspec_separator, path)) entry.item_type = "<Separator>"; else if (!gtk_pattern_match_string (&pspec_check, path)) entry.item_type = NULL; else { gboolean in_brace = FALSE; gchar *c; cpath = g_new (gchar, strlen (path)); c = cpath; while (*path != 0) { if (*path == '<') in_brace = TRUE; else if (*path == '>') in_brace = FALSE; else if (!in_brace) *(c++) = *path; path++; } *c = 0; entry.item_type = "<ToggleItem>"; entry.path = cpath; } gtk_item_factory_create_item (ifactory, &entry, entries[i].callback_data, 2); entries[i].widget = gtk_item_factory_get_widget (ifactory, entries[i].path); g_free (cpath); }}voidgtk_item_factories_path_delete (const gchar *ifactory_path, const gchar *path){ GtkItemFactoryClass *class; GtkItemFactoryItem *item; g_return_if_fail (path != NULL); class = gtk_type_class (GTK_TYPE_ITEM_FACTORY); if (path[0] == '<') item = g_hash_table_lookup (class->item_ht, (gpointer) path); else { gchar *fpath; g_return_if_fail (ifactory_path != NULL); fpath = g_strconcat (ifactory_path, path, NULL); item = g_hash_table_lookup (class->item_ht, fpath); g_free (fpath); } if (item) { GSList *widget_list; GSList *slist; widget_list = NULL; for (slist = item->widgets; slist; slist = slist->next) { GtkWidget *widget; widget = slist->data; widget_list = g_slist_prepend (widget_list, widget); gtk_widget_ref (widget); } for (slist = widget_list; slist; slist = slist->next) { GtkWidget *widget; widget = slist->data; gtk_widget_destroy (widget); gtk_widget_unref (widget); } g_slist_free (widget_list); }}voidgtk_item_factory_delete_item (GtkItemFactory *ifactory, const gchar *path){ GtkItemFactoryClass *class; GtkItemFactoryItem *item; gchar *fpath; g_return_if_fail (ifactory != NULL); g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); g_return_if_fail (path != NULL); class = GTK_ITEM_FACTORY_CLASS (GTK_OBJECT (ifactory)->klass); fpath = g_strconcat (ifactory->path, path, NULL); item = g_hash_table_lookup (class->item_ht, fpath); g_free (fpath); if (item) { GtkWidget *widget = NULL; GSList *slist; for (slist = item->widgets; slist; slist = slist->next) { widget = slist->data; if (gtk_item_factory_from_widget (widget) == ifactory) break; } if (slist) gtk_widget_destroy (widget); }}voidgtk_item_factory_delete_entry (GtkItemFactory *ifactory, GtkItemFactoryEntry *entry){ g_return_if_fail (ifactory != NULL); g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); g_return_if_fail (entry != NULL); gtk_item_factory_delete_item (ifactory, entry->path);}voidgtk_item_factory_delete_entries (GtkItemFactory *ifactory, guint n_entries, GtkItemFactoryEntry *entries){ guint i; g_return_if_fail (ifactory != NULL); g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); if (n_entries > 0) g_return_if_fail (entries != NULL); for (i = 0; i < n_entries; i++) gtk_item_factory_delete_item (ifactory, (entries + i)->path);}typedef struct{ guint x; guint y;} MenuPos;static voidgtk_item_factory_menu_pos (GtkMenu *menu, gint *x, gint *y, gpointer func_data){ MenuPos *mpos = func_data; *x = mpos->x; *y = mpos->y;}gpointergtk_item_factory_popup_data_from_widget (GtkWidget *widget){ GtkItemFactory *ifactory; g_return_val_if_fail (widget != NULL, NULL); g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); ifactory = gtk_item_factory_from_widget (widget); if (ifactory) return gtk_object_get_data_by_id (GTK_OBJECT (ifactory), quark_popup_data); return NULL;}gpointergtk_item_factory_popup_data (GtkItemFactory *ifactory){ g_return_val_if_fail (ifactory != NULL, NULL); g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL); return gtk_object_get_data_by_id (GTK_OBJECT (ifactory), quark_popup_data);}static voidifactory_delete_popup_data (GtkObject *object, GtkItemFactory *ifactory){ gtk_signal_disconnect_by_func (object, GTK_SIGNAL_FUNC (ifactory_delete_popup_data), ifactory); gtk_object_remove_data_by_id (GTK_OBJECT (ifactory), quark_popup_data);}voidgtk_item_factory_popup (GtkItemFactory *ifactory, guint x, guint y, guint mouse_button, guint32 time){ gtk_item_factory_popup_with_data (ifactory, NULL, NULL, x, y, mouse_button, time);}voidgtk_item_factory_popup_with_data (GtkItemFactory *ifactory, gpointer popup_data, GtkDestroyNotify destroy, guint x, guint y, guint mouse_button, guint32 time){ g_return_if_fail (ifactory != NULL); g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); g_return_if_fail (GTK_IS_MENU (ifactory->widget)); if (!GTK_WIDGET_VISIBLE (ifactory->widget)) { MenuPos *mpos; mpos = gtk_object_get_data_by_id (GTK_OBJECT (ifactory->widget), quark_if_menu_pos); if (!mpos) { mpos = g_new0 (MenuPos, 1); gtk_object_set_data_by_id_full (GTK_OBJECT (ifactory->widget), quark_if_menu_pos, mpos, g_free); } mpos->x = x; mpos->y = y; if (popup_data != NULL) { gtk_object_set_data_by_id_full (GTK_OBJECT (ifactory), quark_popup_data, popup_data, destroy); gtk_signal_connect (GTK_OBJECT (ifactory->widget), "selection-done", GTK_SIGNAL_FUNC (ifactory_delete_popup_data), ifactory); } gtk_menu_popup (GTK_MENU (ifactory->widget), NULL, NULL, gtk_item_factory_menu_pos, mpos, mouse_button, time); }}static guintgtk_item_factory_parse_menu_path (GScanner *scanner, GtkItemFactoryClass *class){ GtkItemFactoryItem *item; g_scanner_get_next_token (scanner); if (scanner->token != G_TOKEN_STRING) return G_TOKEN_STRING; g_scanner_peek_next_token (scanner); if (scanner->next_token != G_TOKEN_STRING) { g_scanner_get_next_token (scanner); return G_TOKEN_STRING; } item = g_hash_table_lookup (class->item_ht, scanner->value.v_string); if (!item) { item = g_chunk_new (GtkItemFactoryItem, ifactory_item_chunks); item->path = g_strdup (scanner->value.v_string); item->accelerator_key = 0; item->accelerator_mods = 0; item->modified = TRUE; item->in_propagation = FALSE; item->dummy = NULL; item->widgets = NULL; g_hash_table_insert (class->item_ht, item->path, item); } g_scanner_get_next_token (scanner); if (!item->in_propagation) { guint old_keyval; guint old_mods; old_keyval = item->accelerator_key; old_mods = item->accelerator_mods; gtk_accelerator_parse (scanner->value.v_string, &item->accelerator_key, &item->accelerator_mods); if (old_keyval != item->accelerator_key || old_mods != item->accelerator_mods) { item->modified = TRUE; gtk_item_factory_propagate_accelerator (item, NULL); } } g_scanner_get_next_token (scanner); if (scanner->token != ')') return ')'; else return G_TOKEN_NONE;}static voidgtk_item_factory_parse_statement (GScanner *scanner, GtkItemFactoryClass *class){ guint expected_token; g_scanner_get_next_token (scanner); if (scanner->token == G_TOKEN_SYMBOL) { guint (*parser_func) (GScanner*, GtkItemFactoryClass*); parser_func = scanner->value.v_symbol; /* check whether this is a GtkItemFactory symbol. */ if (parser_func == gtk_item_factory_parse_menu_path) expected_token = parser_func (scanner, class); else expected_token = G_TOKEN_SYMBOL; } else expected_token = G_TOKEN_SYMBOL; /* skip rest of statement on errrors */ if (expected_token != G_TOKEN_NONE) { register guint level; level = 1; if (scanner->token == ')') level--; if (scanner->token == '(') level++; while (!g_scanner_eof (scanner) && level > 0) { g_scanner_get_next_token (scanner); if (scanner->token == '(') level++; else if (scanner->token == ')') level--; } }}voidgtk_item_factory_parse_rc_string (const gchar *rc_string){ GScanner *scanner; g_return_if_fail (rc_string != NULL); if (!gtk_item_factory_class) gtk_type_class (GTK_TYPE_ITEM_FACTORY); ifactory_scanner_config.cpair_comment_single = gtk_item_factory_class->cpair_comment_single; scanner = g_scanner_new (&ifactory_scanner_config); g_scanner_input_text (scanner, rc_string, strlen (rc_string)); gtk_item_factory_parse_rc_scanner (scanner); g_scanner_destroy (scanner);}voidgtk_item_factory_parse_rc_scanner (GScanner *scanner){ gpointer saved_symbol; g_return_if_fail (scanner != NULL); if (!gtk_item_factory_class) gtk_type_class (GTK_TYPE_ITEM_FACTORY); saved_symbol = g_scanner_lookup_symbol (scanner, "menu-path"); g_scanner_remove_symbol (scanner, "menu-path"); g_scanner_add_symbol (scanner, "menu-path", gtk_item_factory_parse_menu_path); g_scanner_peek_next_token (scanner); while (scanner->next_token == '(') { g_scanner_get_next_token (scanner); gtk_item_factory_parse_statement (scanner, gtk_item_factory_class); g_scanner_peek_next_token (scanner); } g_scanner_remove_symbol (scanner, "menu-path"); g_scanner_add_symbol (scanner, "menu-path", saved_symbol);}voidgtk_item_factory_parse_rc (const gchar *file_name){ gint fd; GScanner *scanner; g_return_if_fail (file_name != NULL); if (!S_ISREG (g_scanner_stat_mode (file_name))) return; fd = open (file_name, O_RDONLY); if (fd < 0) return; if (!gtk_item_factory_class) gtk_type_class (GTK_TYPE_ITEM_FACTORY); ifactory_scanner_config.cpair_comment_single = gtk_item_factory_class->cpair_comment_single; scanner = g_scanner_new (&ifactory_scanner_config); g_scanner_input_file (scanner, fd); gtk_item_factory_parse_rc_scanner (scanner); g_scanner_destroy (scanner); close (fd);}voidgtk_item_factory_set_translate_func (GtkItemFactory *ifactory, GtkTranslateFunc func, gpointer data, GtkDestroyNotify notify){ g_return_if_fail (ifactory != NULL); if (ifactory->translate_notify) ifactory->translate_notify (ifactory->translate_data); ifactory->translate_func = func; ifactory->translate_data = data; ifactory->translate_notify = notify;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -