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

📄 gtkitemfactory.c

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