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

📄 gtksignal.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 4 页
字号:
gtk_signal_handler_block (GtkObject *object,			  guint	     handler_id){  GtkHandler *handler;    g_return_if_fail (object != NULL);  g_return_if_fail (handler_id > 0);    handler = gtk_object_get_data_by_id (object, gtk_handler_quark);    while (handler)    {      if (handler->id == handler_id)	{	  handler->blocked += 1;	  return;	}      handler = handler->next;    }    g_warning ("gtk_signal_handler_block(): could not find handler (%u)", handler_id);}voidgtk_signal_handler_block_by_func (GtkObject	*object,				  GtkSignalFunc	 func,				  gpointer	 data){  GtkHandler *handler;  gint found_one;    g_return_if_fail (object != NULL);  g_return_if_fail (func != NULL);    found_one = FALSE;  handler = gtk_object_get_data_by_id (object, gtk_handler_quark);    while (handler)    {      if ((handler->id > 0) &&	  (handler->func == func) &&	  (handler->func_data == data))	{	  found_one = TRUE;	  handler->blocked += 1;	}      handler = handler->next;    }    if (!found_one)    g_warning ("gtk_signal_handler_block_by_func(): could not find handler (0x%0lX) containing data (0x%0lX)", (long) func, (long) data);}voidgtk_signal_handler_block_by_data (GtkObject *object,				  gpointer   data){  GtkHandler *handler;  gint found_one;    g_return_if_fail (object != NULL);    found_one = FALSE;  handler = gtk_object_get_data_by_id (object, gtk_handler_quark);    while (handler)    {      if ((handler->id > 0) &&	  (handler->func_data == data))	{	  found_one = TRUE;	  handler->blocked += 1;	}      handler = handler->next;    }    if (!found_one)    g_warning ("gtk_signal_handler_block_by_data(): could not find handler containing data (0x%0lX)", (long) data);}voidgtk_signal_handler_unblock (GtkObject *object,			    guint      handler_id){  GtkHandler *handler;    g_return_if_fail (object != NULL);  g_return_if_fail (handler_id > 0);    handler = gtk_object_get_data_by_id (object, gtk_handler_quark);    while (handler)    {      if (handler->id == handler_id)	{	  if (handler->blocked > 0)	    handler->blocked -= 1;	  else	    g_warning ("gtk_signal_handler_unblock(): handler (%u) is not blocked", handler_id);	  return;	}      handler = handler->next;    }    g_warning ("gtk_signal_handler_unblock(): could not find handler (%u)", handler_id);}voidgtk_signal_handler_unblock_by_func (GtkObject	  *object,				    GtkSignalFunc  func,				    gpointer	   data){  GtkHandler *handler;  gint found_one;    g_return_if_fail (object != NULL);  g_return_if_fail (func != NULL);    found_one = FALSE;  handler = gtk_object_get_data_by_id (object, gtk_handler_quark);    while (handler)    {      if ((handler->id > 0) &&	  (handler->func == func) &&	  (handler->func_data == data) &&	  (handler->blocked > 0))	{	  handler->blocked -= 1;	  found_one = TRUE;	}      handler = handler->next;    }    if (!found_one)    g_warning ("gtk_signal_handler_unblock_by_func(): could not find blocked handler (0x%0lX) containing data (0x%0lX)", (long) func, (long) data);}voidgtk_signal_handler_unblock_by_data (GtkObject *object,				    gpointer   data){  GtkHandler *handler;  gint found_one;    g_return_if_fail (object != NULL);    found_one = FALSE;  handler = gtk_object_get_data_by_id (object, gtk_handler_quark);    while (handler)    {      if ((handler->id > 0) &&	  (handler->func_data == data) &&	  (handler->blocked > 0))	{	  handler->blocked -= 1;	  found_one = TRUE;	}      handler = handler->next;    }    if (!found_one)    g_warning ("gtk_signal_handler_unblock_by_data(): could not find blocked handler containing data (0x%0lX)", (long) data);}voidgtk_signal_handlers_destroy (GtkObject *object){  GtkHandler *handler;    /* we make the "optimization" of destroying the first handler in the last   * place, since we don't want gtk_signal_handler_unref() to reset the objects   * handler_key data on each removal   */    handler = gtk_object_get_data_by_id (object, gtk_handler_quark);  if (handler)    {      handler = handler->next;      while (handler)	{	  GtkHandler *next;	  	  next = handler->next;	  if (handler->id > 0)	    gtk_signal_handler_unref (handler, object);	  handler = next;	}      handler = gtk_object_get_data_by_id (object, gtk_handler_quark);      if (handler->id > 0)	gtk_signal_handler_unref (handler, object);    }}voidgtk_signal_set_funcs (GtkSignalMarshal marshal_func,		      GtkSignalDestroy destroy_func){  global_marshaller = marshal_func;  global_destroy_notify = destroy_func;}static guintgtk_signal_hash (gconstpointer h){  register const GtkSignalHash *hash = h;    return hash->object_type ^ hash->quark;}static gintgtk_signal_compare (gconstpointer h1,		    gconstpointer h2){  register const GtkSignalHash *hash1 = h1;  register const GtkSignalHash *hash2 = h2;    return (hash1->quark == hash2->quark &&	  hash1->object_type == hash2->object_type);}static guintgtk_alive_disconnecter (GtkDisconnectInfo *info){  g_return_val_if_fail (info != NULL, 0);    gtk_signal_disconnect (info->object1, info->disconnect_handler1);  gtk_signal_disconnect (info->object1, info->signal_handler);  gtk_signal_disconnect (info->object2, info->disconnect_handler2);    g_mem_chunk_free (gtk_disconnect_info_mem_chunk, info);    return 0;}static GtkHandler*gtk_signal_handler_new (void){  GtkHandler *handler;  if (!gtk_handler_free_list)    {      GtkHandler *handler_block;      guint i;      handler_block = g_new0 (GtkHandler, HANDLER_BLOCK_SIZE);      for (i = 1; i < HANDLER_BLOCK_SIZE; i++)	{	  (handler_block + i)->next = gtk_handler_free_list;	  gtk_handler_free_list = (handler_block + i);	}            handler = handler_block;    }  else    {      handler = gtk_handler_free_list;      gtk_handler_free_list = handler->next;    }    handler->id = 0;  handler->blocked = 0;  handler->signal_id = 0;  handler->object_signal = FALSE;  handler->after = FALSE;  handler->no_marshal = FALSE;  handler->ref_count = 1;  handler->func = NULL;  handler->func_data = NULL;  handler->destroy_func = NULL;  handler->prev = NULL;  handler->next = NULL;    return handler;}static voidgtk_signal_handler_ref (GtkHandler *handler){  handler->ref_count += 1;}static voidgtk_signal_handler_unref (GtkHandler *handler,			  GtkObject  *object){  if (!handler->ref_count)    {      /* FIXME: i wanna get removed somewhen */      g_warning ("gtk_signal_handler_unref(): handler with ref_count==0!");      return;    }    handler->ref_count -= 1;    if (handler->ref_count == 0)    {      if (handler->destroy_func)	(* handler->destroy_func) (handler->func_data);      else if (!handler->func && global_destroy_notify)	(* global_destroy_notify) (handler->func_data);            if (handler->prev)	handler->prev->next = handler->next;      else if (handler->next)	gtk_object_set_data_by_id (object, gtk_handler_quark, handler->next);      else	{	  GTK_OBJECT_UNSET_FLAGS (object, GTK_CONNECTED);	  gtk_object_set_data_by_id (object, gtk_handler_quark, NULL);	}      if (handler->next)	handler->next->prev = handler->prev;            handler->next = gtk_handler_free_list;      gtk_handler_free_list = handler;    }}static voidgtk_signal_handler_insert (GtkObject  *object,			   GtkHandler *handler){  GtkHandler *tmp;    /* FIXME: remove */ g_assert (handler->next == NULL);  /* FIXME: remove */ g_assert (handler->prev == NULL);    tmp = gtk_object_get_data_by_id (object, gtk_handler_quark);  if (!tmp)    {      GTK_OBJECT_SET_FLAGS (object, GTK_CONNECTED);      gtk_object_set_data_by_id (object, gtk_handler_quark, handler);    }  else    while (tmp)      {	if (tmp->signal_id < handler->signal_id)	  {	    if (tmp->prev)	      {		tmp->prev->next = handler;		handler->prev = tmp->prev;	      }	    else	      gtk_object_set_data_by_id (object, gtk_handler_quark, handler);	    tmp->prev = handler;	    handler->next = tmp;	    break;	  }		if (!tmp->next)	  {	    tmp->next = handler;	    handler->prev = tmp;	    break;	  }	tmp = tmp->next;      }}#ifdef  G_ENABLE_DEBUG/* value typically set via gdb */static GtkObject *gtk_trace_signal_object = NULL;#endif  /* G_ENABLE_DEBUG */static voidgtk_signal_real_emit (GtkObject *object,		      guint      signal_id,		      GtkArg	*params){  GtkSignal     signal;  GtkHandler	*handlers;  GtkSignalFunc  signal_func;  GtkEmission   *emission;  /* gtk_handlers_run() expects a reentrant GtkSignal*, so we allocate   * it locally on the stack. we save some lookups ourselves with this as well.   */  signal = *LOOKUP_SIGNAL_ID (signal_id);  if (signal.function_offset)    signal_func = G_STRUCT_MEMBER (GtkSignalFunc, object->klass, signal.function_offset);  else    signal_func = NULL;  #ifdef  G_ENABLE_DEBUG  if (gtk_debug_flags & GTK_DEBUG_SIGNALS ||      object == gtk_trace_signal_object)    g_message ("%s::%s emitted (object=%p class-method=%p)\n",	       gtk_type_name (GTK_OBJECT_TYPE (object)),	       signal.name,	       object,	       signal_func);#endif  /* G_ENABLE_DEBUG */    if (signal.signal_flags & GTK_RUN_NO_RECURSE)    {      gint state;            state = gtk_emission_check (current_emissions, object, signal_id);      if (state)	{	  if (state > 1)	    g_warning ("gtk_signal_real_emit(): emission (%u) for object `%s' cannot be restarted from emission hook",		       signal_id,		       gtk_type_name (GTK_OBJECT_TYPE (object)));	  else if (!gtk_emission_check (restart_emissions, object, signal_id))	    gtk_emission_add (&restart_emissions, object, signal_id);	  	  return;	}    }    gtk_object_ref (object);    gtk_emission_add (&current_emissions, object, signal_id);  emission = current_emissions;   emission_restart:    if (signal.signal_flags & GTK_RUN_FIRST && signal_func)    {      signal.marshaller (object, signal_func, NULL, params);            if (stop_emissions && gtk_emission_check (stop_emissions, object, signal_id))	{	  gtk_emission_remove (&stop_emissions, object, signal_id);	  goto emission_done;	}      else if (restart_emissions &&	       signal.signal_flags & GTK_RUN_NO_RECURSE &&	       gtk_emission_check (restart_emissions, object, signal_id))	{	  gtk_emission_remove (&restart_emissions, object, signal_id);	  	  goto emission_restart;	}    }    if (signal.hook_list && !GTK_OBJECT_DESTROYED (object))    {      GtkEmissionHookData data;      data.object = object;      data.n_params = signal.nparams;      data.params = params;      data.signal_id = signal_id;      emission->in_hook = 1;      g_hook_list_marshal_check (signal.hook_list, TRUE, gtk_emission_hook_marshaller, &data);      emission->in_hook = 0;    }  if (GTK_OBJECT_CONNECTED (object))    {      handlers = gtk_signal_get_handlers (object, signal_id);      if (handlers)	{	  gint return_val;	  	  return_val = gtk_handlers_run (handlers, &signal, object, params, FALSE);	  switch (return_val)	    {	    case EMISSION_CONTINUE:	      break;	    case EMISSION_RESTART:	      goto emission_restart;	    case EMISSION_DONE:	      goto emission_done;	    }	}    }    if (signal.signal_flags & GTK_RUN_LAST && signal_func)    {      signal.marshaller (object, signal_func, NULL, params);            if (stop_emissions && gtk_emission_check (stop_emissions, object, signal_id))	{	  gtk_emission_remove (&stop_emissions, object, signal_id);	  goto emission_done;	}      else if (restart_emissions &&	       signal.signal_flags & GTK_RUN_NO_RECURSE &&	       gtk_emission_check (restart_emissions, object, signal_id))	{	  gtk_emission_remove (&restart_emissions, object, signal_id);	  	  goto emission_restart;	}    }    if (GTK_OBJECT_CONNECTED (object))    {      handlers = gtk_signal_get_handlers (object, signal_id);      if (handlers)	{	  gint return_val;	  	  return_val = gtk_handlers_run (handlers, &signal, object, params, TRUE);	  switch (return_val)

⌨️ 快捷键说明

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