int key_released(dt_view_t *self, guint key, guint state) { dt_control_accels_t *accels = &darktable.control->accels; dt_library_t *lib = (dt_library_t *)self->data; if(!darktable.control->key_accelerators_on) return 0; if(key == accels->lighttable_preview.accel_key && state == accels->lighttable_preview.accel_mods && lib->full_preview_id !=-1) { lib->full_preview_id = -1; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_LEFT, ( lib->full_preview & 1)); dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_RIGHT, ( lib->full_preview & 2)); dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_CENTER_BOTTOM, ( lib->full_preview & 4)); dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_CENTER_TOP, ( lib->full_preview & 8)); lib->full_preview = 0; } return 1; }
static gboolean borders_button_pressed (GtkWidget *w, GdkEventButton *event, gpointer user_data) { dt_ui_t *ui = (dt_ui_t*)user_data; const dt_view_t *cv = dt_view_manager_get_current_view(darktable.view_manager); char key[512]; long which = (long)g_object_get_data(G_OBJECT(w),"border"); switch(which) { case 0: // left border { g_snprintf(key, 512, "%s/ui/%s_visible", cv->module_name, _ui_panel_config_names[DT_UI_PANEL_LEFT]); dt_ui_panel_show(ui, DT_UI_PANEL_LEFT, !dt_conf_get_bool(key)); } break; case 1: // right border { g_snprintf(key, 512, "%s/ui/%s_visible", cv->module_name, _ui_panel_config_names[DT_UI_PANEL_RIGHT]); dt_ui_panel_show(ui, DT_UI_PANEL_RIGHT, !dt_conf_get_bool(key)); } break; case 2: // top border { g_snprintf(key, 512, "%s/ui/%s_visible", cv->module_name, _ui_panel_config_names[DT_UI_PANEL_CENTER_TOP]); gboolean show = !dt_conf_get_bool(key); dt_ui_panel_show(ui, DT_UI_PANEL_CENTER_TOP, show); /* special case show header */ g_snprintf(key, 512, "%s/ui/show_header", cv->module_name); if (dt_conf_get_bool(key)) dt_ui_panel_show(ui, DT_UI_PANEL_TOP, show); } break; case 4: // bottom border default: { g_snprintf(key, 512, "%s/ui/%s_visible", cv->module_name, _ui_panel_config_names[DT_UI_PANEL_CENTER_BOTTOM]); gboolean show = !dt_conf_get_bool(key); dt_ui_panel_show(ui, DT_UI_PANEL_CENTER_BOTTOM, show); dt_ui_panel_show(ui, DT_UI_PANEL_BOTTOM, show); } break; } gtk_widget_queue_draw(w); return TRUE; }
int dt_control_key_pressed_override(guint key, guint state) { dt_control_accels_t *accels = &darktable.control->accels; // TODO: if darkroom mode // did a : vim-style command start? static GList *autocomplete = NULL; static char vimkey_input[256]; if(darktable.control->vimkey_cnt) { guchar unichar = gdk_keyval_to_unicode(key); if(key == GDK_KEY_Return) { if(!strcmp(darktable.control->vimkey, ":q")) { dt_control_quit(); } else { dt_bauhaus_vimkey_exec(darktable.control->vimkey); } darktable.control->vimkey[0] = 0; darktable.control->vimkey_cnt = 0; dt_control_log_ack_all(); g_list_free(autocomplete); autocomplete = NULL; } else if(key == GDK_KEY_Escape) { darktable.control->vimkey[0] = 0; darktable.control->vimkey_cnt = 0; dt_control_log_ack_all(); g_list_free(autocomplete); autocomplete = NULL; } else if(key == GDK_KEY_BackSpace) { darktable.control->vimkey_cnt -= (darktable.control->vimkey + darktable.control->vimkey_cnt) - g_utf8_prev_char(darktable.control->vimkey + darktable.control->vimkey_cnt); darktable.control->vimkey[darktable.control->vimkey_cnt] = 0; if(darktable.control->vimkey_cnt == 0) dt_control_log_ack_all(); else dt_control_log("%s", darktable.control->vimkey); g_list_free(autocomplete); autocomplete = NULL; } else if(key == GDK_KEY_Tab) { // TODO: also support :preset and :get? // auto complete: if(darktable.control->vimkey_cnt < 5) { snprintf(darktable.control->vimkey, sizeof(darktable.control->vimkey), ":set "); darktable.control->vimkey_cnt = 5; } else if(!autocomplete) { // TODO: handle '.'-separated things separately // this is a static list, and tab cycles through the list g_strlcpy(vimkey_input, darktable.control->vimkey + 5, sizeof(vimkey_input)); autocomplete = dt_bauhaus_vimkey_complete(darktable.control->vimkey + 5); autocomplete = g_list_append(autocomplete, vimkey_input); // remember input to cycle back } if(autocomplete) { // pop first. // the paths themselves are owned by bauhaus, // no free required. snprintf(darktable.control->vimkey, sizeof(darktable.control->vimkey), ":set %s", (char *)autocomplete->data); autocomplete = g_list_remove(autocomplete, autocomplete->data); darktable.control->vimkey_cnt = strlen(darktable.control->vimkey); } dt_control_log("%s", darktable.control->vimkey); } else if(g_unichar_isprint(unichar)) // printable unicode character { gchar utf8[6]; gint char_width = g_unichar_to_utf8(unichar, utf8); if(darktable.control->vimkey_cnt + 1 + char_width < 256) { g_utf8_strncpy(darktable.control->vimkey + darktable.control->vimkey_cnt, utf8, 1); darktable.control->vimkey_cnt += char_width; darktable.control->vimkey[darktable.control->vimkey_cnt] = 0; dt_control_log("%s", darktable.control->vimkey); g_list_free(autocomplete); autocomplete = NULL; } } else if(key == GDK_KEY_Up) { // TODO: step history up and copy to vimkey } else if(key == GDK_KEY_Down) { // TODO: step history down and copy to vimkey } return 1; } else if(key == ':' && darktable.control->key_accelerators_on) { darktable.control->vimkey[0] = ':'; darktable.control->vimkey[1] = 0; darktable.control->vimkey_cnt = 1; dt_control_log("%s", darktable.control->vimkey); return 1; } /* check if key accelerators are enabled*/ if(darktable.control->key_accelerators_on != 1) return 0; if(key == accels->global_sideborders.accel_key && state == accels->global_sideborders.accel_mods) { /* toggle panel viewstate */ dt_ui_toggle_panels_visibility(darktable.gui->ui); /* trigger invalidation of centerview to reprocess pipe */ dt_dev_invalidate(darktable.develop); gtk_widget_queue_draw(dt_ui_center(darktable.gui->ui)); return 1; } else if(key == accels->global_header.accel_key && state == accels->global_header.accel_mods) { char key[512]; const dt_view_t *cv = dt_view_manager_get_current_view(darktable.view_manager); /* do nothing if in collapse panel state TODO: reconsider adding this check to ui api */ g_snprintf(key, sizeof(key), "%s/ui/panel_collaps_state", cv->module_name); if(dt_conf_get_int(key)) return 0; /* toggle the header visibility state */ g_snprintf(key, sizeof(key), "%s/ui/show_header", cv->module_name); gboolean header = !dt_conf_get_bool(key); dt_conf_set_bool(key, header); /* show/hide the actual header panel */ dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_TOP, header, TRUE); gtk_widget_queue_draw(dt_ui_center(darktable.gui->ui)); return 1; } return 0; }
int key_pressed(dt_view_t *self, guint key, guint state) { dt_library_t *lib = (dt_library_t *)self->data; dt_control_accels_t *accels = &darktable.control->accels; if(!darktable.control->key_accelerators_on) return 0; int zoom = dt_conf_get_int("plugins/lighttable/images_in_row"); const int layout = dt_conf_get_int("plugins/lighttable/layout"); if(key == accels->lighttable_preview.accel_key && state == accels->lighttable_preview.accel_mods) { int32_t mouse_over_id; DT_CTL_GET_GLOBAL(mouse_over_id, lib_image_mouse_over_id); if(lib->full_preview_id == -1 && mouse_over_id != -1 ) { // encode panel visibility into full_preview lib->full_preview = 0; lib->full_preview_id = mouse_over_id; // let's hide some gui components lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_LEFT)&1) << 0; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_LEFT, FALSE); lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_RIGHT)&1) << 1; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_RIGHT, FALSE); lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_CENTER_BOTTOM)&1) << 2; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_CENTER_BOTTOM, FALSE); lib->full_preview |= (dt_ui_panel_visible(darktable.gui->ui, DT_UI_PANEL_CENTER_TOP)&1) << 3; dt_ui_panel_show(darktable.gui->ui, DT_UI_PANEL_CENTER_TOP, FALSE); //dt_dev_invalidate(darktable.develop); } return 1; } if(key == accels->lighttable_left.accel_key && state == accels->lighttable_left.accel_mods) { if(layout == 1 && zoom == 1) lib->track = -DT_LIBRARY_MAX_ZOOM; else lib->track = -1; return 1; } if(key == accels->lighttable_right.accel_key && state == accels->lighttable_right.accel_mods) { if(layout == 1 && zoom == 1) lib->track = DT_LIBRARY_MAX_ZOOM; else lib->track = 1; return 1; } if(key == accels->lighttable_up.accel_key && state == accels->lighttable_up.accel_mods) { lib->track = -DT_LIBRARY_MAX_ZOOM; return 1; } if(key == accels->lighttable_down.accel_key && state == accels->lighttable_down.accel_mods) { lib->track = DT_LIBRARY_MAX_ZOOM; return 1; } if(key == accels->lighttable_center.accel_key && state == accels->lighttable_center.accel_mods) { lib->center = 1; return 1; } return 0; }