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

📄 gtkbindings.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 3 页
字号:
}gbooleangtk_binding_set_activate (GtkBindingSet	 *binding_set,			  guint		  keyval,			  guint		  modifiers,			  GtkObject	 *object){  GtkBindingEntry *entry;    g_return_val_if_fail (binding_set != NULL, FALSE);  g_return_val_if_fail (object != NULL, FALSE);  g_return_val_if_fail (GTK_IS_OBJECT (object), FALSE);    keyval = gdk_keyval_to_lower (keyval);  modifiers = modifiers & BINDING_MOD_MASK ();    if (!GTK_OBJECT_DESTROYED (object))    {      entry = binding_ht_lookup_entry (binding_set, keyval, modifiers);      if (entry)	{	  gtk_binding_entry_activate (entry, object);	  	  return TRUE;	}    }    return FALSE;}voidgtk_binding_entry_clear (GtkBindingSet	*binding_set,			 guint		 keyval,			 guint		 modifiers){  GtkBindingEntry *entry;    g_return_if_fail (binding_set != NULL);    keyval = gdk_keyval_to_lower (keyval);  modifiers = modifiers & BINDING_MOD_MASK ();    entry = binding_ht_lookup_entry (binding_set, keyval, modifiers);  if (entry)    binding_entry_destroy (entry);  entry = binding_entry_new (binding_set, keyval, modifiers);}voidgtk_binding_entry_remove (GtkBindingSet	 *binding_set,			  guint		  keyval,			  guint		  modifiers){  GtkBindingEntry *entry;    g_return_if_fail (binding_set != NULL);    keyval = gdk_keyval_to_lower (keyval);  modifiers = modifiers & BINDING_MOD_MASK ();    entry = binding_ht_lookup_entry (binding_set, keyval, modifiers);  if (entry)    binding_entry_destroy (entry);}voidgtk_binding_entry_add_signall (GtkBindingSet  *binding_set,			       guint	       keyval,			       guint	       modifiers,			       const gchar    *signal_name,			       GSList	      *binding_args){  GtkBindingEntry *entry;  GtkBindingSignal *signal, **signal_p;  GSList *slist;  guint n = 0;  GtkBindingArg *arg;    g_return_if_fail (binding_set != NULL);  g_return_if_fail (signal_name != NULL);    keyval = gdk_keyval_to_lower (keyval);  modifiers = modifiers & BINDING_MOD_MASK ();    signal = binding_signal_new (signal_name, g_slist_length (binding_args));    arg = signal->args;  for (slist = binding_args; slist; slist = slist->next)    {      GtkBindingArg *tmp_arg;            tmp_arg = slist->data;      if (!tmp_arg)	{	  g_warning ("gtk_binding_entry_add_signall(): arg[%u] is `NULL'", n);	  binding_signal_free (signal);	  return;	}      switch (GTK_FUNDAMENTAL_TYPE (tmp_arg->arg_type))	{	case  GTK_TYPE_LONG:	  arg->arg_type = GTK_TYPE_LONG;	  arg->d.long_data = tmp_arg->d.long_data;	  break;	case  GTK_TYPE_DOUBLE:	  arg->arg_type = GTK_TYPE_DOUBLE;	  arg->d.double_data = tmp_arg->d.double_data;	  break;	case  GTK_TYPE_STRING:          if (tmp_arg->arg_type != GTK_TYPE_IDENTIFIER)	    arg->arg_type = GTK_TYPE_STRING;	  else	    arg->arg_type = GTK_TYPE_IDENTIFIER;	  arg->d.string_data = g_strdup (tmp_arg->d.string_data);	  if (!arg->d.string_data)	    {	      g_warning ("gtk_binding_entry_add_signall(): value of `string' arg[%u] is `NULL'", n);	      binding_signal_free (signal);	      return;	    }	  break;	default:	  g_warning ("gtk_binding_entry_add_signall(): unsupported type `%s' for arg[%u]",		     gtk_type_name (arg->arg_type), n);	  binding_signal_free (signal);	  return;	}      arg++;      n++;    }    entry = binding_ht_lookup_entry (binding_set, keyval, modifiers);  if (!entry)    {      gtk_binding_entry_add (binding_set, keyval, modifiers);      entry = binding_ht_lookup_entry (binding_set, keyval, modifiers);    }  signal_p = &entry->signals;  while (*signal_p)    signal_p = &(*signal_p)->next;  *signal_p = signal;}voidgtk_binding_entry_add_signal (GtkBindingSet  *binding_set,			      guint           keyval,			      guint           modifiers,			      const gchar    *signal_name,			      guint           n_args,			      ...){  GSList *slist, *free_slist;  va_list args;  guint i;  g_return_if_fail (binding_set != NULL);  g_return_if_fail (signal_name != NULL);    keyval = gdk_keyval_to_lower (keyval);  modifiers = modifiers & BINDING_MOD_MASK ();  va_start (args, n_args);  slist = NULL;  for (i = 0; i < n_args; i++)    {      GtkBindingArg *arg;      arg = g_new0 (GtkBindingArg, 1);      slist = g_slist_prepend (slist, arg);      arg->arg_type = va_arg (args, GtkType);      switch (GTK_FUNDAMENTAL_TYPE (arg->arg_type))	{	  /* for elaborated commenting about var args collection, take a look	   * at gtk_arg_collect_value() in gtkargcollector.c	   */	case GTK_TYPE_CHAR:	case GTK_TYPE_UCHAR:	case GTK_TYPE_INT:	case GTK_TYPE_UINT:	case GTK_TYPE_BOOL:	case GTK_TYPE_ENUM:	case GTK_TYPE_FLAGS:	  arg->arg_type = GTK_TYPE_LONG;	  arg->d.long_data = va_arg (args, gint);	  break;	case GTK_TYPE_LONG:	case GTK_TYPE_ULONG:	  arg->arg_type = GTK_TYPE_LONG;	  arg->d.long_data = va_arg (args, glong);	  break;	case GTK_TYPE_FLOAT:	case GTK_TYPE_DOUBLE:	  arg->arg_type = GTK_TYPE_DOUBLE;	  arg->d.double_data = va_arg (args, gdouble);	  break;	case GTK_TYPE_STRING:	  if (arg->arg_type != GTK_TYPE_IDENTIFIER)	    arg->arg_type = GTK_TYPE_STRING;	  arg->d.string_data = va_arg (args, gchar*);	  if (!arg->d.string_data)	    {	      g_warning ("gtk_binding_entry_add_signal(): type `%s' arg[%u] is `NULL'",			 gtk_type_name (arg->arg_type),			 i);	      i += n_args + 1;	    }	  break;	default:	  g_warning ("gtk_binding_entry_add_signal(): unsupported type `%s' for arg[%u]",		     gtk_type_name (arg->arg_type), i);	  i += n_args + 1;	  break;	}    }  va_end (args);  if (i == n_args || i == 0)    {      slist = g_slist_reverse (slist);      gtk_binding_entry_add_signall (binding_set, keyval, modifiers, signal_name, slist);    }  free_slist = slist;  while (slist)    {      g_free (slist->data);      slist = slist->next;    }  g_slist_free (free_slist);}voidgtk_binding_set_add_path (GtkBindingSet	     *binding_set,			  GtkPathType	      path_type,			  const gchar	     *path_pattern,			  GtkPathPriorityType priority){  GtkPatternSpec *pspec;  GSList **slist_p, *slist;  static guint seq_id = 0;    g_return_if_fail (binding_set != NULL);  g_return_if_fail (path_pattern != NULL);  priority &= GTK_PATH_PRIO_MASK;    switch (path_type)    {    case  GTK_PATH_WIDGET:      slist_p = &binding_set->widget_path_pspecs;      break;    case  GTK_PATH_WIDGET_CLASS:      slist_p = &binding_set->widget_class_pspecs;      break;    case  GTK_PATH_CLASS:      slist_p = &binding_set->class_branch_pspecs;      break;    default:      g_assert_not_reached ();      slist_p = NULL;      break;    }    pspec = g_new (GtkPatternSpec, 1);  gtk_pattern_spec_init (pspec, path_pattern);  pspec->seq_id = seq_id++ & 0x0fffffff;  pspec->seq_id |= priority << 28;  pspec->user_data = binding_set;    slist = *slist_p;  while (slist)    {      GtkPatternSpec *tmp_pspec;            tmp_pspec = slist->data;      slist = slist->next;            if (tmp_pspec->pattern_length == pspec->pattern_length &&	  g_str_equal (tmp_pspec->pattern_reversed, pspec->pattern_reversed))	{	  gtk_pattern_spec_free_segs (pspec);	  g_free (pspec);	  pspec = NULL;	  break;	}    }  if (pspec)    *slist_p = g_slist_prepend (*slist_p, pspec);}static inline gbooleanbinding_match_activate (GSList          *pspec_list,			GtkObject	*object,			guint	         path_length,			gchar	        *path,			gchar	        *path_reversed){  GSList *slist;  for (slist = pspec_list; slist; slist = slist->next)    {      GtkPatternSpec *pspec;      pspec = slist->data;      if (gtk_pattern_match (pspec, path_length, path, path_reversed))	{	  GtkBindingSet *binding_set;	  binding_set = pspec->user_data;	  gtk_binding_entry_activate (binding_set->current, object);	  return TRUE;	}    }  return FALSE;}static gintgtk_binding_pattern_compare (gconstpointer new_pattern,			     gconstpointer existing_pattern){  register const GtkPatternSpec *np  = new_pattern;  register const GtkPatternSpec *ep  = existing_pattern;  /* walk the list as long as the existing patterns have   * higher priorities.   */  return np->seq_id < ep->seq_id;}static inline GSList*gtk_binding_entries_sort_patterns (GtkBindingEntry    *entries,				   GtkPathType         path_id){  GSList *patterns;  patterns = NULL;  while (entries)    {      register GtkBindingSet *binding_set;      GSList *slist = NULL;      binding_set = entries->binding_set;      binding_set->current = entries;      switch (path_id)	{	case GTK_PATH_WIDGET:	  slist = binding_set->widget_path_pspecs;	  break;	case GTK_PATH_WIDGET_CLASS:	  slist = binding_set->widget_class_pspecs;	  break;	case GTK_PATH_CLASS:	  slist = binding_set->class_branch_pspecs;	  break;	}      for (; slist; slist = slist->next)	{	  GtkPatternSpec *pspec;	  pspec = slist->data;	  patterns = g_slist_insert_sorted (patterns, pspec, gtk_binding_pattern_compare);	}      entries = entries->hash_next;    }  return patterns;}      gbooleangtk_bindings_activate (GtkObject      *object,		       guint           keyval,		       guint           modifiers){  GtkBindingEntry *entries;  GtkWidget *widget;  gboolean handled = FALSE;  g_return_val_if_fail (object != NULL, FALSE);  g_return_val_if_fail (GTK_IS_OBJECT (object), FALSE);  if (!GTK_IS_WIDGET (object) || GTK_OBJECT_DESTROYED (object))    return FALSE;  widget = GTK_WIDGET (object);  keyval = gdk_keyval_to_lower (keyval);  modifiers = modifiers & BINDING_MOD_MASK ();  entries = binding_ht_lookup_list (keyval, modifiers);  if (!entries)    return FALSE;  if (!handled)    {      guint path_length;      gchar *path, *path_reversed;      GSList *patterns;      gtk_widget_path (widget, &path_length, &path, &path_reversed);      patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET);      handled = binding_match_activate (patterns, object, path_length, path, path_reversed);      g_slist_free (patterns);      g_free (path);      g_free (path_reversed);    }  if (!handled)    {      guint path_length;      gchar *path, *path_reversed;      GSList *patterns;      gtk_widget_class_path (widget, &path_length, &path, &path_reversed);      patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET_CLASS);      handled = binding_match_activate (patterns, object, path_length, path, path_reversed);      g_slist_free (patterns);      g_free (path);      g_free (path_reversed);    }  if (!handled)    {      GSList *patterns;      GtkType class_type;            patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_CLASS);      class_type = GTK_OBJECT_TYPE (object);      while (class_type && !handled)	{	  guint path_length;	  gchar *path, *path_reversed;	  	  path = gtk_type_name (class_type);	  path_reversed = g_strdup (path);	  g_strreverse (path_reversed);	  path_length = strlen (path);	  handled = binding_match_activate (patterns, object, path_length, path, path_reversed);	  g_free (path_reversed);	  class_type = gtk_type_parent (class_type);	}      g_slist_free (patterns);    }  return handled;}/* Patterns */static inline gbooleangtk_pattern_ph_match (const gchar   *match_pattern,		      const gchar   *match_string){  register const gchar *pattern, *string;  register gchar ch;    pattern = match_pattern;  string = match_string;    ch = *pattern;  pattern++;  while (ch)    {      switch (ch)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -