⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkaccelgroup.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -