void dt_accel_connect_iop(dt_iop_module_t *module, const gchar *path, GClosure *closure) { dt_accel_t *accel = NULL; gchar accel_path[256]; dt_accel_path_iop(accel_path, 256, module->op, path); // Looking up the entry in the global accelerators list accel = _lookup_accel(accel_path); if (accel) accel->closure = closure; if(accel && accel->local) { // Local accelerators don't actually get connected, just added to the list // They will be connected if/when the module gains focus _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, accel_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } }
void dt_accel_connect_global(const gchar *path, GClosure *closure) { gchar accel_path[256]; dt_accel_path_global(accel_path, 256, path); dt_accel_t *laccel = _lookup_accel(accel_path); laccel->closure = closure; gtk_accel_group_connect_by_path(darktable.control->accelerators, accel_path, closure); }
/* Hack. We iterate over the accel map instead of the actions, * in order to pull the parameters out of accel map entries */ static void add_accel_closure (gpointer data, const gchar *accel_path, guint accel_key, GdkModifierType accel_mods, gboolean changed) { GtkApplicationWindow *window = data; GActionGroup *actions; const gchar *path; const gchar *p; gchar *action_name; GVariant *parameter; AccelClosure *closure; if (accel_key == 0) return; if (!g_str_has_prefix (accel_path, "<GAction>/")) return; path = accel_path + strlen ("<GAction>/"); p = strchr (path, '/'); if (p) { action_name = g_strndup (path, p - path); parameter = g_variant_parse (NULL, p + 1, NULL, NULL, NULL); if (!parameter) g_warning ("Failed to parse parameter from '%s'\n", accel_path); } else { action_name = g_strdup (path); parameter = NULL; } actions = G_ACTION_GROUP (_gtk_widget_get_action_muxer (GTK_WIDGET (window))); if (g_action_group_has_action (actions, action_name)) { closure = (AccelClosure*) g_closure_new_object (sizeof (AccelClosure), g_object_ref (actions)); g_closure_set_marshal (&closure->closure, accel_activate); closure->action_name = g_strdup (action_name); closure->parameter = parameter ? g_variant_ref_sink (parameter) : NULL; window->priv->accel_closures = g_slist_prepend (window->priv->accel_closures, g_closure_ref (&closure->closure)); g_closure_sink (&closure->closure); gtk_accel_group_connect_by_path (window->priv->accels, accel_path, &closure->closure); } else if (parameter) { g_variant_unref (parameter); } g_free (action_name); }
void dt_accel_connect_view(dt_view_t *self, const gchar *path, GClosure *closure) { gchar accel_path[256]; dt_accel_path_view(accel_path, 256, self->module_name, path); gtk_accel_group_connect_by_path(darktable.control->accelerators, accel_path, closure); dt_accel_t *laccel = _lookup_accel(accel_path); laccel->closure = closure; self->accel_closures = g_slist_prepend(self->accel_closures, laccel); }
void dt_accel_connect_lib(dt_lib_module_t *module, const gchar *path, GClosure *closure) { gchar accel_path[256]; dt_accel_path_lib(accel_path, 256, module->plugin_name, path); gtk_accel_group_connect_by_path(darktable.control->accelerators, accel_path, closure); dt_accel_t *accel =_lookup_accel(accel_path); accel->closure = closure; module->accel_closures = g_slist_prepend(module->accel_closures, accel); }
void dt_accel_connect_locals_iop(dt_iop_module_t *module) { dt_accel_t *accel; GSList *l = module->accel_closures_local; while(l) { accel = (dt_accel_t*)l->data; gtk_accel_group_connect_by_path(darktable.control->accelerators, accel->path, accel->closure); l = g_slist_next(l); } module->local_closures_connected = TRUE; }
void dt_accel_connect_lib(dt_lib_module_t *module, const gchar *path, GClosure *closure) { gchar accel_path[256]; dt_accel_path_lib(accel_path, 256, module->plugin_name, path); gtk_accel_group_connect_by_path(darktable.control->accelerators, accel_path, closure); dt_accel_t *accel =_lookup_accel(accel_path); if(!accel) return; // this happens when the path doesn't match any accel (typos, ...) accel->closure = closure; module->accel_closures = g_slist_prepend(module->accel_closures, accel); }
void terminal_accels_init (void) { guint i, j; settings_keybindings = g_settings_new (CONF_KEYS_SCHEMA); g_signal_connect (settings_keybindings, "changed", G_CALLBACK(keys_change_notify), NULL); gsettings_key_to_entry = g_hash_table_new (g_str_hash, g_str_equal); notification_group = gtk_accel_group_new (); for (i = 0; i < G_N_ELEMENTS (all_entries); ++i) { for (j = 0; j < all_entries[i].n_elements; ++j) { KeyEntry *key_entry; key_entry = &(all_entries[i].key_entry[j]); g_hash_table_insert (gsettings_key_to_entry, (gpointer) key_entry->gsettings_key, key_entry); key_entry->closure = g_closure_new_simple (sizeof (GClosure), key_entry); g_closure_ref (key_entry->closure); g_closure_sink (key_entry->closure); gtk_accel_group_connect_by_path (notification_group, I_(key_entry->accel_path), key_entry->closure); keys_change_notify (settings_keybindings, key_entry->gsettings_key, NULL); } } g_signal_connect (notification_group, "accel-changed", G_CALLBACK (accel_changed_callback), NULL); }
/** * gtk_action_connect_accelerator: * @action: a #GtkAction * * Installs the accelerator for @action if @action has an * accel path and group. See gtk_action_set_accel_path() and * gtk_action_set_accel_group() * * Since multiple proxies may independently trigger the installation * of the accelerator, the @action counts the number of times this * function has been called and doesn't remove the accelerator until * gtk_action_disconnect_accelerator() has been called as many times. * * Since: 2.4 **/ void gtk_action_connect_accelerator (GtkAction *action) { g_return_if_fail (GTK_IS_ACTION (action)); if (!action->private_data->accel_quark || !action->private_data->accel_group) return; if (action->private_data->accel_count == 0) { const gchar *accel_path = g_quark_to_string (action->private_data->accel_quark); gtk_accel_group_connect_by_path (action->private_data->accel_group, accel_path, action->private_data->accel_closure); } action->private_data->accel_count++; }
int clip_GTK_ACCELGROUPCONNECTBYPATH(ClipMachine * ClipMachineMemory) { C_widget *caccelg = _fetch_cw_arg(ClipMachineMemory); const gchar *accel_path = _clip_parc(ClipMachineMemory, 2); C_object *cclosure = _fetch_cobject(ClipMachineMemory, _clip_spar(ClipMachineMemory, 3)); GClosure *closure; CHECKCWID(caccelg, GTK_IS_ACCEL_GROUP); CHECKOPT2(1, MAP_type_of_ClipVarType, NUMERIC_type_of_ClipVarType); CHECKOPT(2, CHARACTER_type_of_ClipVarType); closure = (GClosure *) (cclosure->object); gtk_accel_group_connect_by_path(GTK_ACCEL_GROUP(caccelg->widget), accel_path, closure); return 0; err: return 1; }
void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path, GtkWidget *slider) { // just make this callback safe for bauhaus sliders for now: // TODO: implement it for these widgets, too! // (we check for their inheritance from gtk drawing area, that's simpler) if(GTK_IS_DRAWING_AREA(slider)) return; gchar increase_path[256]; gchar decrease_path[256]; gchar reset_path[256]; gchar edit_path[256]; dt_accel_t *accel = NULL; GClosure *closure; char *paths[] = {increase_path, decrease_path, reset_path, edit_path}; dt_accel_paths_slider_iop(paths, 256, module->op, path); closure = g_cclosure_new(G_CALLBACK(slider_increase_callback), (gpointer)slider, NULL); accel = _lookup_accel(increase_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, increase_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } closure = g_cclosure_new(G_CALLBACK(slider_decrease_callback), (gpointer)slider, NULL); accel = _lookup_accel(decrease_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, decrease_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } closure = g_cclosure_new(G_CALLBACK(slider_reset_callback), (gpointer)slider, NULL); accel = _lookup_accel(reset_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, reset_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } closure = g_cclosure_new(G_CALLBACK(slider_edit_callback), (gpointer)slider, NULL); accel = _lookup_accel(edit_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, edit_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } }
void dt_accel_connect_slider_iop(dt_iop_module_t *module, const gchar *path, GtkWidget *slider) { gchar increase_path[256]; gchar decrease_path[256]; gchar reset_path[256]; gchar edit_path[256]; dt_accel_t *accel = NULL; GClosure *closure; char *paths[] = {increase_path, decrease_path, reset_path, edit_path}; dt_accel_paths_slider_iop(paths, 256, module->op, path); if (DT_IS_BAUHAUS_WIDGET(slider)) { closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_increase_callback), (gpointer)slider, NULL); } else { closure = g_cclosure_new(G_CALLBACK(slider_increase_callback), (gpointer)slider, NULL); } accel = _lookup_accel(increase_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, increase_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } if (DT_IS_BAUHAUS_WIDGET(slider)) { closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_decrease_callback), (gpointer)slider, NULL); } else { closure = g_cclosure_new(G_CALLBACK(slider_decrease_callback), (gpointer)slider, NULL); } accel = _lookup_accel(decrease_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, decrease_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } if (DT_IS_BAUHAUS_WIDGET(slider)) { closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_reset_callback), (gpointer)slider, NULL); } else { closure = g_cclosure_new(G_CALLBACK(slider_reset_callback), (gpointer)slider, NULL); } accel = _lookup_accel(reset_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, reset_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } if (DT_IS_BAUHAUS_WIDGET(slider)) { closure = g_cclosure_new(G_CALLBACK(bauhaus_slider_edit_callback), (gpointer)slider, NULL); } else { closure = g_cclosure_new(G_CALLBACK(slider_edit_callback), (gpointer)slider, NULL); } accel = _lookup_accel(edit_path); if (accel) accel->closure = closure; if(accel && accel->local) { _connect_local_accel(module, accel); } else { gtk_accel_group_connect_by_path(darktable.control->accelerators, edit_path, closure); module->accel_closures = g_slist_prepend(module->accel_closures, accel); } }
Liveplay::Liveplay( const gx_system::CmdlineOptions& options, gx_engine::GxMachineBase& machine_, const std::string& fname, const GxActions& actions_) : bld(), machine(machine_), actions(actions_), use_composite(), brightness_adj(), background_adj(), keyswitch(machine_, sigc::mem_fun(this, &Liveplay::display)), midi_conn(), window(), mouse_hide_conn() { const char *id_list[] = {"LivePlay", 0}; bld = gx_gui::GxBuilder::create_from_file(fname, &machine, id_list); bld->get_toplevel("LivePlay", window); bld->find_widget("liveplay_bank", liveplay_bank); bld->find_widget("liveplay_preset", liveplay_preset); bld->find_widget("liveplay_bypass_image", bypass_image); bld->find_widget("liveplay_mute_image", mute_image); bld->find_widget("liveplay_canvas", liveplay_canvas); bld->find_widget("brightness_slider", brightness_slider); bld->find_widget("brightness_box", brightness_box); bld->find_widget("background_slider", background_slider); bld->find_widget("liveplay_exit:barbutton", liveplay_exit); bld->find_widget("liveplay_tuner", tuner); bld->find_widget("liveplay_midictrl_table", midictrl_table); brightness_adj = brightness_slider->get_adjustment(); background_adj = background_slider->get_adjustment(); MyPaintBox *liveplay_paintbox; bld->find_widget_derived( "liveplay_paintbox", liveplay_paintbox, sigc::bind( sigc::ptr_fun(MyPaintBox::create_from_builder), background_adj)); Glib::RefPtr<Gdk::Pixbuf> pb; try { pb = Gdk::Pixbuf::create_from_file( options.get_style_filepath("bypass.svg"), 300, 150); bypass_image->set(pb); } catch (const Glib::FileError& ex) { gx_print_error("liveplay", ex.what()); } catch (const Gdk::PixbufError& ex) { gx_print_error("liveplay", ex.what()); } catch(...) { gx_print_error("liveplay", "failed to load pixmap bypass.svg"); } try { pb = Gdk::Pixbuf::create_from_file( options.get_style_filepath("mute.svg"), 300, 150); mute_image->set(pb); } catch (const Glib::FileError& ex) { gx_print_error("liveplay", ex.what()); } catch (const Gdk::PixbufError& ex) { gx_print_error("liveplay", ex.what()); } catch(...) { gx_print_error("liveplay", "failed to load pixmap mute.svg"); } use_composite = window->get_display()->supports_composite(); if (use_composite) { brightness_adj->signal_value_changed().connect(sigc::mem_fun(this, &Liveplay::on_brightness_changed)); liveplay_canvas->signal_realize().connect(sigc::mem_fun(this, &Liveplay::on_realize)); window->signal_expose_event().connect( sigc::mem_fun(this, &Liveplay::window_expose_event), true); } else { brightness_box->hide(); } background_adj->signal_value_changed().connect( sigc::mem_fun(this, &Liveplay::on_background_changed)); Glib::RefPtr<Gdk::Screen> screen = liveplay_canvas->get_screen(); Glib::RefPtr<Gdk::Colormap> rgba = screen->get_rgba_colormap(); liveplay_canvas->set_colormap(rgba); liveplay_canvas->set_app_paintable(true); window->signal_delete_event().connect( sigc::mem_fun(this, &Liveplay::on_delete)); window->add_events(Gdk::POINTER_MOTION_HINT_MASK|Gdk::POINTER_MOTION_MASK); window->signal_motion_notify_event().connect( sigc::mem_fun(*this, &Liveplay::pointer_motion)); gtk_activatable_set_related_action( GTK_ACTIVATABLE(liveplay_exit->gobj()), GTK_ACTION(actions.live_play->gobj())); Glib::RefPtr<Gtk::AccelGroup> ag = Gtk::AccelGroup::create(); GClosure *cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.live_play->gobj()), 0); gtk_accel_group_connect_by_path(ag->gobj(), actions.live_play->get_accel_path().c_str(), cl); cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.live_play->gobj()), 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_Escape, (GdkModifierType)0, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.livetuner->gobj()), 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_Return, (GdkModifierType)0, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.quit->gobj()), 0); gtk_accel_group_connect_by_path(ag->gobj(), actions.quit->get_accel_path().c_str(), cl); cl = g_cclosure_new(G_CALLBACK(on_keyboard_toggle_mute), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_M, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(on_keyboard_toggle_bypass), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_B, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_Left, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_Right, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_Up, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl); cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_Down, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl); for (int n = GDK_KEY_0; n <= GDK_KEY_9; ++n) { cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (GtkAccelFlags)0, cl); } for (int n = GDK_KEY_KP_0; n <= GDK_KEY_KP_9; ++n) { cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (GtkAccelFlags)0, cl); } for (int n = GDK_KEY_A; n <= GDK_KEY_Z; ++n) { cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (GtkAccelFlags)0, cl); } cl = g_cclosure_new(G_CALLBACK(on_keyboard_mode_switch), (gpointer)this, 0); gtk_accel_group_connect(ag->gobj(), GDK_KEY_space, (GdkModifierType)0, (GtkAccelFlags)0, cl); machine.tuner_switcher_signal_display().connect( sigc::mem_fun(this, &Liveplay::display)); machine.tuner_switcher_signal_set_state().connect( sigc::mem_fun(this, &Liveplay::set_display_state)); machine.tuner_switcher_signal_selection_done().connect( sigc::mem_fun(this, &Liveplay::on_selection_done)); window->add_accel_group(ag); machine.signal_state_change().connect( sigc::mem_fun(this, &Liveplay::on_engine_state_change)); machine.signal_selection_changed().connect( sigc::mem_fun(this, &Liveplay::on_selection_changed)); on_engine_state_change(machine.get_state()); on_selection_changed(); }