/** * autoar_common_g_signal_emit: * @instance: the instance the signal is being emitted on. * @in_thread: %TRUE if you are not call this function inside the main thread. * @signal_id: the signal id * @detail: the detail * @...: parameters to be passed to the signal. * * This is a wrapper for g_signal_emit(). If @in_thread is %FALSE, this * function is the same as g_signal_emit(). If @in_thread is %TRUE, the * signal will be emitted from the main thread. This function will send * the signal emission job via g_main_context_invoke(), but it does not * wait for the signal emission job to be completed. Hence, the signal * may emitted after autoar_common_g_signal_emit() is returned. **/ G_GNUC_INTERNAL void autoar_common_g_signal_emit (gpointer instance, gboolean in_thread, guint signal_id, GQuark detail, ...) { va_list ap; va_start (ap, detail); if (in_thread) { int i; gchar *error; GSignalQuery query; AutoarCommonSignalData *data; error = NULL; data = g_new0 (AutoarCommonSignalData, 1); data->signal_id = signal_id; data->detail = detail; data->used_values = 1; g_value_init (data->instance_and_params, G_TYPE_FROM_INSTANCE (instance)); g_value_set_instance (data->instance_and_params, instance); g_signal_query (signal_id, &query); if (query.signal_id == 0) { autoar_common_signal_data_free (data); va_end (ap); return; } for (i = 0; i < query.n_params; i++) { G_VALUE_COLLECT_INIT (data->instance_and_params + i + 1, query.param_types[i], ap, 0, &error); if (error != NULL) break; data->used_values++; } if (error == NULL) { g_main_context_invoke (NULL, autoar_common_g_signal_emit_main_context, data); } else { autoar_common_signal_data_free (data); g_debug ("G_VALUE_COLLECT_INIT: Error: %s", error); g_free (error); va_end (ap); return; } } else { g_signal_emit_valist (instance, signal_id, detail, ap); } va_end (ap); }
void dt_control_signal_raise(const dt_control_signal_t *ctlsig, dt_signal_t signal,...) { va_list extra_args; // ignore all signals on shutdown, especially don't lock anything.. if(!dt_control_running()) return; va_start(extra_args,signal); gboolean i_own_lock = dt_control_gdk_lock(); //g_signal_emit_by_name(G_OBJECT(ctlsig->sink), _signal_description[signal].name); g_signal_emit_valist(G_OBJECT(ctlsig->sink),g_signal_lookup(_signal_description[signal].name,_signal_type), 0,extra_args); va_end(extra_args); if (i_own_lock) dt_control_gdk_unlock(); }
void gtk_signal_emit (GtkObject *object, guint signal_id, ...) { va_list var_args; g_return_if_fail (GTK_IS_OBJECT (object)); va_start (var_args, signal_id); g_signal_emit_valist (G_OBJECT (object), signal_id, 0, var_args); va_end (var_args); }
void gtk_signal_emit_by_name (GtkObject *object, const gchar *name, ...) { GSignalQuery query; va_list var_args; g_return_if_fail (GTK_IS_OBJECT (object)); g_return_if_fail (name != NULL); g_signal_query (g_signal_lookup (name, GTK_OBJECT_TYPE (object)), &query); g_return_if_fail (query.signal_id != 0); va_start (var_args, name); g_signal_emit_valist (G_OBJECT (object), query.signal_id, 0, var_args); va_end (var_args); }