📄 gtkaccelgroup.c
字号:
if (!gtk_accelerator_valid (accel_key, accel_mods)) return; entry = gtk_accel_group_lookup (accel_group, accel_key, accel_mods); if (!entry) { GSList *slist; gtk_accel_group_ref (accel_group); entry = g_chunk_new (GtkAccelEntry, accel_entries_mem_chunk); entry->accel_group = accel_group; entry->accelerator_key = gdk_keyval_to_lower (accel_key); entry->accelerator_mods = accel_mods & accel_group->modifier_mask; entry->accel_flags = accel_flags & GTK_ACCEL_MASK; entry->object = object; entry->signal_id = accel_signal_id; g_hash_table_insert (accel_entry_hash_table, entry, entry); slist = gtk_object_get_data_by_id (object, accel_entries_key_id); if (!slist) gtk_signal_connect (object, "destroy", GTK_SIGNAL_FUNC (gtk_accel_group_delete_entries), NULL); slist = g_slist_prepend (slist, entry); gtk_object_set_data_by_id (object, accel_entries_key_id, slist); }}voidgtk_accel_group_remove (GtkAccelGroup *accel_group, guint accel_key, GdkModifierType accel_mods, GtkObject *object){ GtkAccelEntry *entry; guint remove_accelerator_signal_id = 0; g_return_if_fail (accel_group != NULL); g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_OBJECT (object)); /* check for required signals in the objects branch */ remove_accelerator_signal_id = gtk_signal_lookup ("remove-accelerator", GTK_OBJECT_TYPE (object)); if (!remove_accelerator_signal_id) { g_warning ("gtk_accel_group_remove(): could not find signal \"%s\"" "in the `%s' class ancestry", "remove-accelerator", gtk_type_name (GTK_OBJECT_TYPE (object))); return; } /* prematurely abort if the entry is locked */ if (accel_group->lock_count > 0) return; entry = gtk_accel_group_lookup (accel_group, accel_key, accel_mods); if (!entry || entry->accel_flags & GTK_ACCEL_LOCKED) return; if (entry->object != object) { g_warning ("gtk_accel_group_remove(): invalid object reference for accel-group entry"); return; } /* make sure our structures stay alive */ gtk_accel_group_ref (accel_group); gtk_object_ref (object); /* remove the entry */ gtk_signal_emit (entry->object, remove_accelerator_signal_id, accel_group, gdk_keyval_to_lower (accel_key), accel_mods & accel_group->modifier_mask); /* and release the structures again */ gtk_accel_group_unref (accel_group); gtk_object_unref (object);}voidgtk_accel_group_handle_remove (GtkObject *object, GtkAccelGroup *accel_group, guint accel_key, GdkModifierType accel_mods){ GtkAccelEntry *entry; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_OBJECT (object)); g_return_if_fail (accel_group != NULL); entry = gtk_accel_group_lookup (accel_group, accel_key, accel_mods); if (entry) { if (entry->object == object) { GSList *slist; g_hash_table_remove (accel_entry_hash_table, entry); slist = gtk_object_get_data_by_id (object, accel_entries_key_id); if (slist) { slist = g_slist_remove (slist, entry); if (!slist) gtk_signal_disconnect_by_func (object, GTK_SIGNAL_FUNC (gtk_accel_group_delete_entries), NULL); gtk_object_set_data_by_id (object, accel_entries_key_id, slist); gtk_accel_group_unref (accel_group); g_chunk_free (entry, accel_entries_mem_chunk); } } else g_warning ("gtk_accel_group_handle_remove(): invalid object reference for accel-group entry"); } else g_warning ("gtk_accel_group_handle_remove(): attempt to remove unexisting accel-group entry");}guintgtk_accel_group_create_add (GtkType class_type, GtkSignalRunType signal_flags, guint handler_offset){ g_return_val_if_fail (gtk_type_is_a (class_type, GTK_TYPE_OBJECT), 0); return gtk_signal_new ("add-accelerator", signal_flags, class_type, handler_offset, gtk_marshal_NONE__UINT_POINTER_UINT_UINT_ENUM, GTK_TYPE_NONE, 5, GTK_TYPE_UINT, GTK_TYPE_ACCEL_GROUP, GTK_TYPE_UINT, GTK_TYPE_GDK_MODIFIER_TYPE, GTK_TYPE_ACCEL_FLAGS);}guintgtk_accel_group_create_remove (GtkType class_type, GtkSignalRunType signal_flags, guint handler_offset){ g_return_val_if_fail (gtk_type_is_a (class_type, GTK_TYPE_OBJECT), 0); return gtk_signal_new ("remove-accelerator", signal_flags, class_type, handler_offset, gtk_marshal_NONE__POINTER_UINT_UINT, GTK_TYPE_NONE, 3, GTK_TYPE_ACCEL_GROUP, GTK_TYPE_UINT, GTK_TYPE_GDK_MODIFIER_TYPE);}GSList*gtk_accel_groups_from_object (GtkObject *object){ g_return_val_if_fail (object != NULL, NULL); g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); return gtk_object_get_data_by_id (object, accel_groups_key_id);}GSList*gtk_accel_group_entries_from_object (GtkObject *object){ g_return_val_if_fail (object != NULL, NULL); g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); return gtk_object_get_data_by_id (object, accel_entries_key_id);}gbooleangtk_accelerator_valid (guint keyval, GdkModifierType modifiers){ static const guint invalid_accelerator_vals[] = { GDK_BackSpace, GDK_Delete, GDK_KP_Delete, GDK_Shift_L, GDK_Shift_R, GDK_Shift_Lock, GDK_Caps_Lock, GDK_ISO_Lock, GDK_Control_L, GDK_Control_R, GDK_Meta_L, GDK_Meta_R, GDK_Super_L, GDK_Super_R, GDK_Hyper_L, GDK_Hyper_R, GDK_Mode_switch, GDK_Num_Lock, GDK_Multi_key, GDK_Scroll_Lock, GDK_Sys_Req, GDK_Up, GDK_Down, GDK_Left, GDK_Right, GDK_Tab, GDK_ISO_Left_Tab, GDK_KP_Up, GDK_KP_Down, GDK_KP_Left, GDK_KP_Right, GDK_KP_Tab, GDK_First_Virtual_Screen, GDK_Prev_Virtual_Screen, GDK_Next_Virtual_Screen, GDK_Last_Virtual_Screen, GDK_Terminate_Server, GDK_AudibleBell_Enable, 0 }; const guint *ac_val; modifiers &= GDK_MODIFIER_MASK; if (keyval <= 0xFF) return keyval >= 0x20; ac_val = invalid_accelerator_vals; while (*ac_val) { if (keyval == *ac_val++) return FALSE; } return TRUE;}static inline gbooleanis_alt (const gchar *string){ return ((string[0] == '<') && (string[1] == 'a' || string[1] == 'A') && (string[2] == 'l' || string[2] == 'L') && (string[3] == 't' || string[3] == 'T') && (string[4] == '>'));}static inline gbooleanis_ctl (const gchar *string){ return ((string[0] == '<') && (string[1] == 'c' || string[1] == 'C') && (string[2] == 't' || string[2] == 'T') && (string[3] == 'l' || string[3] == 'L') && (string[4] == '>'));}static inline gbooleanis_modx (const gchar *string){ return ((string[0] == '<') && (string[1] == 'm' || string[1] == 'M') && (string[2] == 'o' || string[2] == 'O') && (string[3] == 'd' || string[3] == 'D') && (string[4] >= '1' && string[4] <= '5') && (string[5] == '>'));}static inline gbooleanis_ctrl (const gchar *string){ return ((string[0] == '<') && (string[1] == 'c' || string[1] == 'C') && (string[2] == 't' || string[2] == 'T') && (string[3] == 'r' || string[3] == 'R') && (string[4] == 'l' || string[4] == 'L') && (string[5] == '>'));}static inline gbooleanis_shft (const gchar *string){ return ((string[0] == '<') && (string[1] == 's' || string[1] == 'S') && (string[2] == 'h' || string[2] == 'H') && (string[3] == 'f' || string[3] == 'F') && (string[4] == 't' || string[4] == 'T') && (string[5] == '>'));}static inline gbooleanis_shift (const gchar *string){ return ((string[0] == '<') && (string[1] == 's' || string[1] == 'S') && (string[2] == 'h' || string[2] == 'H') && (string[3] == 'i' || string[3] == 'I') && (string[4] == 'f' || string[4] == 'F') && (string[5] == 't' || string[5] == 'T') && (string[6] == '>'));}static inline gbooleanis_control (const gchar *string){ return ((string[0] == '<') && (string[1] == 'c' || string[1] == 'C') && (string[2] == 'o' || string[2] == 'O') && (string[3] == 'n' || string[3] == 'N') && (string[4] == 't' || string[4] == 'T') && (string[5] == 'r' || string[5] == 'R') && (string[6] == 'o' || string[6] == 'O') && (string[7] == 'l' || string[7] == 'L') && (string[8] == '>'));}static inline gbooleanis_release (const gchar *string){ return ((string[0] == '<') && (string[1] == 'r' || string[1] == 'R') && (string[2] == 'e' || string[2] == 'E') && (string[3] == 'l' || string[3] == 'L') && (string[4] == 'e' || string[4] == 'E') && (string[5] == 'a' || string[5] == 'A') && (string[6] == 's' || string[6] == 'S') && (string[7] == 'e' || string[7] == 'E') && (string[8] == '>'));}voidgtk_accelerator_parse (const gchar *accelerator, guint *accelerator_key, GdkModifierType*accelerator_mods){ guint keyval; GdkModifierType mods; gint len; if (accelerator_key) *accelerator_key = 0; if (accelerator_mods) *accelerator_mods = 0; g_return_if_fail (accelerator != NULL); keyval = 0; mods = 0; len = strlen (accelerator); while (len) { if (*accelerator == '<') { if (len >= 9 && is_release (accelerator)) { accelerator += 9; len -= 9; mods |= GDK_RELEASE_MASK; } else if (len >= 9 && is_control (accelerator)) { accelerator += 9; len -= 9; mods |= GDK_CONTROL_MASK; } else if (len >= 7 && is_shift (accelerator)) { accelerator += 7; len -= 7; mods |= GDK_SHIFT_MASK; } else if (len >= 6 && is_shft (accelerator)) { accelerator += 6; len -= 6; mods |= GDK_SHIFT_MASK; } else if (len >= 6 && is_ctrl (accelerator)) { accelerator += 6; len -= 6; mods |= GDK_CONTROL_MASK; } else if (len >= 6 && is_modx (accelerator)) { static const guint mod_vals[] = { GDK_MOD1_MASK, GDK_MOD2_MASK, GDK_MOD3_MASK, GDK_MOD4_MASK, GDK_MOD5_MASK }; len -= 6; accelerator += 4; mods |= mod_vals[*accelerator - '1']; accelerator += 2; } else if (len >= 5 && is_ctl (accelerator)) { accelerator += 5; len -= 5; mods |= GDK_CONTROL_MASK; } else if (len >= 5 && is_alt (accelerator)) { accelerator += 5; len -= 5; mods |= GDK_MOD1_MASK; } else { gchar last_ch; last_ch = *accelerator; while (last_ch && last_ch != '>') { last_ch = *accelerator; accelerator += 1; len -= 1; } } } else { keyval = gdk_keyval_from_name (accelerator); accelerator += len; len -= len; } } if (accelerator_key) *accelerator_key = gdk_keyval_to_lower (keyval); if (accelerator_mods) *accelerator_mods = mods;}gchar*gtk_accelerator_name (guint accelerator_key, GdkModifierType accelerator_mods){ static const gchar text_release[] = "<Release>"; static const gchar text_shift[] = "<Shift>"; static const gchar text_control[] = "<Control>"; static const gchar text_mod1[] = "<Alt>"; static const gchar text_mod2[] = "<Mod2>"; static const gchar text_mod3[] = "<Mod3>"; static const gchar text_mod4[] = "<Mod4>"; static const gchar text_mod5[] = "<Mod5>"; guint l; gchar *keyval_name; gchar *accelerator; accelerator_mods &= GDK_MODIFIER_MASK; keyval_name = gdk_keyval_name (gdk_keyval_to_lower (accelerator_key)); if (!keyval_name) keyval_name = ""; l = 0; if (accelerator_mods & GDK_RELEASE_MASK) l += sizeof (text_release) - 1; if (accelerator_mods & GDK_SHIFT_MASK) l += sizeof (text_shift) - 1; if (accelerator_mods & GDK_CONTROL_MASK) l += sizeof (text_control) - 1; if (accelerator_mods & GDK_MOD1_MASK) l += sizeof (text_mod1) - 1; if (accelerator_mods & GDK_MOD2_MASK) l += sizeof (text_mod2) - 1; if (accelerator_mods & GDK_MOD3_MASK) l += sizeof (text_mod3) - 1; if (accelerator_mods & GDK_MOD4_MASK) l += sizeof (text_mod4) - 1; if (accelerator_mods & GDK_MOD5_MASK) l += sizeof (text_mod5) - 1; l += strlen (keyval_name); accelerator = g_new (gchar, l + 1); l = 0; accelerator[l] = 0; if (accelerator_mods & GDK_RELEASE_MASK) { strcpy (accelerator + l, text_release); l += sizeof (text_release) - 1; } if (accelerator_mods & GDK_SHIFT_MASK) { strcpy (accelerator + l, text_shift); l += sizeof (text_shift) - 1; } if (accelerator_mods & GDK_CONTROL_MASK) { strcpy (accelerator + l, text_control); l += sizeof (text_control) - 1; } if (accelerator_mods & GDK_MOD1_MASK) { strcpy (accelerator + l, text_mod1); l += sizeof (text_mod1) - 1; } if (accelerator_mods & GDK_MOD2_MASK) { strcpy (accelerator + l, text_mod2); l += sizeof (text_mod2) - 1; } if (accelerator_mods & GDK_MOD3_MASK) { strcpy (accelerator + l, text_mod3); l += sizeof (text_mod3) - 1; } if (accelerator_mods & GDK_MOD4_MASK) { strcpy (accelerator + l, text_mod4); l += sizeof (text_mod4) - 1; } if (accelerator_mods & GDK_MOD5_MASK) { strcpy (accelerator + l, text_mod5); l += sizeof (text_mod5) - 1; } strcpy (accelerator + l, keyval_name); return accelerator;}voidgtk_accelerator_set_default_mod_mask (GdkModifierType default_mod_mask){ default_accel_mod_mask = default_mod_mask & GDK_MODIFIER_MASK;}guintgtk_accelerator_get_default_mod_mask (void){ return default_accel_mod_mask;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -