97
91
static void cb_func_toggle_sidebar(guint key_id);
99
93
static void add_popup_menu_accels(void);
100
static void apply_kb_accel(KeyBinding *kb);
103
/** Simple convenience function to fill a KeyBinding struct item */
104
void keybindings_set_item(KeyBindingGroup *group, gsize key_id,
105
KeyCallback callback, guint key, GdkModifierType mod,
94
static void apply_kb_accel(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data);
97
/* This is used to set default keybindings on startup but at this point we don't want to
98
* assign the keybinding to the menu_item (apply_kb_accel) otherwise it can't be overridden
99
* by user keybindings anymore */
100
/** Simple convenience function to fill a GeanyKeyBinding struct item.
108
* @param menu_item */
109
void keybindings_set_item(GeanyKeyGroup *group, gsize key_id,
110
GeanyKeyCallback callback, guint key, GdkModifierType mod,
106
111
gchar *name, gchar *label, GtkWidget *menu_item)
110
115
g_assert(key_id < group->count);
328
331
LW(find_in_files1));
329
332
keybindings_set_item(group, GEANY_KEYS_SEARCH_NEXTMESSAGE, cb_func_search_action,
330
333
0, 0, "menu_nextmessage", _("Next Message"), LW(next_message1));
334
keybindings_set_item(group, GEANY_KEYS_SEARCH_PREVIOUSMESSAGE, cb_func_search_action,
335
0, 0, "menu_previousmessage", _("Previous Message"), LW(previous_message1));
331
336
keybindings_set_item(group, GEANY_KEYS_SEARCH_FINDUSAGE, cb_func_search_action,
332
337
0, 0, "popup_findusage", _("Find Usage"), NULL);
338
keybindings_set_item(group, GEANY_KEYS_SEARCH_FINDDOCUMENTUSAGE, cb_func_search_action,
339
0, 0, "popup_finddocumentusage", _("Find Document Usage"), NULL);
334
341
group = ADD_KB_GROUP(GOTO, _("Go to"));
355
362
0, 0, "popup_gototagdefinition", _("Go to Tag Definition"), NULL);
356
363
keybindings_set_item(group, GEANY_KEYS_GOTO_TAGDECLARATION, cb_func_goto_action,
357
364
0, 0, "popup_gototagdeclaration", _("Go to Tag Declaration"), NULL);
365
keybindings_set_item(group, GEANY_KEYS_GOTO_LINESTART, cb_func_goto_action,
366
GDK_Home, 0, "edit_gotolinestart", _("Go to Start of Line"), NULL);
367
keybindings_set_item(group, GEANY_KEYS_GOTO_LINEEND, cb_func_goto_action,
368
GDK_End, 0, "edit_gotolineend", _("Go to End of Line"), NULL);
369
keybindings_set_item(group, GEANY_KEYS_GOTO_PREVWORDSTART, cb_func_goto_action,
370
GDK_slash, GDK_CONTROL_MASK, "edit_prevwordstart", _("Go to Previous Word Part"), NULL);
371
keybindings_set_item(group, GEANY_KEYS_GOTO_NEXTWORDSTART, cb_func_goto_action,
372
GDK_backslash, GDK_CONTROL_MASK, "edit_nextwordstart", _("Go to Next Word Part"), NULL);
359
374
group = ADD_KB_GROUP(VIEW, _("View"));
376
391
group = ADD_KB_GROUP(FOCUS, _("Focus"));
378
keybindings_set_item(group, GEANY_KEYS_FOCUS_EDITOR, cb_func_switch_editor,
393
keybindings_set_item(group, GEANY_KEYS_FOCUS_EDITOR, cb_func_switch_action,
379
394
GDK_F2, 0, "switch_editor", _("Switch to Editor"), NULL);
380
keybindings_set_item(group, GEANY_KEYS_FOCUS_SCRIBBLE, cb_func_switch_scribble,
395
keybindings_set_item(group, GEANY_KEYS_FOCUS_SCRIBBLE, cb_func_switch_action,
381
396
GDK_F6, 0, "switch_scribble", _("Switch to Scribble"), NULL);
382
keybindings_set_item(group, GEANY_KEYS_FOCUS_VTE, cb_func_switch_vte,
397
keybindings_set_item(group, GEANY_KEYS_FOCUS_VTE, cb_func_switch_action,
383
398
GDK_F4, 0, "switch_vte", _("Switch to VTE"), NULL);
384
keybindings_set_item(group, GEANY_KEYS_FOCUS_SEARCHBAR, cb_func_switch_search_bar,
399
keybindings_set_item(group, GEANY_KEYS_FOCUS_SEARCHBAR, cb_func_switch_action,
385
400
GDK_F7, 0, "switch_search_bar", _("Switch to Search Bar"), NULL);
386
keybindings_set_item(group, GEANY_KEYS_FOCUS_SIDEBAR, cb_func_switch_sidebar,
401
keybindings_set_item(group, GEANY_KEYS_FOCUS_SIDEBAR, cb_func_switch_action,
387
402
0, 0, "switch_sidebar", _("Switch to Sidebar"), NULL);
403
keybindings_set_item(group, GEANY_KEYS_FOCUS_COMPILER, cb_func_switch_action,
404
0, 0, "switch_compiler", _("Switch to Compiler"), NULL);
389
406
group = ADD_KB_GROUP(NOTEBOOK, _("Notebook tab"));
406
423
group = ADD_KB_GROUP(DOCUMENT, _("Document"));
408
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_REPLACETABS, cb_func_menu_replacetabs,
425
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_LINEWRAP, cb_func_document_action,
426
0, 0, "menu_linewrap", _("Toggle Line wrapping"), LW(menu_line_wrapping1));
427
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_LINEBREAK, cb_func_document_action,
428
0, 0, "menu_linebreak", _("Toggle Line breaking"), LW(line_breaking1));
429
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_REPLACETABS, cb_func_document_action,
409
430
0, 0, "menu_replacetabs", _("Replace tabs by space"), LW(menu_replace_tabs));
410
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_FOLDALL, cb_func_menu_foldall,
431
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_REPLACESPACES, cb_func_document_action,
432
0, 0, "menu_replacespaces", _("Replace spaces by tabs"), LW(menu_replace_spaces));
433
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_TOGGLEFOLD, cb_func_document_action,
434
0, 0, "menu_togglefold", _("Toggle current fold"), NULL);
435
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_FOLDALL, cb_func_document_action,
411
436
0, 0, "menu_foldall", _("Fold all"), LW(menu_fold_all1));
412
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_UNFOLDALL, cb_func_menu_unfoldall,
437
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_UNFOLDALL, cb_func_document_action,
413
438
0, 0, "menu_unfoldall", _("Unfold all"), LW(menu_unfold_all1));
414
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_RELOADTAGLIST, cb_func_reloadtaglist,
439
keybindings_set_item(group, GEANY_KEYS_DOCUMENT_RELOADTAGLIST, cb_func_document_action,
415
440
GDK_r, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "reloadtaglist", _("Reload symbol list"), NULL);
417
442
group = ADD_KB_GROUP(BUILD, _("Build"));
429
454
0, 0, "build_makeobject", _("Make object"), NULL);
430
455
keybindings_set_item(group, GEANY_KEYS_BUILD_NEXTERROR, cb_func_build_action,
431
456
0, 0, "build_nexterror", _("Next error"), NULL);
457
keybindings_set_item(group, GEANY_KEYS_BUILD_PREVIOUSERROR, cb_func_build_action,
458
0, 0, "build_previouserror", _("Previous error"), NULL);
432
459
keybindings_set_item(group, GEANY_KEYS_BUILD_RUN, cb_func_build_action,
433
460
GDK_F5, 0, "build_run", _("Run"), NULL);
434
461
keybindings_set_item(group, GEANY_KEYS_BUILD_RUN2, cb_func_build_action,
632
static void get_shortcut_labels_text(GString **text_names_str, GString **text_keys_str)
665
static void fill_shortcut_labels_treeview(GtkWidget *tree)
635
GString *text_names = g_string_sized_new(600);
636
GString *text_keys = g_string_sized_new(600);
670
GeanyKeyGroup *group;
638
*text_names_str = text_names;
639
*text_keys_str = text_keys;
674
store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, PANGO_TYPE_WEIGHT);
641
676
for (g = 0; g < keybinding_groups->len; g++)
643
KeyBindingGroup *group = g_ptr_array_index(keybinding_groups, g);
647
g_string_append_printf(text_names, "<b>%s</b>\n", group->label);
648
g_string_append(text_keys, "\n");
652
g_string_append_printf(text_names, "\n<b>%s</b>\n", group->label);
653
g_string_append(text_keys, "\n\n");
678
group = g_ptr_array_index(keybinding_groups, g);
682
gtk_list_store_append(store, &iter);
683
gtk_list_store_set(store, &iter, -1);
686
gtk_list_store_append(store, &iter);
687
gtk_list_store_set(store, &iter, 0, group->label, 2, PANGO_WEIGHT_BOLD, -1);
656
689
for (i = 0; i < group->count; i++)
658
KeyBinding *kb = &group->keys[i];
691
kb = &group->keys[i];
661
692
shortcut = gtk_accelerator_get_label(kb->key, kb->mods);
662
g_string_append(text_names, kb->label);
663
g_string_append(text_names, "\n");
664
g_string_append(text_keys, shortcut);
665
g_string_append(text_keys, "\n");
694
gtk_list_store_append(store, &iter);
695
gtk_list_store_set(store, &iter, 0, kb->label, 1, shortcut, 2, PANGO_WEIGHT_NORMAL, -1);
666
697
g_free(shortcut);
701
gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
702
g_object_unref(store);
672
void keybindings_show_shortcuts(void)
706
static GtkWidget *create_dialog(void)
674
GtkWidget *dialog, *hbox, *label1, *label2, *label3, *swin, *vbox;
677
gint height, response;
708
GtkWidget *dialog, *tree, *label, *swin, *vbox;
709
GtkCellRenderer *text_renderer;
710
GtkTreeViewColumn *column;
679
dialog = gtk_dialog_new_with_buttons(_("Keyboard Shortcuts"), GTK_WINDOW(app->window),
713
dialog = gtk_dialog_new_with_buttons(_("Keyboard Shortcuts"), GTK_WINDOW(main_widgets.window),
680
714
GTK_DIALOG_DESTROY_WITH_PARENT,
681
715
GTK_STOCK_EDIT, GTK_RESPONSE_APPLY,
682
716
GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, NULL);
690
724
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
692
label3 = gtk_label_new(_("The following keyboard shortcuts are configurable:"));
693
gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
695
hbox = gtk_hbox_new(FALSE, 6);
697
label1 = gtk_label_new(NULL);
699
label2 = gtk_label_new(NULL);
701
get_shortcut_labels_text(&text_names, &text_keys);
703
gtk_label_set_markup(GTK_LABEL(label1), text_names->str);
704
gtk_label_set_text(GTK_LABEL(label2), text_keys->str);
706
g_string_free(text_names, TRUE);
707
g_string_free(text_keys, TRUE);
709
gtk_container_add(GTK_CONTAINER(hbox), label1);
710
gtk_container_add(GTK_CONTAINER(hbox), label2);
726
label = gtk_label_new(_("The following keyboard shortcuts are configurable:"));
727
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
729
tree = gtk_tree_view_new();
730
gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE);
731
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
733
text_renderer = gtk_cell_renderer_text_new();
734
/* we can't use "weight-set", see http://bugzilla.gnome.org/show_bug.cgi?id=355214 */
735
column = gtk_tree_view_column_new_with_attributes(
736
NULL, text_renderer, "text", 0, "weight", 2, NULL);
737
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
739
text_renderer = gtk_cell_renderer_text_new();
740
column = gtk_tree_view_column_new_with_attributes(NULL, text_renderer, "text", 1, NULL);
741
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
743
fill_shortcut_labels_treeview(tree);
712
745
swin = gtk_scrolled_window_new(NULL, NULL);
713
746
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), GTK_POLICY_NEVER,
714
747
GTK_POLICY_AUTOMATIC);
715
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(swin), hbox);
748
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swin), GTK_SHADOW_ETCHED_IN);
749
gtk_container_add(GTK_CONTAINER(swin), tree);
717
gtk_box_pack_start(GTK_BOX(vbox), label3, FALSE, FALSE, 6);
751
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 6);
718
752
gtk_box_pack_start(GTK_BOX(vbox), swin, TRUE, TRUE, 0);
720
gtk_widget_show_all(dialog);
721
response = gtk_dialog_run(GTK_DIALOG(dialog));
757
/* non-modal keyboard shortcuts dialog, so user can edit whilst seeing the shortcuts */
758
static GtkWidget *key_dialog = NULL;
760
static void on_dialog_response(GtkWidget *dialog, gint response, gpointer user_data)
722
762
if (response == GTK_RESPONSE_APPLY)
778
829
* return FALSE if no completion occurs, so the tab or space is handled normally. */
779
830
static gboolean check_snippet_completion(guint keyval, guint state)
781
KeyBinding *kb = keybindings_lookup_item(GEANY_KEY_GROUP_EDITOR,
832
GeanyKeyBinding *kb = keybindings_lookup_item(GEANY_KEY_GROUP_EDITOR,
782
833
GEANY_KEYS_EDITOR_COMPLETESNIPPET);
784
835
if (kb->key == keyval && kb->mods == state)
786
gint idx = document_get_cur_idx();
787
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(app->window));
837
GeanyDocument *doc = document_get_current();
838
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
789
840
/* keybinding only valid when scintilla widget has focus */
790
if (DOC_IDX_VALID(idx) && focusw == GTK_WIDGET(doc_list[idx].sci))
841
if (doc != NULL && focusw == GTK_WIDGET(doc->editor->sci))
792
ScintillaObject *sci = doc_list[idx].sci;
843
ScintillaObject *sci = doc->editor->sci;
793
844
gint pos = sci_get_current_position(sci);
795
846
if (editor_prefs.complete_snippets)
796
return editor_complete_snippet(idx, pos);
847
return editor_complete_snippet(doc->editor, pos);
835
895
/* Temporarily disable the menus to prevent conflicting menu accelerators
836
896
* from overriding the VTE bash shortcuts.
837
* Ideally we would just somehow disable the menubar without redrawing it,
838
* but maybe that's not possible. */
839
widget = lookup_widget(app->window, "menubar1");
840
gtk_widget_set_sensitive(widget, FALSE);
841
g_idle_add(&set_sensitive, (gpointer) widget);
842
widget = app->popup_menu;
843
gtk_widget_set_sensitive(widget, FALSE);
844
g_idle_add(&set_sensitive, (gpointer) widget);
897
* Note: maybe there's a better way of doing this ;-) */
898
widget = lookup_widget(main_widgets.window, "menubar1");
899
gtk_widget_set_sensitive(widget, FALSE);
901
/* make the menubar sensitive before it is redrawn */
902
static gboolean connected = FALSE;
904
g_signal_connect(widget, "expose-event", G_CALLBACK(on_menu_expose_event), NULL);
907
widget = main_widgets.editor_menu;
908
gtk_widget_set_sensitive(widget, FALSE);
909
g_idle_add(set_sensitive, widget);
1130
1192
gtk_menu_item_activate(GTK_MENU_ITEM(item));
1133
static void cb_func_reloadtaglist(G_GNUC_UNUSED guint key_id)
1135
gint idx = document_get_cur_idx();
1136
if (idx == -1 || ! doc_list[idx].is_valid) return;
1137
document_update_tag_list(idx, TRUE);
1141
1195
static gboolean check_current_word(void)
1143
gint idx = document_get_cur_idx();
1198
GeanyDocument *doc = document_get_current();
1146
if (! DOC_IDX_VALID(idx))
1149
pos = sci_get_current_position(doc_list[idx].sci);
1203
pos = sci_get_current_position(doc->editor->sci);
1151
editor_find_current_word(doc_list[idx].sci, pos,
1205
editor_find_current_word(doc->editor, pos,
1152
1206
editor_info.current_word, GEANY_MAX_WORD_LENGTH, NULL);
1154
1208
if (*editor_info.current_word == 0)
1163
static void cb_func_switch_editor(G_GNUC_UNUSED guint key_id)
1165
gint idx = document_get_cur_idx();
1166
if (idx == -1 || ! doc_list[idx].is_valid) return;
1167
gtk_widget_grab_focus(GTK_WIDGET(doc_list[idx].sci));
1170
static void cb_func_switch_scribble(G_GNUC_UNUSED guint key_id)
1172
msgwin_switch_tab(MSG_SCRATCH, TRUE);
1175
static void cb_func_switch_search_bar(G_GNUC_UNUSED guint key_id)
1177
if (prefs.toolbar_visible && prefs.toolbar_show_search)
1178
gtk_widget_grab_focus(lookup_widget(app->window, "entry1"));
1181
static void cb_func_switch_sidebar(G_GNUC_UNUSED guint key_id)
1217
static void focus_sidebar(void)
1183
1219
if (ui_prefs.sidebar_visible)
1185
gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(app->treeview_notebook));
1186
GtkWidget *swin = gtk_notebook_get_nth_page(GTK_NOTEBOOK(app->treeview_notebook), page_num);
1188
gtk_widget_grab_focus(gtk_bin_get_child(GTK_BIN(swin)));
1192
static void cb_func_switch_vte(G_GNUC_UNUSED guint key_id)
1194
msgwin_switch_tab(MSG_VTE, TRUE);
1221
gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(main_widgets.sidebar_notebook));
1222
GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(main_widgets.sidebar_notebook), page_num);
1224
/* gtk_widget_grab_focus() won't work because of the scrolled window containers */
1225
gtk_widget_child_focus(page, GTK_DIR_TAB_FORWARD);
1230
static void cb_func_switch_action(guint key_id)
1234
case GEANY_KEYS_FOCUS_EDITOR:
1236
GeanyDocument *doc = document_get_current();
1238
gtk_widget_grab_focus(GTK_WIDGET(doc->editor->sci));
1241
case GEANY_KEYS_FOCUS_SCRIBBLE:
1242
msgwin_switch_tab(MSG_SCRATCH, TRUE);
1244
case GEANY_KEYS_FOCUS_SEARCHBAR:
1245
if (toolbar_prefs.visible && toolbar_prefs.show_search)
1246
gtk_widget_grab_focus(
1247
lookup_widget(main_widgets.window, "toolbutton_search_entry"));
1249
case GEANY_KEYS_FOCUS_SIDEBAR:
1252
case GEANY_KEYS_FOCUS_VTE:
1253
msgwin_switch_tab(MSG_VTE, TRUE);
1255
case GEANY_KEYS_FOCUS_COMPILER:
1256
msgwin_switch_tab(MSG_COMPILER, TRUE);
1262
static void switch_document(gint direction)
1264
gint page_count = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
1265
gint cur_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(main_widgets.notebook));
1267
if (direction == LEFT)
1270
gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), cur_page - 1);
1272
gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), page_count - 1);
1274
else if (direction == RIGHT)
1276
if (cur_page < page_count - 1)
1277
gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), cur_page + 1);
1279
gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), 0);
1197
1284
static void cb_func_switch_tableft(G_GNUC_UNUSED guint key_id)
1199
utils_switch_document(LEFT);
1286
switch_document(LEFT);
1202
1289
static void cb_func_switch_tabright(G_GNUC_UNUSED guint key_id)
1204
utils_switch_document(RIGHT);
1291
switch_document(RIGHT);
1207
1294
static void cb_func_switch_tablastused(G_GNUC_UNUSED guint key_id)
1209
gint last_doc_idx = callbacks_data.last_doc_idx;
1296
GeanyDocument *last_doc = callbacks_data.last_doc;
1211
if (DOC_IDX_VALID(last_doc_idx))
1212
gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook),
1213
document_get_notebook_page(last_doc_idx));
1298
if (DOC_VALID(last_doc))
1299
gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook),
1300
document_get_notebook_page(last_doc));
1216
1303
/* move document left/right/first/last */
1217
1304
static void cb_func_move_tab(guint key_id)
1219
gint idx = document_get_cur_idx();
1220
GtkWidget *sci = GTK_WIDGET(doc_list[idx].sci);
1221
GtkNotebook *nb = GTK_NOTEBOOK(app->notebook);
1307
GtkNotebook *nb = GTK_NOTEBOOK(main_widgets.notebook);
1222
1308
gint cur_page = gtk_notebook_get_current_page(nb);
1309
GeanyDocument *doc = document_get_current();
1224
if (! DOC_IDX_VALID(idx))
1314
sci = GTK_WIDGET(doc->editor->sci);
1227
1316
switch (key_id)
1229
1318
case GEANY_KEYS_NOTEBOOK_MOVETABLEFT:
1263
static void goto_matching_brace(gint idx)
1352
static void goto_matching_brace(GeanyDocument *doc)
1265
1354
gint pos, new_pos;
1267
if (! DOC_IDX_VALID(idx)) return;
1269
pos = sci_get_current_position(doc_list[idx].sci);
1270
if (! utils_isbrace(sci_get_char_at(doc_list[idx].sci, pos), TRUE))
1359
pos = sci_get_current_position(doc->editor->sci);
1360
if (! utils_isbrace(sci_get_char_at(doc->editor->sci, pos), TRUE))
1271
1361
pos--; /* set pos to the brace */
1273
new_pos = sci_find_bracematch(doc_list[idx].sci, pos);
1363
new_pos = sci_find_matching_brace(doc->editor->sci, pos);
1274
1364
if (new_pos != -1)
1275
1365
{ /* set the cursor at the brace */
1276
sci_set_current_position(doc_list[idx].sci, new_pos, FALSE);
1277
editor_display_current_line(idx, 0.5F);
1366
sci_set_current_position(doc->editor->sci, new_pos, FALSE);
1367
editor_display_current_line(doc->editor, 0.5F);
1282
1372
static void cb_func_clipboard(guint key_id)
1284
gint idx = document_get_cur_idx();
1374
GeanyDocument *doc = document_get_current();
1286
if (! DOC_IDX_VALID(idx)) return;
1288
1379
switch (key_id)
1310
1401
static void cb_func_goto_action(guint key_id)
1313
gint idx = document_get_cur_idx();
1315
if (! DOC_IDX_VALID(idx)) return;
1317
cur_line = sci_get_current_line(doc_list[idx].sci);
1404
GeanyDocument *doc = document_get_current();
1409
cur_line = sci_get_current_line(doc->editor->sci);
1319
1411
switch (key_id)
1321
1413
case GEANY_KEYS_GOTO_BACK:
1322
1414
navqueue_go_back();
1324
1416
case GEANY_KEYS_GOTO_FORWARD:
1325
1417
navqueue_go_forward();
1327
1419
case GEANY_KEYS_GOTO_LINE:
1328
1420
on_go_to_line1_activate(NULL, NULL);
1330
1422
case GEANY_KEYS_GOTO_MATCHINGBRACE:
1331
goto_matching_brace(idx);
1423
goto_matching_brace(doc);
1333
1425
case GEANY_KEYS_GOTO_TOGGLEMARKER:
1335
gboolean set = sci_is_marker_set_at_line(doc_list[idx].sci, cur_line, 1);
1427
gboolean set = sci_is_marker_set_at_line(doc->editor->sci, cur_line, 1);
1337
sci_set_marker_at_line(doc_list[idx].sci, cur_line, ! set, 1);
1429
sci_set_marker_at_line(doc->editor->sci, cur_line, ! set, 1);
1340
1432
case GEANY_KEYS_GOTO_NEXTMARKER:
1342
gint mline = sci_marker_next(doc_list[idx].sci, cur_line + 1, 1 << 1, TRUE);
1434
gint mline = sci_marker_next(doc->editor->sci, cur_line + 1, 1 << 1, TRUE);
1344
1436
if (mline != -1)
1346
sci_set_current_line(doc_list[idx].sci, mline);
1347
editor_display_current_line(idx, 0.5F);
1438
sci_set_current_line(doc->editor->sci, mline);
1439
editor_display_current_line(doc->editor, 0.5F);
1351
1443
case GEANY_KEYS_GOTO_PREVIOUSMARKER:
1353
gint mline = sci_marker_previous(doc_list[idx].sci, cur_line - 1, 1 << 1, TRUE);
1445
gint mline = sci_marker_previous(doc->editor->sci, cur_line - 1, 1 << 1, TRUE);
1355
1447
if (mline != -1)
1357
sci_set_current_line(doc_list[idx].sci, mline);
1358
editor_display_current_line(idx, 0.5F);
1449
sci_set_current_line(doc->editor->sci, mline);
1450
editor_display_current_line(doc->editor, 0.5F);
1362
1454
case GEANY_KEYS_GOTO_TAGDEFINITION:
1363
1455
if (check_current_word())
1364
1456
symbols_goto_tag(editor_info.current_word, TRUE);
1366
1458
case GEANY_KEYS_GOTO_TAGDECLARATION:
1367
1459
if (check_current_word())
1368
1460
symbols_goto_tag(editor_info.current_word, FALSE);
1463
/* only check editor-sensitive keybindings when editor has focus */
1464
if (gtk_window_get_focus(GTK_WINDOW(main_widgets.window)) != GTK_WIDGET(doc->editor->sci))
1466
ignore_keybinding = TRUE;
1471
case GEANY_KEYS_GOTO_LINESTART:
1472
sci_cmd(doc->editor->sci, editor_prefs.smart_home_key ? SCI_VCHOME : SCI_HOME);
1474
case GEANY_KEYS_GOTO_LINEEND:
1475
sci_cmd(doc->editor->sci, SCI_LINEEND);
1477
case GEANY_KEYS_GOTO_PREVWORDSTART:
1478
sci_cmd(doc->editor->sci, SCI_WORDPARTLEFT);
1480
case GEANY_KEYS_GOTO_NEXTWORDSTART:
1481
sci_cmd(doc->editor->sci, SCI_WORDPARTRIGHT);
1374
static void duplicate_lines(ScintillaObject *sci)
1487
static void duplicate_lines(GeanyEditor *editor)
1376
if (sci_get_lines_selected(sci) > 1)
1489
if (sci_get_lines_selected(editor->sci) > 1)
1377
1490
{ /* ignore extra_line because of selecting lines from the line number column */
1378
editor_select_lines(sci, FALSE);
1379
sci_selection_duplicate(sci);
1491
editor_select_lines(editor, FALSE);
1492
sci_selection_duplicate(editor->sci);
1381
else if (sci_can_copy(sci))
1382
sci_selection_duplicate(sci);
1494
else if (sci_has_selection(editor->sci))
1495
sci_selection_duplicate(editor->sci);
1384
sci_line_duplicate(sci);
1497
sci_line_duplicate(editor->sci);
1388
static void delete_lines(ScintillaObject *sci)
1501
static void delete_lines(GeanyEditor *editor)
1390
editor_select_lines(sci, TRUE); /* include last line (like cut lines, copy lines do) */
1391
sci_clear(sci); /* (SCI_LINEDELETE only does 1 line) */
1503
editor_select_lines(editor, TRUE); /* include last line (like cut lines, copy lines do) */
1504
sci_clear(editor->sci); /* (SCI_LINEDELETE only does 1 line) */
1395
1508
/* common function for editor keybindings, only valid when scintilla has focus. */
1396
1509
static void cb_func_editor_action(guint key_id)
1398
gint idx = document_get_cur_idx();
1399
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(app->window));
1511
GeanyDocument *doc = document_get_current();
1512
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1401
1514
/* edit keybindings only valid when scintilla widget has focus */
1402
if (! DOC_IDX_VALID(idx) || focusw != GTK_WIDGET(doc_list[idx].sci)) return;
1515
if (doc == NULL || focusw != GTK_WIDGET(doc->editor->sci))
1404
1518
switch (key_id)
1410
1524
on_redo1_activate(NULL, NULL);
1412
1526
case GEANY_KEYS_EDITOR_SCROLLTOLINE:
1413
editor_scroll_to_line(doc_list[idx].sci, -1, 0.5F);
1527
editor_scroll_to_line(doc->editor, -1, 0.5F);
1415
1529
case GEANY_KEYS_EDITOR_SCROLLLINEUP:
1416
sci_cmd(doc_list[idx].sci, SCI_LINESCROLLUP);
1530
sci_cmd(doc->editor->sci, SCI_LINESCROLLUP);
1418
1532
case GEANY_KEYS_EDITOR_SCROLLLINEDOWN:
1419
sci_cmd(doc_list[idx].sci, SCI_LINESCROLLDOWN);
1533
sci_cmd(doc->editor->sci, SCI_LINESCROLLDOWN);
1421
1535
case GEANY_KEYS_EDITOR_DUPLICATELINE:
1422
duplicate_lines(doc_list[idx].sci);
1536
duplicate_lines(doc->editor);
1424
1538
case GEANY_KEYS_EDITOR_DELETELINE:
1425
delete_lines(doc_list[idx].sci);
1539
delete_lines(doc->editor);
1427
1541
case GEANY_KEYS_EDITOR_TRANSPOSELINE:
1428
sci_cmd(doc_list[idx].sci, SCI_LINETRANSPOSE);
1542
sci_cmd(doc->editor->sci, SCI_LINETRANSPOSE);
1430
1544
case GEANY_KEYS_EDITOR_AUTOCOMPLETE:
1431
editor_start_auto_complete(idx, sci_get_current_position(doc_list[idx].sci), TRUE);
1545
editor_start_auto_complete(doc->editor, sci_get_current_position(doc->editor->sci), TRUE);
1433
1547
case GEANY_KEYS_EDITOR_CALLTIP:
1434
editor_show_calltip(idx, -1);
1548
editor_show_calltip(doc->editor, -1);
1436
1550
case GEANY_KEYS_EDITOR_MACROLIST:
1437
editor_show_macro_list(doc_list[idx].sci);
1551
editor_show_macro_list(doc->editor);
1439
1553
case GEANY_KEYS_EDITOR_CONTEXTACTION:
1440
1554
if (check_current_word())
1441
on_context_action1_activate(GTK_MENU_ITEM(lookup_widget(app->popup_menu,
1555
on_context_action1_activate(GTK_MENU_ITEM(lookup_widget(main_widgets.editor_menu,
1442
1556
"context_action1")), NULL);
1444
1558
case GEANY_KEYS_EDITOR_SUPPRESSSNIPPETCOMPLETION:
1446
KeyBinding *kb = keybindings_lookup_item(GEANY_KEY_GROUP_EDITOR,
1560
GeanyKeyBinding *kb = keybindings_lookup_item(GEANY_KEY_GROUP_EDITOR,
1447
1561
GEANY_KEYS_EDITOR_COMPLETESNIPPET);
1449
1563
switch (kb->key)
1451
1565
case GDK_space:
1452
sci_add_text(doc_list[idx].sci, " ");
1566
sci_add_text(doc->editor->sci, " ");
1455
sci_cmd(doc_list[idx].sci, SCI_TAB);
1569
sci_cmd(doc->editor->sci, SCI_TAB);
1490
1605
on_menu_decrease_indent1_activate(NULL, NULL);
1492
1607
case GEANY_KEYS_FORMAT_INCREASEINDENTBYSPACE:
1493
editor_indentation_by_one_space(idx, -1, FALSE);
1608
editor_indentation_by_one_space(doc->editor, -1, FALSE);
1495
1610
case GEANY_KEYS_FORMAT_DECREASEINDENTBYSPACE:
1496
editor_indentation_by_one_space(idx, -1, TRUE);
1611
editor_indentation_by_one_space(doc->editor, -1, TRUE);
1498
1613
case GEANY_KEYS_FORMAT_AUTOINDENT:
1499
editor_auto_line_indentation(idx, -1);
1614
editor_smart_line_indentation(doc->editor, -1);
1501
1616
case GEANY_KEYS_FORMAT_TOGGLECASE:
1502
1617
on_toggle_case1_activate(NULL, NULL);
1504
1619
case GEANY_KEYS_FORMAT_SENDTOCMD1:
1505
1620
if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 0)
1506
tools_execute_custom_command(idx, ui_prefs.custom_commands[0]);
1621
tools_execute_custom_command(doc, ui_prefs.custom_commands[0]);
1508
1623
case GEANY_KEYS_FORMAT_SENDTOCMD2:
1509
1624
if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 1)
1510
tools_execute_custom_command(idx, ui_prefs.custom_commands[1]);
1625
tools_execute_custom_command(doc, ui_prefs.custom_commands[1]);
1512
1627
case GEANY_KEYS_FORMAT_SENDTOCMD3:
1513
1628
if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 2)
1514
tools_execute_custom_command(idx, ui_prefs.custom_commands[2]);
1629
tools_execute_custom_command(doc, ui_prefs.custom_commands[2]);
1520
1635
/* common function for select keybindings, only valid when scintilla has focus. */
1521
1636
static void cb_func_select_action(guint key_id)
1523
gint idx = document_get_cur_idx();
1524
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(app->window));
1638
GeanyDocument *doc = document_get_current();
1639
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1640
static GtkWidget *scribble_widget = NULL;
1642
/* special case for Select All in the scribble widget */
1643
if (scribble_widget == NULL) /* lookup the scribble widget only once */
1644
scribble_widget = lookup_widget(main_widgets.window, "textview_scribble");
1645
if (key_id == GEANY_KEYS_SELECT_ALL && focusw == scribble_widget)
1647
g_signal_emit_by_name(scribble_widget, "select-all", TRUE);
1526
1651
/* keybindings only valid when scintilla widget has focus */
1527
if (! DOC_IDX_VALID(idx) || focusw != GTK_WIDGET(doc_list[idx].sci)) return;
1652
if (doc == NULL || focusw != GTK_WIDGET(doc->editor->sci))
1529
1655
switch (key_id)
1532
1658
on_menu_select_all1_activate(NULL, NULL);
1534
1660
case GEANY_KEYS_SELECT_WORD:
1535
editor_select_word(doc_list[idx].sci);
1661
editor_select_word(doc->editor);
1537
1663
case GEANY_KEYS_SELECT_LINE:
1538
editor_select_lines(doc_list[idx].sci, FALSE);
1664
editor_select_lines(doc->editor, FALSE);
1540
1666
case GEANY_KEYS_SELECT_PARAGRAPH:
1541
editor_select_paragraph(doc_list[idx].sci);
1667
editor_select_paragraph(doc->editor);
1547
static void cb_func_menu_replacetabs(G_GNUC_UNUSED guint key_id)
1673
static void cb_func_document_action(guint key_id)
1549
on_replace_tabs_activate(NULL, NULL);
1675
GeanyDocument *doc = document_get_current();
1681
case GEANY_KEYS_DOCUMENT_REPLACETABS:
1682
on_replace_tabs_activate(NULL, NULL);
1684
case GEANY_KEYS_DOCUMENT_REPLACESPACES:
1685
on_replace_spaces_activate(NULL, NULL);
1687
case GEANY_KEYS_DOCUMENT_LINEBREAK:
1688
on_line_breaking1_activate(NULL, NULL);
1690
case GEANY_KEYS_DOCUMENT_LINEWRAP:
1691
on_line_wrapping1_toggled(NULL, NULL);
1693
case GEANY_KEYS_DOCUMENT_RELOADTAGLIST:
1694
document_update_tag_list(doc, TRUE);
1696
case GEANY_KEYS_DOCUMENT_FOLDALL:
1697
editor_fold_all(doc->editor);
1699
case GEANY_KEYS_DOCUMENT_UNFOLDALL:
1700
editor_unfold_all(doc->editor);
1702
case GEANY_KEYS_DOCUMENT_TOGGLEFOLD:
1703
if (editor_prefs.folding)
1705
gint line = sci_get_current_line(doc->editor->sci);
1706
sci_toggle_fold(doc->editor->sci, line);
1553
1713
/* common function for insert keybindings, only valid when scintilla has focus. */
1554
1714
static void cb_func_insert_action(guint key_id)
1556
gint idx = document_get_cur_idx();
1557
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(app->window));
1716
GeanyDocument *doc = document_get_current();
1717
GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1559
1719
/* keybindings only valid when scintilla widget has focus */
1560
if (! DOC_IDX_VALID(idx) || focusw != GTK_WIDGET(doc_list[idx].sci)) return;
1720
if (doc == NULL || focusw != GTK_WIDGET(doc->editor->sci)) return;
1562
1722
switch (key_id)
1564
1724
case GEANY_KEYS_INSERT_ALTWHITESPACE:
1565
editor_insert_alternative_whitespace(idx);
1725
editor_insert_alternative_whitespace(doc->editor);
1567
1727
case GEANY_KEYS_INSERT_DATE:
1568
gtk_menu_item_activate(GTK_MENU_ITEM(lookup_widget(app->window, "insert_date_custom1")));
1728
gtk_menu_item_activate(GTK_MENU_ITEM(lookup_widget(main_widgets.window, "insert_date_custom1")));