📄 gtksignal.c
字号:
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 (¤t_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 + -