geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

keybindings.c
Go to the documentation of this file.
1/*
2 * keybindings.c - this file is part of Geany, a fast and lightweight IDE
3 *
4 * Copyright 2006 The Geany contributors
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21/**
22 * @file keybindings.h
23 * Configurable keyboard shortcuts.
24 * - keybindings_send_command() mimics a built-in keybinding action.
25 * - @ref GeanyKeyGroupID lists groups of built-in keybindings.
26 * @see plugin_set_key_group().
27 **/
28
29#ifdef HAVE_CONFIG_H
30# include "config.h"
31#endif
32
33#include "keybindings.h"
34
35#include "app.h"
36#include "build.h"
37#include "callbacks.h"
38#include "documentprivate.h"
39#include "filetypes.h"
40#include "geanyobject.h"
41#include "keybindingsprivate.h"
42#include "main.h"
43#include "msgwindow.h"
44#include "navqueue.h"
45#include "notebook.h"
46#include "prefs.h"
47#include "sciwrappers.h"
48#include "sidebar.h"
49#include "support.h"
50#include "symbols.h"
51#include "toolbar.h"
52#include "tools.h"
53#include "ui_utils.h"
54#include "utils.h"
55#include "vte.h"
56
57#include <gtk/gtk.h>
58#include <gdk/gdkkeysyms.h>
59#include <string.h>
60
61
62GPtrArray *keybinding_groups; /* array of GeanyKeyGroup pointers, in visual order */
63
64/* keyfile group name for non-plugin KB groups */
65static const gchar keybindings_keyfile_group_name[] = "Bindings";
66
67/* core keybindings */
69
70static GtkAccelGroup *kb_accel_group = NULL;
71static const gboolean swap_alt_tab_order = FALSE;
72
73
74/* central keypress event handler, almost all keypress events go to this function */
75static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data);
76
77static gboolean check_current_word(GeanyDocument *doc, gboolean sci_word);
78static gboolean read_current_word(GeanyDocument *doc, gboolean sci_word);
79static gchar *get_current_word_or_sel(GeanyDocument *doc, gboolean sci_word);
80
81static gboolean cb_func_file_action(guint key_id);
82static gboolean cb_func_project_action(guint key_id);
83static gboolean cb_func_editor_action(guint key_id);
84static gboolean cb_func_select_action(guint key_id);
85static gboolean cb_func_format_action(guint key_id);
86static gboolean cb_func_insert_action(guint key_id);
87static gboolean cb_func_search_action(guint key_id);
88static gboolean cb_func_goto_action(guint key_id);
89static gboolean cb_func_switch_action(guint key_id);
90static gboolean cb_func_clipboard_action(guint key_id);
91static gboolean cb_func_document_action(guint key_id);
92static gboolean cb_func_view_action(guint key_id);
93
94/* note: new keybindings should normally use per group callbacks */
95static void cb_func_menu_help(guint key_id);
96static void cb_func_menu_preferences(guint key_id);
97
98static void cb_func_menu_fullscreen(guint key_id);
99static void cb_func_menu_messagewindow(guint key_id);
100
101static void cb_func_menu_opencolorchooser(guint key_id);
102
103static void cb_func_switch_tableft(guint key_id);
104static void cb_func_switch_tabright(guint key_id);
105static void cb_func_switch_tablastused(guint key_id);
106static void cb_func_move_tab(guint key_id);
107
108static void add_popup_menu_accels(void);
109
110
111/** Gets significant modifiers from a GdkModifierType mask. The set of
112 * significant modifiers corresponds to the default modifier mask as returned
113 * by @c gtk_accelerator_get_default_mod_mask(). In addition, it improves
114 * the Command key handling on OS X by adding @c GEANY_PRIMARY_MOD_MASK
115 * when needed. For this reason it is preferred to use this function
116 * instead of @c gtk_accelerator_set_default_mod_mask().
117 * @param mods GdkModifierType mask.
118 * @return Significant modifiers from the mask.
119 * @since 1.25. */
120GEANY_API_SYMBOL
121GdkModifierType keybindings_get_modifiers(GdkModifierType mods)
122{
123#ifdef __APPLE__
124 if (mods & GDK_MOD2_MASK)
125 {
127 mods &= ~GDK_MOD2_MASK;
128 }
129#endif
130 return mods & gtk_accelerator_get_default_mod_mask();
131}
132
133
134/** Looks up a keybinding item.
135 * @param group Group.
136 * @param key_id Keybinding index for the group.
137 * @return @transfer{none} The keybinding.
138 * @since 0.19. */
139GEANY_API_SYMBOL
141{
142 if (group->plugin)
143 {
144 g_assert(key_id < group->plugin_key_count);
145 return &group->plugin_keys[key_id];
146 }
147 g_assert(key_id < GEANY_KEYS_COUNT);
148 return &binding_ids[key_id];
149}
150
151
152/* This is used to set default keybindings on startup.
153 * Menu accels are set in apply_kb_accel(). */
154/** @girskip
155 * Fills a GeanyKeyBinding struct item.
156 * @note Always set @a key and @a mod to 0, otherwise you will likely
157 * cause conflicts with the user's custom, other plugin's keybindings or
158 * future default keybindings.
159 * @param group Group.
160 * @param key_id Keybinding index for the group.
161 * @param callback @nullable Function to call when activated, or @c NULL to use the group callback.
162 * Usually it's better to use the group callback instead - see plugin_set_key_group().
163 * @param key Default key, e.g. @c GDK_KEY_j (must be lower case), but usually 0 for unset.
164 * @param mod Default modifier, e.g. @c GDK_CONTROL_MASK, but usually 0 for unset.
165 * @param kf_name Key name used for this item in the keybindings configuration file, i.e. @c "menu_new".
166 * @param label Label used in the preferences dialog keybindings tab. May contain
167 * underscores - these won't be displayed.
168 * @param menu_item @nullable Optional widget to set an accelerator for, or @c NULL.
169 * @return The keybinding - normally this is ignored. */
170GEANY_API_SYMBOL
172 GeanyKeyCallback callback, guint key, GdkModifierType mod,
173 const gchar *kf_name, const gchar *label, GtkWidget *menu_item)
174{
175 GeanyKeyBinding *kb;
176
177 g_assert(group->name);
178 kb = keybindings_get_item(group, key_id);
179 g_assert(!kb->name);
180 g_ptr_array_add(group->key_items, kb);
181
182 if (group->plugin)
183 {
184 /* some plugins e.g. GeanyLua need these fields duplicated */
185 SETPTR(kb->name, g_strdup(kf_name));
186 SETPTR(kb->label, g_strdup(label));
187 }
188 else
189 {
190 /* we don't touch these strings unless group->plugin is set, const cast is safe */
191 kb->name = (gchar *)kf_name;
192 kb->label = (gchar *)label;
193 }
194 kb->key = key;
195 kb->mods = mod;
196 kb->default_key = key;
197 kb->default_mods = mod;
198 kb->callback = callback;
199 kb->cb_func = NULL;
200 kb->cb_data = NULL;
201 kb->menu_item = menu_item;
202 kb->id = key_id;
203 return kb;
204}
205
206
207/** Creates a new keybinding using a GeanyKeyBindingFunc and attaches it to a keybinding group
208 *
209 * If given the callback should return @c TRUE if the keybinding was handled, otherwise @c FALSE
210 * to allow other callbacks to be run. This allows for multiplexing keybindings on the same keys,
211 * depending on the focused widget (or context). If the callback is NULL the group's callback will
212 * be invoked, but the same rule applies.
213 *
214 * @param group Group.
215 * @param key_id Keybinding index for the group.
216 * @param key Default key, e.g. @c GDK_KEY_j (must be lower case), but usually 0 for unset.
217 * @param mod Default modifier, e.g. @c GDK_CONTROL_MASK, but usually 0 for unset.
218 * @param kf_name Key name used for this item in the keybindings configuration file, i.e. @c "menu_new".
219 * @param label Label used in the preferences dialog keybindings tab. May contain
220 * underscores - these won't be displayed.
221 * @param menu_item @nullable Optional widget to set an accelerator for, or @c NULL.
222 * @param cb @nullable New-style callback to be called when activated, or @c NULL to use the group callback.
223 * @param pdata Plugin-specific data passed back to the callback @a cb.
224 * @param destroy_notify Function that is invoked to free the plugin data when not needed anymore.
225 * @return @transfer{none} The keybinding - normally this is ignored.
226 *
227 * @since 1.26 (API 226)
228 * @see See plugin_set_key_group_full
229 **/
230GEANY_API_SYMBOL
232 guint key, GdkModifierType mod, const gchar *kf_name, const gchar *label,
233 GtkWidget *menu_item, GeanyKeyBindingFunc cb, gpointer pdata,
234 GDestroyNotify destroy_notify)
235{
236 GeanyKeyBinding *kb;
237
238 /* For now, this is intended for plugins only */
239 g_assert(group->plugin);
240
241 kb = keybindings_set_item(group, key_id, NULL, key, mod, kf_name, label, menu_item);
242 kb->cb_func = cb;
243 kb->cb_data = pdata;
244 kb->cb_data_destroy = destroy_notify;
245 return kb;
246}
247
248
249static void free_key_binding(gpointer item)
250{
251 GeanyKeyBinding *kb = item;
252
253 g_free(kb->name);
254 g_free(kb->label);
255
256 if (kb->cb_data_destroy)
257 kb->cb_data_destroy(kb->cb_data);
258}
259
260
262 const gchar *name, const gchar *label, GeanyKeyGroupCallback callback, gboolean plugin)
263{
264 g_ptr_array_add(keybinding_groups, group);
265
266 /* as for items, we only require duplicated name and label for plugins */
267 group->name = plugin ? g_strdup(name) : name;
268 group->label = plugin ? g_strdup(label) : label;
269 group->callback = callback;
270 group->cb_func = NULL;
271 group->cb_data = NULL;
272 group->plugin = plugin;
273 /* Only plugins use the destroy notify thus far */
274 group->key_items = g_ptr_array_new_with_free_func(plugin ? free_key_binding : NULL);
275}
276
277
279{
281
282 g_return_val_if_fail(id < GEANY_KEY_GROUP_COUNT, NULL);
283
284 return &groups[id];
285}
286
287
288static void add_kb(GeanyKeyGroup *group, gsize key_id,
289 GeanyKeyCallback callback, guint key, GdkModifierType mod,
290 const gchar *kf_name, const gchar *label, const gchar *widget_name)
291{
292 GtkWidget *widget = widget_name ?
294
295 keybindings_set_item(group, key_id, callback,
296 key, mod, kf_name, label, widget);
297}
298
299
300#define ADD_KB_GROUP(group_id, label, callback) \
301 add_kb_group(keybindings_get_core_group(group_id),\
302 keybindings_keyfile_group_name, label, callback, FALSE)
303
304static void init_default_kb(void)
305{
307
308 /* visual group order */
325 ADD_KB_GROUP(GEANY_KEY_GROUP_NOTEBOOK, _("Notebook tab"), NULL);
326
327 /* Init all fields of keys with default values.
328 * The menu_item field is always the main menu item, popup menu accelerators are
329 * set in add_popup_menu_accels(). */
330
332
334 GDK_KEY_n, GEANY_PRIMARY_MOD_MASK, "menu_new", _("New"), "menu_new1");
336 GDK_KEY_o, GEANY_PRIMARY_MOD_MASK, "menu_open", _("Open"), "menu_open1");
338 GDK_KEY_o, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "menu_open_selected",
339 _("Open selected file"), "menu_open_selected_file1");
341 GDK_KEY_s, GEANY_PRIMARY_MOD_MASK, "menu_save", _("Save"), "menu_save1");
343 0, 0, "menu_saveas", _("Save as"), "menu_save_as1");
345 GDK_KEY_s, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "menu_saveall", _("Save all"),
346 "menu_save_all1");
348 GDK_KEY_v, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "file_properties", _("Properties"), "properties1");
350 GDK_KEY_p, GEANY_PRIMARY_MOD_MASK, "menu_print", _("Print"), "print1");
352 GDK_KEY_w, GEANY_PRIMARY_MOD_MASK, "menu_close", _("Close"), "menu_close1");
354 GDK_KEY_w, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "menu_closeall", _("Close all"),
355 "menu_close_all1");
357 GDK_KEY_r, GEANY_PRIMARY_MOD_MASK, "menu_reloadfile", _("Reload file"), "menu_reload1");
359 0, 0, "menu_reloadall", _("Reload all files"), NULL);
361 0, 0, "file_openlasttab", _("Re-open last closed tab"), NULL);
363 GDK_KEY_q, GEANY_PRIMARY_MOD_MASK, "menu_quit", _("Quit"), "menu_quit1");
364
366
368 0, 0, "project_new", _("New"), "project_new1");
370 0, 0, "project_open", _("Open"), "project_open1");
372 0, 0, "project_properties",
373 ui_lookup_stock_label(GTK_STOCK_PROPERTIES), "project_properties1");
375 0, 0, "project_close", _("Close"), "project_close1");
376
378
380 GDK_KEY_z, GEANY_PRIMARY_MOD_MASK, "menu_undo", _("Undo"), "menu_undo2");
382 GDK_KEY_y, GEANY_PRIMARY_MOD_MASK, "menu_redo", _("Redo"), "menu_redo2");
384 GDK_KEY_d, GEANY_PRIMARY_MOD_MASK, "edit_duplicateline", _("D_uplicate Line or Selection"),
385 "duplicate_line_or_selection1");
387 GDK_KEY_k, GEANY_PRIMARY_MOD_MASK, "edit_deleteline", _("_Delete Current Line(s)"),
388 "delete_current_lines1");
390 GDK_KEY_Delete, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "edit_deletelinetoend",
391 _("Delete to line end"), NULL);
393 GDK_KEY_BackSpace, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "edit_deletelinetobegin",
394 _("Delete to beginning of line"), NULL);
395 /* Note: transpose may fit better in format group, but that would break the API */
397 0, 0, "edit_transposeline", _("_Transpose Current Line"), NULL);
399 GDK_KEY_l, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "edit_scrolltoline", _("Scroll to current line"), NULL);
401 GDK_KEY_Up, GDK_MOD1_MASK, "edit_scrolllineup", _("Scroll up the view by one line"), NULL);
403 GDK_KEY_Down, GDK_MOD1_MASK, "edit_scrolllinedown", _("Scroll down the view by one line"), NULL);
405 GDK_KEY_Tab, 0, "edit_completesnippet", _("Complete snippet"), NULL);
407 0, 0, "move_snippetnextcursor", _("Move cursor in snippet"), NULL);
409 0, 0, "edit_suppresssnippetcompletion", _("Suppress snippet completion"), NULL);
411 0, 0, "popup_contextaction", _("Context Action"), NULL);
413 GDK_KEY_space, GEANY_PRIMARY_MOD_MASK, "edit_autocomplete", _("Complete word"), NULL);
415 GDK_KEY_space, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "edit_calltip", _("Show calltip"), NULL);
417 GDK_KEY_Tab, 0, "edit_wordpartcompletion", _("Word part completion"), NULL);
419 GDK_KEY_Page_Up, GDK_MOD1_MASK, "edit_movelineup",
420 _("Move line(s) up"), "move_lines_up1");
422 GDK_KEY_Page_Down, GDK_MOD1_MASK, "edit_movelinedown",
423 _("Move line(s) down"), "move_lines_down1");
424
426
428 GDK_KEY_x, GEANY_PRIMARY_MOD_MASK, "menu_cut", _("Cut"), "menu_cut1");
430 GDK_KEY_c, GEANY_PRIMARY_MOD_MASK, "menu_copy", _("Copy"), "menu_copy1");
432 GDK_KEY_v, GEANY_PRIMARY_MOD_MASK, "menu_paste", _("Paste"), "menu_paste1");
434 GDK_KEY_c, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "edit_copyline", _("_Copy Current Line(s)"),
435 "copy_current_lines1");
437 GDK_KEY_x, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "edit_cutline", _("Cu_t Current Line(s)"),
438 "cut_current_lines1");
439
441
443 GDK_KEY_a, GEANY_PRIMARY_MOD_MASK, "menu_selectall", _("Select All"), "menu_select_all1");
445 GDK_KEY_w, GDK_SHIFT_MASK | GDK_MOD1_MASK, "edit_selectword", _("Select current word"), NULL);
447 GDK_KEY_l, GDK_SHIFT_MASK | GDK_MOD1_MASK, "edit_selectline", _("S_elect Current Line(s)"),
448 "select_current_lines1");
450 GDK_KEY_p, GDK_SHIFT_MASK | GDK_MOD1_MASK, "edit_selectparagraph", _("Se_lect Current Paragraph"),
451 "select_current_paragraph1");
453 0, 0, "edit_selectwordpartleft", _("Select to previous word part"), NULL);
455 0, 0, "edit_selectwordpartright", _("Select to next word part"), NULL);
456
458
460 GDK_KEY_u, GEANY_PRIMARY_MOD_MASK | GDK_MOD1_MASK, "edit_togglecase",
461 _("T_oggle Case of Selection"), "menu_toggle_case2");
463 GDK_KEY_e, GEANY_PRIMARY_MOD_MASK, "edit_commentlinetoggle", _("Toggle line commentation"),
464 "menu_toggle_line_commentation1");
466 0, 0, "edit_commentline", _("Comment line(s)"), "menu_comment_line1");
468 0, 0, "edit_uncommentline", _("Uncomment line(s)"), "menu_uncomment_line1");
470 GDK_KEY_i, GEANY_PRIMARY_MOD_MASK, "edit_increaseindent", _("Increase indent"),
471 "menu_increase_indent1");
473 GDK_KEY_u, GEANY_PRIMARY_MOD_MASK, "edit_decreaseindent", _("Decrease indent"),
474 "menu_decrease_indent1");
476 0, 0, "edit_increaseindentbyspace", _("Increase indent by one space"), NULL);
478 0, 0, "edit_decreaseindentbyspace", _("Decrease indent by one space"), NULL);
480 0, 0, "edit_autoindent", _("S_mart Line Indent"), "smart_line_indent1");
482 GDK_KEY_1, GEANY_PRIMARY_MOD_MASK, "edit_sendtocmd1", _("Send to Custom Command 1"), NULL);
484 GDK_KEY_2, GEANY_PRIMARY_MOD_MASK, "edit_sendtocmd2", _("Send to Custom Command 2"), NULL);
486 GDK_KEY_3, GEANY_PRIMARY_MOD_MASK, "edit_sendtocmd3", _("Send to Custom Command 3"), NULL);
488 0, 0, "edit_sendtocmd4", _("Send to Custom Command 4"), NULL);
490 0, 0, "edit_sendtocmd5", _("Send to Custom Command 5"), NULL);
492 0, 0, "edit_sendtocmd6", _("Send to Custom Command 6"), NULL);
494 0, 0, "edit_sendtocmd7", _("Send to Custom Command 7"), NULL);
496 0, 0, "edit_sendtocmd8", _("Send to Custom Command 8"), NULL);
498 0, 0, "edit_sendtocmd9", _("Send to Custom Command 9"), NULL);
499 /* may fit better in editor group */
501 0, 0, "edit_sendtovte", _("_Send Selection to Terminal"), "send_selection_to_vte1");
503 GDK_KEY_j, GEANY_PRIMARY_MOD_MASK, "format_reflowparagraph", _("_Reflow Lines/Block"),
504 "reflow_lines_block1");
506 0, 0, "edit_joinlines", _("Join lines"), NULL);
507
509
511 GDK_KEY_d, GDK_SHIFT_MASK | GDK_MOD1_MASK, "menu_insert_date", _("Insert date"),
512 "insert_date_custom1");
514 0, 0, "edit_insertwhitespace", _("Insert Alternative _White Space"),
515 "insert_alternative_white_space1");
517 0, 0, "edit_insertlinebefore", _("Insert New Line Before Current"), NULL);
519 0, 0, "edit_insertlineafter", _("Insert New Line After Current"), NULL);
520
522
524 GDK_KEY_p, GEANY_PRIMARY_MOD_MASK | GDK_MOD1_MASK, "menu_preferences", _("Preferences"),
525 "preferences1");
527 0, 0, "menu_pluginpreferences", _("P_lugin Preferences"), "plugin_preferences1");
528
530
532 GDK_KEY_f, GEANY_PRIMARY_MOD_MASK, "menu_find", _("Find"), "find1");
534 GDK_KEY_g, GEANY_PRIMARY_MOD_MASK, "menu_findnext", _("Find Next"), "find_next1");
536 GDK_KEY_g, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "menu_findprevious", _("Find Previous"),
537 "find_previous1");
539 0, 0, "menu_findnextsel", _("Find Next _Selection"), "find_nextsel1");
541 0, 0, "menu_findprevsel", _("Find Pre_vious Selection"), "find_prevsel1");
543 GDK_KEY_h, GEANY_PRIMARY_MOD_MASK, "menu_replace", _("Replace"), "replace1");
545 GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "menu_findinfiles", _("Find in Files"),
546 "find_in_files1");
548 0, 0, "menu_nextmessage", _("Next Message"), "next_message1");
550 0, 0, "menu_previousmessage", _("Previous Message"), "previous_message1");
552 GDK_KEY_e, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "popup_findusage",
553 _("Find Usage"), "find_usage1");
555 GDK_KEY_d, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "popup_finddocumentusage",
556 _("Find Document Usage"), "find_document_usage1");
558 GDK_KEY_m, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "find_markall", _("_Mark All"), "mark_all1");
559
561
563 GDK_KEY_Left, GDK_MOD1_MASK, "nav_back", _("Navigate back a location"), NULL);
565 GDK_KEY_Right, GDK_MOD1_MASK, "nav_forward", _("Navigate forward a location"), NULL);
567 GDK_KEY_l, GEANY_PRIMARY_MOD_MASK, "menu_gotoline", _("Go to Line"), "go_to_line1");
569 GDK_KEY_b, GEANY_PRIMARY_MOD_MASK, "edit_gotomatchingbrace",
570 _("Go to matching brace"), NULL);
572 GDK_KEY_m, GEANY_PRIMARY_MOD_MASK, "edit_togglemarker",
573 _("Toggle marker"), NULL);
575 GDK_KEY_period, GEANY_PRIMARY_MOD_MASK, "edit_gotonextmarker",
576 _("Go to Ne_xt Marker"), "go_to_next_marker1");
578 GDK_KEY_comma, GEANY_PRIMARY_MOD_MASK, "edit_gotopreviousmarker",
579 _("Go to Pre_vious Marker"), "go_to_previous_marker1");
581 GDK_KEY_t, GEANY_PRIMARY_MOD_MASK, "popup_gototagdefinition",
582 _("Go to Symbol Definition"), "goto_tag_definition1");
584 GDK_KEY_t, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "popup_gototagdeclaration",
585 _("Go to Symbol Declaration"), "goto_tag_declaration1");
587 GDK_KEY_Home, 0, "edit_gotolinestart", _("Go to Start of Line"), NULL);
589 GDK_KEY_End, 0, "edit_gotolineend", _("Go to End of Line"), NULL);
591 GDK_KEY_Home, GDK_MOD1_MASK, "edit_gotolinestartvisual", _("Go to Start of Display Line"), NULL);
593 GDK_KEY_End, GDK_MOD1_MASK, "edit_gotolineendvisual", _("Go to End of Display Line"), NULL);
595 GDK_KEY_slash, GEANY_PRIMARY_MOD_MASK, "edit_prevwordstart", _("Go to Previous Word Part"), NULL);
597 GDK_KEY_backslash, GEANY_PRIMARY_MOD_MASK, "edit_nextwordstart", _("Go to Next Word Part"), NULL);
598
600
602 0, 0, "menu_toggleall", _("Toggle All Additional Widgets"),
603 "menu_toggle_all_additional_widgets1");
605 GDK_KEY_F11, 0, "menu_fullscreen", _("Fullscreen"), "menu_fullscreen1");
607 0, 0, "menu_messagewindow", _("Toggle Messages Window"),
608 "menu_show_messages_window1");
610 0, 0, "toggle_sidebar", _("Toggle Sidebar"), "menu_show_sidebar1");
612 GDK_KEY_plus, GEANY_PRIMARY_MOD_MASK, "menu_zoomin", _("Zoom In"), "menu_zoom_in1");
614 GDK_KEY_minus, GEANY_PRIMARY_MOD_MASK, "menu_zoomout", _("Zoom Out"), "menu_zoom_out1");
616 GDK_KEY_0, GEANY_PRIMARY_MOD_MASK, "normal_size", _("Zoom Reset"), "normal_size1");
617
619
621 GDK_KEY_F2, 0, "switch_editor", _("Switch to Editor"), NULL);
623 GDK_KEY_F7, 0, "switch_search_bar", _("Switch to Search Bar"), NULL);
625 0, 0, "switch_message_window", _("Switch to Message Window"), NULL);
627 0, 0, "switch_compiler", _("Switch to Compiler"), NULL);
629 0, 0, "switch_messages", _("Switch to Messages"), NULL);
631 GDK_KEY_F6, 0, "switch_scribble", _("Switch to Scribble"), NULL);
633 GDK_KEY_F4, 0, "switch_vte", _("Switch to VTE"), NULL);
635 0, 0, "switch_sidebar", _("Switch to Sidebar"), NULL);
637 0, 0, "switch_sidebar_symbol_list", _("Switch to Sidebar Symbol List"), NULL);
639 0, 0, "switch_sidebar_doc_list", _("Switch to Sidebar Document List"), NULL);
640
642
644 GDK_KEY_Page_Up, GEANY_PRIMARY_MOD_MASK, "switch_tableft", _("Switch to left document"), NULL);
646 GDK_KEY_Page_Down, GEANY_PRIMARY_MOD_MASK, "switch_tabright", _("Switch to right document"), NULL);
648 GDK_KEY_Tab, GEANY_PRIMARY_MOD_MASK, "switch_tablastused", _("Switch to last used document"), NULL);
650 GDK_KEY_Page_Up, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "move_tableft",
651 _("Move document left"), NULL);
653 GDK_KEY_Page_Down, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, "move_tabright",
654 _("Move document right"), NULL);
656 0, 0, "move_tabfirst", _("Move document first"), NULL);
658 0, 0, "move_tablast", _("Move document last"), NULL);
659
661
663 0, 0, "menu_linewrap", _("Toggle Line wrapping"), "menu_line_wrapping1");
665 0, 0, "menu_linebreak", _("Toggle Line breaking"), "line_breaking1");
667 0, 0, "menu_clone", _("_Clone"), "clone1");
669 0, 0, "menu_strip_trailing_spaces", _("_Strip Trailing Spaces"), "strip_trailing_spaces1");
671 0, 0, "menu_replacetabs", _("Replace tabs with space"), "menu_replace_tabs");
673 0, 0, "menu_replacespaces", _("Replace spaces with tabs"), "menu_replace_spaces");
675 0, 0, "menu_togglefold", _("Toggle current fold"), NULL);
677 0, 0, "menu_foldall", _("Fold all"), "menu_fold_all1");
679 0, 0, "menu_unfoldall", _("Unfold all"), "menu_unfold_all1");
681 GDK_KEY_r, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "reloadtaglist", _("Reload symbol list"), NULL);
683 0, 0, "remove_markers", _("Remove Markers"), "remove_markers1");
685 0, 0, "remove_error_indicators", _("Remove Error Indicators"), "menu_remove_indicators1");
687 0, 0, "remove_markers_and_indicators", _("Remove Markers and Error Indicators"), NULL);
688
690
692 GDK_KEY_F8, 0, "build_compile", _("Compile"), NULL);
694 GDK_KEY_F9, 0, "build_link", _("Build"), NULL);
696 GDK_KEY_F9, GDK_SHIFT_MASK, "build_make", _("Make all"), NULL);
698 GDK_KEY_F9, GDK_SHIFT_MASK | GEANY_PRIMARY_MOD_MASK, "build_makeowntarget",
699 _("Make custom target"), NULL);
701 GDK_KEY_F8, GDK_SHIFT_MASK, "build_makeobject", _("Make object"), NULL);
703 0, 0, "build_nexterror", _("Next error"), NULL);
705 0, 0, "build_previouserror", _("Previous error"), NULL);
707 GDK_KEY_F5, 0, "build_run", _("Run"), NULL);
709 0, 0, "build_options", _("Build options"), NULL);
710
712
714 0, 0, "menu_opencolorchooser", _("Show Color Chooser"), "menu_choose_color1");
715
717
719 GDK_KEY_F1, 0, "menu_help", _("Help"), "help1");
720}
721
722
723static void free_key_group(gpointer item)
724{
725 GeanyKeyGroup *group = item;
726
727 g_ptr_array_free(group->key_items, TRUE);
728
729 if (group->plugin)
730 {
731 if (group->cb_data_destroy)
732 group->cb_data_destroy(group->cb_data);
733 g_free(group->plugin_keys);
734 /* we allocated those in add_kb_group() as it's a plugin group */
735 g_free((gchar *) group->name);
736 g_free((gchar *) group->label);
737 g_free(group);
738 }
739}
740
741
743{
744 memset(binding_ids, 0, sizeof binding_ids);
745 keybinding_groups = g_ptr_array_sized_new(GEANY_KEY_GROUP_COUNT);
746 g_ptr_array_set_free_func(keybinding_groups, free_key_group);
747 kb_accel_group = gtk_accel_group_new();
748
750 gtk_window_add_accel_group(GTK_WINDOW(main_widgets.window), kb_accel_group);
751
752 g_signal_connect(main_widgets.window, "key-press-event", G_CALLBACK(on_key_press_event), NULL);
753}
754
755
756typedef void (*KBItemCallback) (GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data);
757
758static void keybindings_foreach(KBItemCallback cb, gpointer user_data)
759{
760 gsize g, i;
762 GeanyKeyBinding *kb;
763
765 {
766 foreach_ptr_array(kb, i, group->key_items)
767 cb(group, kb, user_data);
768 }
769}
770
771
772static void load_kb(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
773{
774 GKeyFile *config = user_data;
775 gchar *val;
776 guint key;
777 GdkModifierType mods;
778
779 val = g_key_file_get_string(config, group->name, kb->name, NULL);
780 if (val != NULL)
781 {
782 gtk_accelerator_parse(val, &key, &mods);
783 kb->key = key;
784 kb->mods = mods;
785 g_free(val);
786 }
787}
788
789
790static void load_user_kb(void)
791{
792 gchar *configfile = g_build_filename(app->configdir, "keybindings.conf", NULL);
793 GKeyFile *config = g_key_file_new();
794
795 /* backwards compatibility with Geany 0.21 defaults */
796 if (!g_file_test(configfile, G_FILE_TEST_EXISTS))
797 {
798 gchar *geanyconf = g_build_filename(app->configdir, "geany.conf", NULL);
799 const gchar data[] = "[Bindings]\n"
800 "popup_gototagdefinition=\n"
801 "edit_transposeline=<Control>t\n"
802 "edit_movelineup=\n"
803 "edit_movelinedown=\n"
804 "move_tableft=<Alt>Page_Up\n"
805 "move_tabright=<Alt>Page_Down\n";
806
807 utils_write_file(configfile, g_file_test(geanyconf, G_FILE_TEST_EXISTS) ?
808 data : "");
809 g_free(geanyconf);
810 }
811
812 /* now load user defined keys */
813 if (g_key_file_load_from_file(config, configfile, G_KEY_FILE_KEEP_COMMENTS, NULL))
814 {
816 }
817 g_free(configfile);
818 g_key_file_free(config);
819}
820
821
822static void apply_kb_accel(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
823{
824 if (kb->key != 0 && kb->menu_item)
825 {
826 gtk_widget_add_accelerator(kb->menu_item, "activate", kb_accel_group,
827 kb->key, kb->mods, GTK_ACCEL_VISIBLE);
828 }
829}
830
831
832/** Reloads keybinding settings from configuration file.
833 *
834 * Normally plugins do not need to call this function as it is called automatically when a
835 * the plugin is activated. However, plugins which need to create keybindings dynamically
836 * and reload them when needed should call this function after all keybindings have been
837 * updated with plugin_set_key_group() and keybindings_set_item() calls - this makes sure
838 * that the corresponding user keybinding shortcuts are applied.
839 *
840 * @since 1.32 (API 233) */
841GEANY_API_SYMBOL
843{
844 load_user_kb();
846
847 /* set menu accels now, after user keybindings have been read */
849}
850
851
852static void add_menu_accel(GeanyKeyGroup *group, guint kb_id, GtkWidget *menuitem)
853{
855
856 if (kb->key != 0)
857 gtk_widget_add_accelerator(menuitem, "activate", kb_accel_group,
858 kb->key, kb->mods, GTK_ACCEL_VISIBLE);
859}
860
861
862#define GEANY_ADD_POPUP_ACCEL(kb_id, wid) \
863 add_menu_accel(group, kb_id, ui_lookup_widget(main_widgets.editor_menu, G_STRINGIFY(wid)))
864
865/* set the menu item accelerator shortcuts (just for visibility, they are handled anyway) */
866/* FIXME: update those during runtime */
867static void add_popup_menu_accels(void)
868{
870
875
880
883
885 GEANY_ADD_POPUP_ACCEL(GEANY_KEYS_INSERT_DATE, insert_date_custom2);
886 GEANY_ADD_POPUP_ACCEL(GEANY_KEYS_INSERT_ALTWHITESPACE, insert_alternative_white_space2);
887
889 GEANY_ADD_POPUP_ACCEL(GEANY_KEYS_FILE_OPENSELECTED, menu_open_selected_file2);
890
894
897
898 /* Format and Commands share the menu bar submenus */
899 /* Build menu items are set if the build menus are created */
900}
901
902
903static void set_keyfile_kb(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
904{
905 GKeyFile *config = user_data;
906 gchar *val;
907
908 val = gtk_accelerator_name(kb->key, kb->mods);
909 g_key_file_set_string(config, group->name, kb->name, val);
910 g_free(val);
911}
912
913
914/* just write the content of the keys array to the config file */
916{
917 gchar *configfile = g_build_filename(app->configdir, "keybindings.conf", NULL);
918 gchar *data;
919 GKeyFile *config = g_key_file_new();
920
921 g_key_file_load_from_file(config, configfile, 0, NULL);
923
924 /* write the file */
925 data = g_key_file_to_data(config, NULL, NULL);
926 utils_write_file(configfile, data);
927
928 g_free(data);
929 g_free(configfile);
930 g_key_file_free(config);
931}
932
933
935{
937 gsize g;
938
941
942 g_ptr_array_free(keybinding_groups, TRUE);
943}
944
945
947{
948 return utils_str_remove_chars(g_strdup(kb->label), "_");
949}
950
951
952static void fill_shortcut_labels_treeview(GtkWidget *tree)
953{
954 gsize g, i;
955 GeanyKeyBinding *kb;
957 GtkListStore *store;
958 GtkTreeIter iter;
959
960 store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, PANGO_TYPE_WEIGHT);
961
963 {
964 if (g > 0)
965 {
966 gtk_list_store_append(store, &iter);
967 gtk_list_store_set(store, &iter, -1);
968 }
969 gtk_list_store_append(store, &iter);
970 gtk_list_store_set(store, &iter, 0, group->label, 2, PANGO_WEIGHT_BOLD, -1);
971
972 foreach_ptr_array(kb, i, group->key_items)
973 {
974 gchar *shortcut, *label;
975
977 shortcut = gtk_accelerator_get_label(kb->key, kb->mods);
978
979 gtk_list_store_append(store, &iter);
980 gtk_list_store_set(store, &iter, 0, label, 1, shortcut, 2, PANGO_WEIGHT_NORMAL, -1);
981
982 g_free(shortcut);
983 g_free(label);
984 }
985 }
986 gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
987 g_object_unref(store);
988}
989
990
991static GtkWidget *create_dialog(void)
992{
993 GtkWidget *dialog, *tree, *label, *swin, *vbox;
994 GtkCellRenderer *text_renderer;
995 GtkTreeViewColumn *column;
996
997 dialog = gtk_dialog_new_with_buttons(_("Keyboard Shortcuts"), GTK_WINDOW(main_widgets.window),
998 GTK_DIALOG_DESTROY_WITH_PARENT,
999 GTK_STOCK_EDIT, GTK_RESPONSE_APPLY,
1000 GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, NULL);
1001 vbox = ui_dialog_vbox_new(GTK_DIALOG(dialog));
1002 gtk_box_set_spacing(GTK_BOX(vbox), 6);
1003 gtk_widget_set_name(dialog, "GeanyDialog");
1004
1005 gtk_window_set_default_size(GTK_WINDOW(dialog), -1, GEANY_DEFAULT_DIALOG_HEIGHT);
1006
1007 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
1008
1009 label = gtk_label_new(_("The following keyboard shortcuts are configurable:"));
1010 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
1011
1012 tree = gtk_tree_view_new();
1013 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE);
1014 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
1015
1016 text_renderer = gtk_cell_renderer_text_new();
1017 /* we can't use "weight-set", see http://bugzilla.gnome.org/show_bug.cgi?id=355214 */
1018 column = gtk_tree_view_column_new_with_attributes(
1019 NULL, text_renderer, "text", 0, "weight", 2, NULL);
1020 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
1021
1022 text_renderer = gtk_cell_renderer_text_new();
1023 column = gtk_tree_view_column_new_with_attributes(NULL, text_renderer, "text", 1, NULL);
1024 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
1025
1027
1028 swin = gtk_scrolled_window_new(NULL, NULL);
1029 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), GTK_POLICY_NEVER,
1030 GTK_POLICY_AUTOMATIC);
1031 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(swin), GTK_SHADOW_IN);
1032 gtk_container_add(GTK_CONTAINER(swin), tree);
1033
1034 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 6);
1035 gtk_box_pack_start(GTK_BOX(vbox), swin, TRUE, TRUE, 0);
1036
1037 return dialog;
1038}
1039
1040
1041static void key_dialog_show_prefs(void)
1042{
1043 GtkWidget *wid;
1044
1046 /* select the KB page */
1047 wid = ui_lookup_widget(ui_widgets.prefs_dialog, "frame22");
1048 if (wid != NULL)
1049 {
1050 GtkNotebook *nb = GTK_NOTEBOOK(ui_lookup_widget(ui_widgets.prefs_dialog, "notebook2"));
1051 if (nb != NULL)
1052 {
1053 gtk_notebook_set_current_page(nb, gtk_notebook_page_num(nb, wid));
1054 }
1055 }
1056}
1057
1058
1060{
1063}
1064
1065
1066/* non-modal keyboard shortcuts dialog, so user can edit whilst seeing the shortcuts */
1067static GtkWidget *key_dialog = NULL;
1068
1069static void on_dialog_response(GtkWidget *dialog, gint response, gpointer user_data)
1070{
1071 if (response == GTK_RESPONSE_APPLY)
1072 {
1074 }
1075 gtk_widget_destroy(dialog);
1076 key_dialog = NULL;
1077}
1078
1079
1081{
1082 if (key_dialog)
1083 gtk_widget_destroy(key_dialog); /* in case the key_dialog is still visible */
1084
1086 g_signal_connect(key_dialog, "response", G_CALLBACK(on_dialog_response), NULL);
1088}
1089
1090
1091static gboolean check_fixed_kb(guint keyval, guint state)
1092{
1093 /* check alt-0 to alt-9 for setting current notebook page */
1094 if (state == GDK_MOD1_MASK && keyval >= GDK_KEY_0 && keyval <= GDK_KEY_9)
1095 {
1096 gint page = keyval - GDK_KEY_0 - 1;
1097 gint npages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
1098
1099 /* alt-0 is for the rightmost tab */
1100 if (keyval == GDK_KEY_0)
1101 page = npages - 1;
1102 /* invert the order if tabs are added on the other side */
1104 page = (npages - 1) - page;
1105
1106 gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), page);
1107 return TRUE;
1108 }
1109 /* note: these are now overridden by default with move tab bindings */
1110 if (keyval == GDK_KEY_Page_Up || keyval == GDK_KEY_Page_Down)
1111 {
1112 /* switch to first or last document */
1113 if (state == (GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK))
1114 {
1115 if (keyval == GDK_KEY_Page_Up)
1116 gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), 0);
1117 if (keyval == GDK_KEY_Page_Down)
1118 gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), -1);
1119 return TRUE;
1120 }
1121 }
1122 return FALSE;
1123}
1124
1125
1127{
1128 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1129
1130 g_return_val_if_fail(doc, FALSE);
1131
1132 /* keybinding only valid when scintilla widget has focus */
1133 if (focusw == GTK_WIDGET(doc->editor->sci))
1134 {
1135 ScintillaObject *sci = doc->editor->sci;
1137
1139 return editor_complete_snippet(doc->editor, pos);
1140 }
1141 return FALSE;
1142}
1143
1144
1145/* Transforms a GdkEventKey event into a GdkEventButton event */
1146static void trigger_button_event(GtkWidget *widget, guint32 event_time)
1147{
1148 GdkEventButton *event;
1149 gboolean ret;
1150
1151 event = g_new0(GdkEventButton, 1);
1152
1153 if (GTK_IS_TEXT_VIEW(widget))
1154 event->window = gtk_text_view_get_window(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_TEXT);
1155 else
1156 event->window = gtk_widget_get_window(widget);
1157 event->time = event_time;
1158 event->type = GDK_BUTTON_PRESS;
1159 event->button = 3;
1160
1161 g_signal_emit_by_name(widget, "button-press-event", event, &ret);
1162 g_signal_emit_by_name(widget, "button-release-event", event, &ret);
1163
1164 g_free(event);
1165}
1166
1167
1168/* Special case for the Menu key and Shift-F10 to show the right-click popup menu for various
1169 * widgets. Without this special handling, the notebook tab list of the documents' notebook
1170 * would be shown. As a very special case, we differentiate between the Menu key and Shift-F10
1171 * if pressed in the editor widget: the Menu key opens the popup menu, Shift-F10 opens the
1172 * notebook tab list. */
1173static gboolean check_menu_key(GeanyDocument *doc, guint keyval, guint state, guint32 event_time)
1174{
1175 g_return_val_if_fail(doc == NULL || doc->is_valid, FALSE);
1176
1177 if ((keyval == GDK_KEY_Menu && state == 0) || (keyval == GDK_KEY_F10 && state == GDK_SHIFT_MASK))
1178 {
1179 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1180 if (doc != NULL)
1181 {
1182 if (focusw == doc->priv->tag_tree)
1183 {
1184 trigger_button_event(focusw, event_time);
1185 return TRUE;
1186 }
1187 if (focusw == GTK_WIDGET(doc->editor->sci))
1188 {
1189 if (keyval == GDK_KEY_Menu)
1190 { /* show editor popup menu */
1191 trigger_button_event(focusw, event_time);
1192 return TRUE;
1193 }
1194 else
1195 { /* show tab bar menu */
1197 return TRUE;
1198 }
1199 }
1200 }
1201 if (focusw == tv.tree_openfiles
1202 || focusw == msgwindow.tree_status
1203 || focusw == msgwindow.tree_compiler
1204 || focusw == msgwindow.tree_msg
1205 || focusw == msgwindow.scribble
1206#ifdef HAVE_VTE
1207 || (vte_info.have_vte && focusw == vc->vte)
1208#endif
1209 )
1210 {
1211 trigger_button_event(focusw, event_time);
1212 return TRUE;
1213 }
1214 }
1215 return FALSE;
1216}
1217
1218
1219#ifdef HAVE_VTE
1220static gboolean set_sensitive(gpointer widget)
1221{
1222 gtk_widget_set_sensitive(GTK_WIDGET(widget), TRUE);
1223 return FALSE;
1224}
1225
1226
1227static gboolean check_vte(GdkModifierType state, guint keyval)
1228{
1229 guint i;
1230 GeanyKeyBinding *kb;
1232 GtkWidget *widget;
1233
1234 if (gtk_window_get_focus(GTK_WINDOW(main_widgets.window)) != vc->vte)
1235 return FALSE;
1236 /* let VTE copy/paste override any user keybinding */
1237 if (state == (GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK) && (keyval == GDK_KEY_c || keyval == GDK_KEY_v))
1238 return TRUE;
1239 if (! vc->enable_bash_keys)
1240 return FALSE;
1241 /* prevent menubar flickering: */
1242 if (state == GDK_SHIFT_MASK && (keyval >= GDK_KEY_a && keyval <= GDK_KEY_z))
1243 return FALSE;
1244 if (state == 0 && (keyval < GDK_KEY_F1 || keyval > GDK_KEY_F35)) /* e.g. backspace */
1245 return FALSE;
1246
1247 /* make focus commands override any bash commands */
1249 foreach_ptr_array(kb, i, group->key_items)
1250 {
1251 if (state == kb->mods && keyval == kb->key)
1252 return FALSE;
1253 }
1254
1255 /* Temporarily disable the menus to prevent conflicting menu accelerators
1256 * from overriding the VTE bash shortcuts.
1257 * Note: maybe there's a better way of doing this ;-) */
1258 widget = ui_lookup_widget(main_widgets.window, "menubar1");
1259 gtk_widget_set_sensitive(widget, FALSE);
1260 g_idle_add_full(G_PRIORITY_HIGH, set_sensitive, widget, NULL);
1261
1262 widget = main_widgets.editor_menu;
1263 gtk_widget_set_sensitive(widget, FALSE);
1264 g_idle_add(set_sensitive, widget);
1265 return TRUE;
1266}
1267#endif
1268
1269
1270/* Map the keypad keys to their equivalent functions (taken from ScintillaGTK.cxx) */
1271static guint key_kp_translate(guint key_in)
1272{
1273 switch (key_in)
1274 {
1275 case GDK_KEY_KP_Down:
1276 return GDK_KEY_Down;
1277 case GDK_KEY_KP_Up:
1278 return GDK_KEY_Up;
1279 case GDK_KEY_KP_Left:
1280 return GDK_KEY_Left;
1281 case GDK_KEY_KP_Right:
1282 return GDK_KEY_Right;
1283 case GDK_KEY_KP_Home:
1284 return GDK_KEY_Home;
1285 case GDK_KEY_KP_End:
1286 return GDK_KEY_End;
1287 case GDK_KEY_KP_Page_Up:
1288 return GDK_KEY_Page_Up;
1289 case GDK_KEY_KP_Page_Down:
1290 return GDK_KEY_Page_Down;
1291 case GDK_KEY_KP_Delete:
1292 return GDK_KEY_Delete;
1293 case GDK_KEY_KP_Insert:
1294 return GDK_KEY_Insert;
1295 default:
1296 return key_in;
1297 }
1298}
1299
1300
1301/* Check if event keypress matches keybinding combo */
1302gboolean keybindings_check_event(GdkEventKey *ev, GeanyKeyBinding *kb)
1303{
1304 guint state, keyval;
1305
1306 if (ev->keyval == 0)
1307 return FALSE;
1308
1309 keyval = ev->keyval;
1310 state = keybindings_get_modifiers(ev->state);
1311 /* hack to get around that CTRL+Shift+r results in GDK_KEY_R not GDK_KEY_r */
1312 if ((ev->state & GDK_SHIFT_MASK) || (ev->state & GDK_LOCK_MASK))
1313 if (keyval >= GDK_KEY_A && keyval <= GDK_KEY_Z)
1314 keyval += GDK_KEY_a - GDK_KEY_A;
1315
1316 if (keyval >= GDK_KEY_KP_Space && keyval < GDK_KEY_KP_Equal)
1317 keyval = key_kp_translate(keyval);
1318
1319 return (keyval == kb->key && state == kb->mods);
1320}
1321
1322
1324{
1325 gboolean handled = TRUE;
1326 /* call the corresponding handler/callback functions for this shortcut.
1327 * Check the individual keybindings first (handler first, callback second) and
1328 * group second (again handler first, callback second) */
1329 if (kb->cb_func)
1330 handled = kb->cb_func(kb, kb->id, kb->cb_data);
1331 else if (kb->callback)
1332 kb->callback(kb->id);
1333 else if (group->cb_func)
1334 handled = group->cb_func(group, kb->id, group->cb_data);
1335 else if (group->callback)
1336 handled = group->callback(kb->id);
1337 else
1338 {
1339 g_warning("No callback or handler for keybinding %s: %s!", group->name, kb->name);
1340 return FALSE;
1341 }
1342
1343 return handled;
1344}
1345
1346
1347/* central keypress event handler, almost all keypress events go to this function */
1348static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data)
1349{
1350 guint state, keyval;
1351 gsize g, i;
1352 GeanyDocument *doc;
1354 GeanyKeyBinding *kb;
1355 gboolean key_press_ret;
1356
1357 if (ev->keyval == 0)
1358 return FALSE;
1359
1360 g_signal_emit_by_name(geany_object, "key-press", ev, &key_press_ret);
1361 if (key_press_ret)
1362 return TRUE;
1363
1364 doc = document_get_current();
1365 if (doc)
1366 document_check_disk_status(doc, FALSE);
1367
1368 keyval = ev->keyval;
1369 state = keybindings_get_modifiers(ev->state);
1370 /* hack to get around that CTRL+Shift+r results in GDK_KEY_R not GDK_KEY_r */
1371 if ((ev->state & GDK_SHIFT_MASK) || (ev->state & GDK_LOCK_MASK))
1372 if (keyval >= GDK_KEY_A && keyval <= GDK_KEY_Z)
1373 keyval += GDK_KEY_a - GDK_KEY_A;
1374
1375 if (keyval >= GDK_KEY_KP_Space && keyval < GDK_KEY_KP_Equal)
1376 keyval = key_kp_translate(keyval);
1377
1378 /*geany_debug("%d (%d) %d (%d)", keyval, ev->keyval, state, ev->state);*/
1379
1380 /* special cases */
1381#ifdef HAVE_VTE
1382 if (vte_info.have_vte && check_vte(state, keyval))
1383 return FALSE;
1384#endif
1385 if (check_menu_key(doc, keyval, state, ev->time))
1386 return TRUE;
1387
1389 {
1390 foreach_ptr_array(kb, i, group->key_items)
1391 {
1392 if (keyval == kb->key && state == kb->mods)
1393 {
1394 if (run_kb(kb, group))
1395 return TRUE;
1396 }
1397 }
1398 }
1399 /* fixed keybindings can be overridden by user bindings, so check them last */
1400 if (check_fixed_kb(keyval, state))
1401 return TRUE;
1402 return FALSE;
1403}
1404
1405
1406/* group_id must be a core group, e.g. GEANY_KEY_GROUP_EDITOR
1407 * key_id e.g. GEANY_KEYS_EDITOR_CALLTIP */
1408GeanyKeyBinding *keybindings_lookup_item(guint group_id, guint key_id)
1409{
1411
1412 g_return_val_if_fail(group_id < GEANY_KEY_GROUP_COUNT, NULL); /* can't use this for plugin groups */
1413
1415
1416 g_return_val_if_fail(group, NULL);
1417 return keybindings_get_item(group, key_id);
1418}
1419
1420
1421/** Mimics a (built-in only) keybinding action.
1422 * Example: @code keybindings_send_command(GEANY_KEY_GROUP_FILE, GEANY_KEYS_FILE_OPEN); @endcode
1423 * @param group_id @ref GeanyKeyGroupID keybinding group index that contains the @a key_id keybinding.
1424 * @param key_id @ref GeanyKeyBindingID keybinding index. */
1425GEANY_API_SYMBOL
1426void keybindings_send_command(guint group_id, guint key_id)
1427{
1428 GeanyKeyBinding *kb;
1430
1431 kb = keybindings_lookup_item(group_id, key_id);
1433 if (kb && group)
1434 run_kb(kb, group);
1435}
1436
1437
1438/* These are the callback functions, either each group or each shortcut has it's
1439 * own function. */
1440
1441
1442static gboolean cb_func_file_action(guint key_id)
1443{
1444 switch (key_id)
1445 {
1448 break;
1451 break;
1454 break;
1456 {
1457 gchar *utf8_filename = g_queue_peek_head(ui_prefs.recent_queue);
1458 gchar *locale_filename = utils_get_locale_from_utf8(utf8_filename);
1459 document_open_file(locale_filename, FALSE, NULL, NULL);
1460 g_free(locale_filename);
1461 break;
1462 }
1465 break;
1468 break;
1471 break;
1474 break;
1477 break;
1480 break;
1483 break;
1486 break;
1489 break;
1491 main_quit();
1492 break;
1493 }
1494 return TRUE;
1495}
1496
1497
1498static gboolean cb_func_project_action(guint key_id)
1499{
1500 switch (key_id)
1501 {
1504 break;
1507 break;
1509 if (app->project)
1511 break;
1513 if (app->project)
1515 break;
1516 }
1517 return TRUE;
1518}
1519
1520
1521static void cb_func_menu_preferences(guint key_id)
1522{
1523 switch (key_id)
1524 {
1527 break;
1530 break;
1531 }
1532}
1533
1534
1535static void cb_func_menu_help(G_GNUC_UNUSED guint key_id)
1536{
1538}
1539
1540
1541static gboolean cb_func_search_action(guint key_id)
1542{
1544 ScintillaObject *sci;
1545
1546 /* these work without docs */
1547 switch (key_id)
1548 {
1550 on_find_in_files1_activate(NULL, NULL); return TRUE;
1552 on_next_message1_activate(NULL, NULL); return TRUE;
1555 }
1556 if (!doc)
1557 return TRUE;
1558 sci = doc->editor->sci;
1559
1560 switch (key_id)
1561 {
1563 on_find1_activate(NULL, NULL); break;
1579 {
1580 gchar *text = NULL;
1582
1583 /* clear existing search indicators instead if next to cursor */
1584 if (SSM(sci, SCI_INDICATORVALUEAT,
1587 GEANY_INDICATOR_SEARCH, MAX(pos - 1, 0)))
1588 {
1589 text = NULL;
1590 }
1591 else
1592 {
1593 text = get_current_word_or_sel(doc, TRUE);
1594 }
1595
1598 else
1600
1601 g_free(text);
1602 break;
1603 }
1604 }
1605 return TRUE;
1606}
1607
1608
1609static void cb_func_menu_opencolorchooser(G_GNUC_UNUSED guint key_id)
1610{
1612}
1613
1614
1615static gboolean cb_func_view_action(guint key_id)
1616{
1617 switch (key_id)
1618 {
1621 break;
1624 break;
1627 break;
1630 break;
1633 break;
1634 default:
1635 break;
1636 }
1637 return TRUE;
1638}
1639
1640
1641static void cb_func_menu_fullscreen(G_GNUC_UNUSED guint key_id)
1642{
1643 GtkCheckMenuItem *c = GTK_CHECK_MENU_ITEM(
1644 ui_lookup_widget(main_widgets.window, "menu_fullscreen1"));
1645
1646 gtk_check_menu_item_set_active(c, ! gtk_check_menu_item_get_active(c));
1647}
1648
1649
1650static void cb_func_menu_messagewindow(G_GNUC_UNUSED guint key_id)
1651{
1652 GtkCheckMenuItem *c = GTK_CHECK_MENU_ITEM(
1653 ui_lookup_widget(main_widgets.window, "menu_show_messages_window1"));
1654
1655 gtk_check_menu_item_set_active(c, ! gtk_check_menu_item_get_active(c));
1656}
1657
1658
1659static gboolean read_current_word(GeanyDocument *doc, gboolean sci_word)
1660{
1661 g_return_val_if_fail(DOC_VALID(doc), FALSE);
1662
1663 if (sci_word)
1664 {
1666 editor_info.current_word, GEANY_MAX_WORD_LENGTH);
1667 }
1668 else
1669 {
1671 editor_info.current_word, GEANY_MAX_WORD_LENGTH, NULL);
1672 }
1673
1674 return (*editor_info.current_word != 0);
1675}
1676
1677
1678static gboolean check_current_word(GeanyDocument *doc, gboolean sci_word)
1679{
1680 if (! read_current_word(doc, sci_word))
1681 {
1682 utils_beep();
1683 return FALSE;
1684 }
1685 return TRUE;
1686}
1687
1688
1689static gchar *get_current_word_or_sel(GeanyDocument *doc, gboolean sci_word)
1690{
1691 ScintillaObject *sci = doc->editor->sci;
1692
1695
1696 return read_current_word(doc, sci_word) ? g_strdup(editor_info.current_word) : NULL;
1697}
1698
1699
1700static void focus_sidebar(void)
1701{
1702 if (ui_prefs.sidebar_visible)
1703 {
1704 gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(main_widgets.sidebar_notebook));
1705 GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(main_widgets.sidebar_notebook), page_num);
1706
1707 /* gtk_widget_grab_focus() won't work because of the scrolled window containers */
1708 gtk_widget_child_focus(page, GTK_DIR_TAB_FORWARD);
1709 }
1710}
1711
1712
1713static GtkWidget *find_focus_widget(GtkWidget *widget)
1714{
1715 GtkWidget *focus = NULL;
1716
1717 if (GTK_IS_BIN(widget)) /* optimized simple case */
1718 focus = find_focus_widget(gtk_bin_get_child(GTK_BIN(widget)));
1719 else if (GTK_IS_CONTAINER(widget))
1720 {
1721 GList *children = gtk_container_get_children(GTK_CONTAINER(widget));
1722 GList *node;
1723
1724 for (node = children; node && ! focus; node = node->next)
1725 focus = find_focus_widget(node->data);
1726 g_list_free(children);
1727 }
1728
1729 /* Some containers handled above might not have children and be what we want to focus
1730 * (e.g. GtkTreeView), so focus that if possible and we don't have anything better */
1731 if (! focus && gtk_widget_get_can_focus(widget))
1732 focus = widget;
1733
1734 return focus;
1735}
1736
1737
1738static void focus_msgwindow(void)
1739{
1740 if (ui_prefs.msgwindow_visible)
1741 {
1742 gint page_num = gtk_notebook_get_current_page(GTK_NOTEBOOK(msgwindow.notebook));
1743 GtkWidget *widget = gtk_notebook_get_nth_page(GTK_NOTEBOOK(msgwindow.notebook), page_num);
1744
1745 widget = find_focus_widget(widget);
1746 if (widget)
1747 gtk_widget_grab_focus(widget);
1748 else
1749 utils_beep();
1750 }
1751}
1752
1753
1754static gboolean cb_func_switch_action(guint key_id)
1755{
1756 switch (key_id)
1757 {
1759 {
1761 if (doc != NULL)
1762 {
1763 GtkWidget *sci = GTK_WIDGET(doc->editor->sci);
1764 if (gtk_widget_has_focus(sci))
1765 ui_update_statusbar(doc, -1);
1766 else
1767 gtk_widget_grab_focus(sci);
1768 }
1769 break;
1770 }
1773 break;
1776 {
1777 GtkWidget *search_entry = toolbar_get_widget_child_by_name("SearchEntry");
1778 if (search_entry != NULL)
1779 gtk_widget_grab_focus(search_entry);
1780 }
1781 break;
1783 focus_sidebar();
1784 break;
1787 break;
1790 break;
1793 break;
1796 break;
1799 break;
1802 break;
1803 }
1804 return TRUE;
1805}
1806
1807
1808static void switch_notebook_page(gint direction)
1809{
1810 gint page_count, cur_page, pass;
1811 gboolean parent_is_notebook = FALSE;
1812 GtkNotebook *notebook;
1813 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1814
1815 /* check whether the current widget is a GtkNotebook or a child of a GtkNotebook */
1816 do
1817 {
1818 parent_is_notebook = GTK_IS_NOTEBOOK(focusw);
1819 }
1820 while (! parent_is_notebook && (focusw = gtk_widget_get_parent(focusw)) != NULL);
1821
1822 /* if we found a GtkNotebook widget, use it. Otherwise fallback to the documents notebook */
1823 if (parent_is_notebook)
1824 notebook = GTK_NOTEBOOK(focusw);
1825 else
1826 notebook = GTK_NOTEBOOK(main_widgets.notebook);
1827
1828 /* now switch pages */
1829 page_count = gtk_notebook_get_n_pages(notebook);
1830 cur_page = gtk_notebook_get_current_page(notebook);
1831
1832 /* find the next visible page in the wanted direction, but don't loop
1833 * indefinitely if no pages are visible */
1834 for (pass = 0; pass < page_count; pass++)
1835 {
1836 GtkWidget *child;
1837
1838 if (direction == GTK_DIR_LEFT)
1839 {
1840 if (cur_page > 0)
1841 cur_page--;
1842 else
1843 cur_page = page_count - 1;
1844 }
1845 else if (direction == GTK_DIR_RIGHT)
1846 {
1847 if (cur_page < page_count - 1)
1848 cur_page++;
1849 else
1850 cur_page = 0;
1851 }
1852
1853 child = gtk_notebook_get_nth_page (notebook, cur_page);
1854 if (gtk_widget_get_visible (child))
1855 {
1856 gtk_notebook_set_current_page(notebook, cur_page);
1857 break;
1858 }
1859 }
1860}
1861
1862
1863static void cb_func_switch_tableft(G_GNUC_UNUSED guint key_id)
1864{
1865 switch_notebook_page(GTK_DIR_LEFT);
1866}
1867
1868
1869static void cb_func_switch_tabright(G_GNUC_UNUSED guint key_id)
1870{
1871 switch_notebook_page(GTK_DIR_RIGHT);
1872}
1873
1874
1875static void cb_func_switch_tablastused(G_GNUC_UNUSED guint key_id)
1876{
1878}
1879
1880
1881/* move document left/right/first/last */
1882static void cb_func_move_tab(guint key_id)
1883{
1884 GtkWidget *child;
1885 GtkNotebook *nb = GTK_NOTEBOOK(main_widgets.notebook);
1886 gint cur_page = gtk_notebook_get_current_page(nb);
1887
1888 if (cur_page < 0)
1889 return;
1890
1891 child = gtk_notebook_get_nth_page(nb, cur_page);
1892
1893 switch (key_id)
1894 {
1896 gtk_notebook_reorder_child(nb, child, cur_page - 1); /* notebook wraps around by default */
1897 break;
1899 {
1900 gint npage = cur_page + 1;
1901
1902 if (npage == gtk_notebook_get_n_pages(nb))
1903 npage = 0; /* wraparound */
1904 gtk_notebook_reorder_child(nb, child, npage);
1905 break;
1906 }
1908 gtk_notebook_reorder_child(nb, child, (file_prefs.tab_order_ltr) ? 0 : -1);
1909 break;
1911 gtk_notebook_reorder_child(nb, child, (file_prefs.tab_order_ltr) ? -1 : 0);
1912 break;
1913 }
1914 return;
1915}
1916
1917
1919{
1920 gint pos, new_pos;
1921 gint after_brace;
1922
1923 g_return_if_fail(DOC_VALID(doc));
1924
1926 after_brace = pos > 0 && utils_isbrace(sci_get_char_at(doc->editor->sci, pos - 1), TRUE);
1927 pos -= after_brace; /* set pos to the brace */
1928
1929 new_pos = sci_find_matching_brace(doc->editor->sci, pos);
1930 if (new_pos != -1)
1931 { /* set the cursor at/after the brace */
1932 sci_set_current_position(doc->editor->sci, new_pos + (!after_brace), FALSE);
1934 }
1935}
1936
1937
1938static gboolean cb_func_clipboard_action(guint key_id)
1939{
1940 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
1941
1942 switch (key_id)
1943 {
1946 break;
1949 break;
1952 break;
1954 if (IS_SCINTILLA(focusw))
1955 sci_send_command(SCINTILLA(focusw), SCI_LINECOPY);
1956 break;
1958 if (IS_SCINTILLA(focusw))
1959 sci_send_command(SCINTILLA(focusw), SCI_LINECUT);
1960 break;
1961 }
1962 return TRUE;
1963}
1964
1965
1966static void goto_tag(GeanyDocument *doc, gboolean definition)
1967{
1968 gchar *text = get_current_word_or_sel(doc, FALSE);
1969
1970 if (text)
1971 symbols_goto_tag(text, definition);
1972 else
1973 utils_beep();
1974
1975 g_free(text);
1976}
1977
1978
1979/* Common function for goto keybindings, useful even when sci doesn't have focus. */
1980static gboolean cb_func_goto_action(guint key_id)
1981{
1982 gint cur_line;
1984
1985 if (doc == NULL)
1986 return TRUE;
1987
1988 cur_line = sci_get_current_line(doc->editor->sci);
1989
1990 switch (key_id)
1991 {
1994 return TRUE;
1997 return TRUE;
1999 {
2001 {
2002 GtkWidget *wid = toolbar_get_widget_child_by_name("GotoEntry");
2003
2004 /* use toolbar item if shown & not in the drop down overflow menu */
2005 if (wid && gtk_widget_get_mapped(wid))
2006 {
2007 gtk_widget_grab_focus(wid);
2008 return TRUE;
2009 }
2010 }
2012 return TRUE;
2013 }
2016 return TRUE;
2018 {
2019 sci_toggle_marker_at_line(doc->editor->sci, cur_line, 1);
2020 return TRUE;
2021 }
2023 {
2024 gint mline = sci_marker_next(doc->editor->sci, cur_line + 1, 1 << 1, TRUE);
2025
2026 if (mline != -1)
2027 {
2028 sci_set_current_line(doc->editor->sci, mline);
2030 }
2031 return TRUE;
2032 }
2034 {
2035 gint mline = sci_marker_previous(doc->editor->sci, cur_line - 1, 1 << 1, TRUE);
2036
2037 if (mline != -1)
2038 {
2039 sci_set_current_line(doc->editor->sci, mline);
2041 }
2042 return TRUE;
2043 }
2045 goto_tag(doc, TRUE);
2046 return TRUE;
2048 goto_tag(doc, FALSE);
2049 return TRUE;
2050 }
2051 /* only check editor-sensitive keybindings when editor has focus so home,end still
2052 * work in other widgets */
2053 if (gtk_window_get_focus(GTK_WINDOW(main_widgets.window)) != GTK_WIDGET(doc->editor->sci))
2054 return FALSE;
2055
2056 switch (key_id)
2057 {
2060 break;
2063 break;
2066 break;
2069 break;
2072 break;
2075 break;
2076 }
2077 return TRUE;
2078}
2079
2080
2081static void duplicate_lines(GeanyEditor *editor)
2082{
2083 if (sci_get_lines_selected(editor->sci) > 1)
2084 { /* ignore extra_line because of selecting lines from the line number column */
2085 editor_select_lines(editor, FALSE);
2087 }
2088 else if (sci_has_selection(editor->sci))
2090 else
2091 sci_line_duplicate(editor->sci);
2092}
2093
2094
2095static void delete_lines(GeanyEditor *editor)
2096{
2097 editor_select_lines(editor, TRUE); /* include last line (like cut lines, copy lines do) */
2098 sci_clear(editor->sci); /* (SCI_LINEDELETE only does 1 line) */
2099}
2100
2101
2102/* common function for editor keybindings, only valid when scintilla has focus. */
2103static gboolean cb_func_editor_action(guint key_id)
2104{
2106 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
2107
2108 /* edit keybindings only valid when scintilla widget has focus */
2109 if (doc == NULL || focusw != GTK_WIDGET(doc->editor->sci))
2110 return FALSE; /* also makes tab work outside editor */
2111
2112 switch (key_id)
2113 {
2116 break;
2119 break;
2121 editor_scroll_to_line(doc->editor, -1, 0.5F);
2122 break;
2125 break;
2128 break;
2130 duplicate_lines(doc->editor);
2131 break;
2133 /* allow overloading */
2136 delete_lines(doc->editor);
2137 break;
2140 break;
2143 break;
2146 break;
2149 break;
2151 editor_show_calltip(doc->editor, -1);
2152 break;
2154 if (check_current_word(doc, FALSE))
2156 "context_action1")), NULL);
2157 break;
2159 /* allow tab to be overloaded */
2160 return check_snippet_completion(doc);
2161
2163 {
2166
2167 switch (kb->key)
2168 {
2169 case GDK_KEY_space:
2170 sci_add_text(doc->editor->sci, " ");
2171 break;
2172 case GDK_KEY_Tab:
2174 break;
2175 default:
2176 break;
2177 }
2178 break;
2179 }
2181 return editor_complete_word_part(doc->editor);
2182
2185 break;
2188 break;
2189 }
2190 return TRUE;
2191}
2192
2193
2194static void join_lines(GeanyEditor *editor)
2195{
2196 gint start, end, i;
2197
2198 start = sci_get_line_from_position(editor->sci,
2199 sci_get_selection_start(editor->sci));
2200 end = sci_get_line_from_position(editor->sci,
2201 sci_get_selection_end(editor->sci));
2202
2203 /* remove spaces surrounding the lines so that these spaces
2204 * won't appear within text after joining */
2205 for (i = start; i < end; i++)
2207 for (i = start + 1; i <= end; i++)
2208 sci_set_line_indentation(editor->sci, i, 0);
2209
2210 sci_set_target_start(editor->sci,
2211 sci_get_position_from_line(editor->sci, start));
2212 sci_set_target_end(editor->sci,
2213 sci_get_position_from_line(editor->sci, end));
2214 sci_lines_join(editor->sci);
2215}
2216
2217
2218static gint get_reflow_column(GeanyEditor *editor)
2219{
2220 const GeanyEditorPrefs *eprefs = editor_get_prefs(editor);
2221 if (editor->line_breaking)
2222 return eprefs->line_break_column;
2223 else if (eprefs->long_line_type != 2)
2224 return eprefs->long_line_column;
2225 else
2226 return -1; /* do nothing */
2227}
2228
2229
2230/* Split the line where the cursor is positioned, on `column`,
2231 possibly many times if the line is long.
2232 Return the number of lines added because of the splitting. */
2233static gint split_line(GeanyEditor *editor, gint column)
2234{
2235 ScintillaObject *sci = editor->sci;
2236 gint start_line = sci_get_current_line(sci);
2237 gint line = start_line;
2238
2239 while (TRUE)
2240 {
2241 gint lstart = sci_get_position_from_line(sci, line);
2242 gint lend = sci_get_line_end_position(sci, line);
2243 gint edge = sci_get_position_from_col(sci, line, column);
2244 gboolean found;
2245 gint pos;
2246
2247 /* don't split on a trailing space of a line */
2248 if (sci_get_char_at(sci, lend - 1) == ' ')
2249 lend--;
2250
2251 /* detect when the line is short enough and no more splitting is needed */
2252 if (sci_get_col_from_position(sci, lend) < column)
2253 break;
2254
2255 /* lookup split position */
2256 found = FALSE;
2257 for (pos = edge - 1; pos > lstart; pos--)
2258 {
2259 if (sci_get_char_at(sci, pos) == ' ')
2260 {
2261 found = TRUE;
2262 break;
2263 }
2264 }
2265 if (!found)
2266 {
2267 for (pos = edge; pos < lend; pos++)
2268 {
2269 if (sci_get_char_at(sci, pos) == ' ')
2270 {
2271 found = TRUE;
2272 break;
2273 }
2274 }
2275 }
2276 /* don't split right before a space */
2277 while (pos + 1 <= lend && sci_get_char_at(sci, pos + 1) == ' ')
2278 pos++;
2279
2280 if (!found || pos >= lend)
2281 break;
2282
2284 line++;
2285 }
2286 return line - start_line;
2287}
2288
2289
2290static void reflow_lines(GeanyEditor *editor, gint column)
2291{
2292 gint start, indent, linescount, i;
2293
2294 start = sci_get_line_from_position(editor->sci,
2295 sci_get_selection_start(editor->sci));
2296
2297 /* if several lines are selected, join them. */
2298 if (sci_get_lines_selected(editor->sci) > 1)
2299 join_lines(editor);
2300
2301 /* if this line is short enough, do nothing */
2302 if (column > sci_get_line_end_position(editor->sci, start) -
2303 sci_get_position_from_line(editor->sci, start))
2304 {
2305 return;
2306 }
2307
2308 /*
2309 * We have to manipulate line indentation so that indentation
2310 * of the resulting lines would be consistent. For example,
2311 * the result of splitting "[TAB]very long content":
2312 *
2313 * +-------------+-------------+
2314 * | proper | wrong |
2315 * +-------------+-------------+
2316 * | [TAB]very | [TAB]very |
2317 * | [TAB]long | long |
2318 * | [TAB]content| content |
2319 * +-------------+-------------+
2320 */
2321 indent = sci_get_line_indentation(editor->sci, start);
2322 sci_set_line_indentation(editor->sci, start, 0);
2323
2324 linescount = split_line(editor, column - indent);
2325
2326 /* Fix indentation. */
2327 for (i = start; i <= start + linescount; i++)
2328 sci_set_line_indentation(editor->sci, i, indent);
2329
2330 /* Remove trailing spaces. */
2332 {
2333 for (i = start; i <= start + linescount; i++)
2335 }
2336}
2337
2338
2339/* deselect last newline of selection, if any */
2340static void sci_deselect_last_newline(ScintillaObject *sci)
2341{
2342 gint start, end;
2343
2346 if (end > start && sci_get_col_from_position(sci, end) == 0)
2347 {
2349 sci_set_selection(sci, start, end);
2350 }
2351}
2352
2353
2354static void reflow_paragraph(GeanyEditor *editor)
2355{
2356 ScintillaObject *sci = editor->sci;
2357 gboolean sel;
2358 gint column;
2359
2360 column = get_reflow_column(editor);
2361 if (column == -1)
2362 {
2363 utils_beep();
2364 return;
2365 }
2366
2368 sel = sci_has_selection(sci);
2369 if (!sel)
2372 reflow_lines(editor, column);
2373 if (!sel)
2374 sci_set_anchor(sci, -1);
2376
2378}
2379
2380
2381static void join_paragraph(GeanyEditor *editor)
2382{
2383 ScintillaObject *sci = editor->sci;
2384 gboolean sel;
2385 gint column;
2386
2387 column = get_reflow_column(editor);
2388 if (column == -1)
2389 {
2390 utils_beep();
2391 return;
2392 }
2393
2395 sel = sci_has_selection(sci);
2396 if (!sel)
2399 join_lines(editor);
2400 if (!sel)
2401 sci_set_anchor(sci, -1);
2402
2404}
2405
2406
2407/* common function for format keybindings, only valid when scintilla has focus. */
2408static gboolean cb_func_format_action(guint key_id)
2409{
2411 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
2412
2413 /* keybindings only valid when scintilla widget has focus */
2414 if (doc == NULL || focusw != GTK_WIDGET(doc->editor->sci))
2415 return TRUE;
2416
2417 switch (key_id)
2418 {
2421 break;
2424 break;
2427 break;
2430 break;
2433 break;
2435 editor_indentation_by_one_space(doc->editor, -1, FALSE);
2436 break;
2439 break;
2442 break;
2445 break;
2447 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 0)
2448 tools_execute_custom_command(doc, ui_prefs.custom_commands[0]);
2449 break;
2451 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 1)
2452 tools_execute_custom_command(doc, ui_prefs.custom_commands[1]);
2453 break;
2455 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 2)
2456 tools_execute_custom_command(doc, ui_prefs.custom_commands[2]);
2457 break;
2459 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 3)
2460 tools_execute_custom_command(doc, ui_prefs.custom_commands[3]);
2461 break;
2463 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 4)
2464 tools_execute_custom_command(doc, ui_prefs.custom_commands[4]);
2465 break;
2467 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 5)
2468 tools_execute_custom_command(doc, ui_prefs.custom_commands[5]);
2469 break;
2471 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 6)
2472 tools_execute_custom_command(doc, ui_prefs.custom_commands[6]);
2473 break;
2475 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 7)
2476 tools_execute_custom_command(doc, ui_prefs.custom_commands[7]);
2477 break;
2479 if (ui_prefs.custom_commands && g_strv_length(ui_prefs.custom_commands) > 8)
2480 tools_execute_custom_command(doc, ui_prefs.custom_commands[8]);
2481 break;
2484 break;
2487 break;
2489 join_paragraph(doc->editor);
2490 break;
2491 }
2492 return TRUE;
2493}
2494
2495
2496/* common function for select keybindings, valid for scintilla and/or gtk_editable objects. */
2497static gboolean cb_func_select_action(guint key_id)
2498{
2500 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
2501
2502 switch (key_id)
2503 {
2506 break;
2508 if (doc != NULL)
2510 break;
2512 if (doc != NULL)
2513 editor_select_lines(doc->editor, FALSE);
2514 break;
2516 if (doc != NULL)
2518 break;
2520 if (IS_SCINTILLA(focusw))
2521 sci_send_command(SCINTILLA(focusw), SCI_WORDPARTLEFTEXTEND);
2522 break;
2524 if (IS_SCINTILLA(focusw))
2525 sci_send_command(SCINTILLA(focusw), SCI_WORDPARTRIGHTEXTEND);
2526 break;
2527 }
2528 return TRUE;
2529}
2530
2531
2532static gboolean cb_func_document_action(guint key_id)
2533{
2535
2536 if (doc == NULL)
2537 return TRUE;
2538
2539 switch (key_id)
2540 {
2543 break;
2546 break;
2550 break;
2554 break;
2556 document_clone(doc);
2557 break;
2560 break;
2562 editor_fold_all(doc->editor);
2563 break;
2566 break;
2569 {
2570 gint line = sci_get_current_line(doc->editor->sci);
2571 editor_toggle_fold(doc->editor, line, 0);
2572 }
2573 break;
2576 break;
2579 break;
2583 break;
2586 break;
2587 }
2588 return TRUE;
2589}
2590
2591
2592static void insert_line_after(GeanyEditor *editor)
2593{
2594 ScintillaObject *sci = editor->sci;
2595
2598}
2599
2600
2602{
2603 ScintillaObject *sci = editor->sci;
2605 gint indentpos = sci_get_line_indent_position(sci, line);
2606
2607 sci_set_current_position(sci, indentpos, TRUE);
2610}
2611
2612
2613/* common function for insert keybindings, only valid when scintilla has focus. */
2614static gboolean cb_func_insert_action(guint key_id)
2615{
2617 GtkWidget *focusw = gtk_window_get_focus(GTK_WINDOW(main_widgets.window));
2618
2619 /* keybindings only valid when scintilla widget has focus */
2620 if (doc == NULL || focusw != GTK_WIDGET(doc->editor->sci))
2621 return TRUE;
2622
2623 switch (key_id)
2624 {
2627 break;
2629 gtk_menu_item_activate(GTK_MENU_ITEM(
2630 ui_lookup_widget(main_widgets.window, "insert_date_custom1")));
2631 break;
2634 break;
2637 break;
2638 }
2639 return TRUE;
2640}
2641
2642
2643/* update key combination */
2644void keybindings_update_combo(GeanyKeyBinding *kb, guint key, GdkModifierType mods)
2645{
2646 GtkWidget *widget = kb->menu_item;
2647
2648 if (widget && kb->key)
2649 gtk_widget_remove_accelerator(widget, kb_accel_group, kb->key, kb->mods);
2650
2651 kb->key = key;
2652 kb->mods = mods;
2653
2654 if (widget && kb->key)
2655 gtk_widget_add_accelerator(widget, "activate", kb_accel_group,
2656 kb->key, kb->mods, GTK_ACCEL_VISIBLE);
2657}
2658
2659
2660/* used for plugins, can be called repeatedly. */
2662 const gchar *label, gsize count, GeanyKeyGroupCallback callback)
2663{
2664 g_return_val_if_fail(section_name, NULL);
2665 g_return_val_if_fail(count, NULL);
2666
2667 /* prevent conflict with core bindings */
2668 g_return_val_if_fail(!g_str_equal(section_name, keybindings_keyfile_group_name), NULL);
2669
2670 if (!group)
2671 {
2672 group = g_new0(GeanyKeyGroup, 1);
2673 add_kb_group(group, section_name, label, callback, TRUE);
2674 }
2675 /* Calls free_key_binding() for individual entries for plugins - has to be
2676 * called before g_free(group->plugin_keys) */
2677 g_ptr_array_set_size(group->key_items, 0);
2678 g_free(group->plugin_keys);
2679 group->plugin_keys = g_new0(GeanyKeyBinding, count);
2680 group->plugin_key_count = count;
2681 return group;
2682}
2683
2684
2686{
2687 g_ptr_array_remove_fast(keybinding_groups, group);
2688}
#define SCI_WORDPARTLEFTEXTEND
Definition: Scintilla.h:748
#define SCI_DELLINELEFT
Definition: Scintilla.h:754
#define SCI_NEWLINE
Definition: Scintilla.h:653
#define SCI_LINEUP
Definition: Scintilla.h:626
#define SCI_WORDPARTRIGHTEXTEND
Definition: Scintilla.h:750
#define SCI_LINETRANSPOSE
Definition: Scintilla.h:664
#define SCI_VCHOMEDISPLAY
Definition: Scintilla.h:1000
#define SCI_VCHOME
Definition: Scintilla.h:655
#define SCI_HOMEDISPLAY
Definition: Scintilla.h:672
#define SCI_LINECUT
Definition: Scintilla.h:662
#define SCI_LINECOPY
Definition: Scintilla.h:682
#define SCI_DELLINERIGHT
Definition: Scintilla.h:755
#define SCI_LINESCROLLUP
Definition: Scintilla.h:670
#define SCI_LINEENDDISPLAY
Definition: Scintilla.h:674
#define SCI_TAB
Definition: Scintilla.h:651
#define SCI_LINESCROLLDOWN
Definition: Scintilla.h:669
#define SCI_HOME
Definition: Scintilla.h:636
#define SCI_WORDPARTRIGHT
Definition: Scintilla.h:749
#define SCI_INDICATORVALUEAT
Definition: Scintilla.h:864
#define SCI_LINEEND
Definition: Scintilla.h:638
#define SCI_WORDPARTLEFT
Definition: Scintilla.h:747
Contains the GeanyApp.
static const gchar * groups[GEANY_GBG_COUNT]
Definition: build.c:2287
const gchar * label
Definition: build.c:2676
gboolean build_keybinding(guint key_id)
Definition: build.c:2773
Interface to the Build menu functionality.
void on_find_next1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:874
void on_context_action1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1490
void on_menu_toggle_all_additional_widgets1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1547
void on_plugin_preferences1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1900
void on_find_nextsel1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:890
void on_replace1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:902
void on_find_prevsel1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:896
void on_replace_spaces_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1702
void on_line_wrapping1_toggled(GtkCheckMenuItem *checkmenuitem, gpointer user_data)
Definition: callbacks.c:735
void on_save_all1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:125
void on_help1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:987
void on_menu_increase_indent1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1331
void on_menu_show_sidebar1_toggled(GtkCheckMenuItem *checkmenuitem, gpointer user_data)
Definition: callbacks.c:1255
void on_project_close1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1377
void on_menu_uncomment_line1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1313
void on_next_message1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1349
void on_reload_all(GtkAction *action, gpointer user_data)
Definition: callbacks.c:339
void on_find_usage1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:806
void on_menu_select_all1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1228
void on_paste1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:273
void on_file_properties_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1177
void on_project_open1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1371
void on_project_new1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1365
void on_zoom_in1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:449
void on_go_to_line_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:929
void on_menu_open_selected_file1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1407
void on_find_document_usage1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:800
void on_show_color_chooser1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:848
void on_toggle_case1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:597
void on_save1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:108
void on_find_in_files1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:908
void on_previous_message1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1357
void on_undo1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:211
void on_close_all1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:153
void on_line_breaking1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1688
void on_copy1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:256
void on_open1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:322
void on_cut1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:239
void on_send_selection_to_vte1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1762
void on_find_previous1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:880
void on_zoom_out1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:460
void on_preferences1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:308
void on_normal_size1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:470
void on_redo1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:225
void on_find1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:868
void on_menu_toggle_line_commentation1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1322
void on_menu_decrease_indent1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1340
void on_save_as1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:119
void on_remove_markers1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1473
void on_menu_comment_line1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1304
void on_menu_remove_indicators1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1210
void on_toolbutton_reload_clicked(GtkAction *action, gpointer user_data)
Definition: callbacks.c:329
void on_print1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1219
void on_close1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:159
void on_project_properties1_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:1383
void on_replace_tabs_activate(GtkMenuItem *menuitem, gpointer user_data)
Definition: callbacks.c:576
GeanyDocument * document_get_current(void)
Finds the current document.
Definition: document.c:371
void document_update_tags(GeanyDocument *doc)
Definition: document.c:2647
GeanyDocument * document_clone(GeanyDocument *old_doc)
Definition: document.c:3323
gboolean document_check_disk_status(GeanyDocument *doc, gboolean force)
Definition: document.c:3674
const gchar * name
Definition: document.c:3219
GeanyFilePrefs file_prefs
Definition: document.c:86
GeanyDocument * document_open_file(const gchar *locale_filename, gboolean readonly, GeanyFiletype *ft, const gchar *forced_enc)
Opens a document specified by locale_filename.
Definition: document.c:908
GeanyDocument * document_new_file(const gchar *utf8_filename, GeanyFiletype *ft, const gchar *text)
Creates a new document.
Definition: document.c:824
#define DOC_VALID(doc_ptr)
Null-safe way to check GeanyDocument::is_valid.
Definition: document.h:162
gboolean editor_complete_word_part(GeanyEditor *editor)
Definition: editor.c:5050
gboolean editor_show_calltip(GeanyEditor *editor, gint pos)
Definition: editor.c:1994
void editor_select_indent_block(GeanyEditor *editor)
Definition: editor.c:3887
void editor_unfold_all(GeanyEditor *editor)
Definition: editor.c:4384
EditorInfo editor_info
Definition: editor.c:79
gboolean editor_start_auto_complete(GeanyEditor *editor, gint pos, gboolean force)
Definition: editor.c:2221
void editor_select_word(GeanyEditor *editor)
Definition: editor.c:3724
void editor_find_current_word_sciwc(GeanyEditor *editor, gint pos, gchar *word, gsize wordlen)
Definition: editor.c:1749
const GeanyEditorPrefs * editor_get_prefs(GeanyEditor *editor)
Definition: editor.c:424
void editor_scroll_to_line(GeanyEditor *editor, gint line, gfloat percent_of_view)
Definition: editor.c:3674
void editor_select_paragraph(GeanyEditor *editor)
Definition: editor.c:3824
static gchar indent[100]
Definition: editor.c:91
void editor_toggle_fold(GeanyEditor *editor, gint line, gint modifiers)
Definition: editor.c:441
void editor_select_lines(GeanyEditor *editor, gboolean extra_line)
Definition: editor.c:3752
void editor_strip_line_trailing_spaces(GeanyEditor *editor, gint line)
Definition: editor.c:4522
gchar * text
Definition: editor.c:83
void editor_display_current_line(GeanyEditor *editor, gfloat percent_of_view)
Definition: editor.c:4108
void editor_strip_trailing_spaces(GeanyEditor *editor, gboolean ignore_selection)
Definition: editor.c:4547
gboolean editor_goto_next_snippet_cursor(GeanyEditor *editor)
Definition: editor.c:2557
ScintillaObject * sci
Definition: editor.c:88
void editor_find_current_word(GeanyEditor *editor, gint pos, gchar *word, gsize wordlen, const gchar *wc)
Definition: editor.c:1740
void editor_indentation_by_one_space(GeanyEditor *editor, gint pos, gboolean decrease)
Definition: editor.c:3980
const gchar * editor_get_eol_char(GeanyEditor *editor)
Retrieves the used end of line characters (LF, CR/LF, CR) in the given editor.
Definition: editor.c:4349
void editor_smart_line_indentation(GeanyEditor *editor)
Definition: editor.c:3938
gboolean editor_complete_snippet(GeanyEditor *editor, gint pos)
Definition: editor.c:2655
gint pos
Definition: editor.c:87
GeanyEditorPrefs editor_prefs
Definition: editor.c:77
void editor_fold_all(GeanyEditor *editor)
Definition: editor.c:4390
void editor_insert_alternative_whitespace(GeanyEditor *editor)
Definition: editor.c:3701
#define GEANY_MAX_WORD_LENGTH
Definition: editor.h:41
@ GEANY_INDICATOR_SEARCH
Indicator used to highlight search results in the document.
Definition: editor.h:72
Filetype detection, file extensions and filetype menu items.
#define GEANY_DEFAULT_DIALOG_HEIGHT
Definition: geany.h:50
vString * line
Definition: geany_cobol.c:133
unsigned int count
GObject * geany_object
Definition: geanyobject.c:41
static void apply_kb_accel(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
Definition: keybindings.c:822
static void add_menu_accel(GeanyKeyGroup *group, guint kb_id, GtkWidget *menuitem)
Definition: keybindings.c:852
static gboolean run_kb(GeanyKeyBinding *kb, GeanyKeyGroup *group)
Definition: keybindings.c:1323
static void delete_lines(GeanyEditor *editor)
Definition: keybindings.c:2095
static gboolean cb_func_insert_action(guint key_id)
Definition: keybindings.c:2614
static void trigger_button_event(GtkWidget *widget, guint32 event_time)
Definition: keybindings.c:1146
static gboolean on_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
Definition: keybindings.c:1348
static gint get_reflow_column(GeanyEditor *editor)
Definition: keybindings.c:2218
static void insert_line_after(GeanyEditor *editor)
Definition: keybindings.c:2592
static GtkAccelGroup * kb_accel_group
Definition: keybindings.c:70
void keybindings_update_combo(GeanyKeyBinding *kb, guint key, GdkModifierType mods)
Definition: keybindings.c:2644
static void sci_deselect_last_newline(ScintillaObject *sci)
Definition: keybindings.c:2340
static void switch_notebook_page(gint direction)
Definition: keybindings.c:1808
GeanyKeyBinding * keybindings_lookup_item(guint group_id, guint key_id)
Definition: keybindings.c:1408
static void focus_sidebar(void)
Definition: keybindings.c:1700
static void load_kb(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
Definition: keybindings.c:772
static void focus_msgwindow(void)
Definition: keybindings.c:1738
static gboolean cb_func_search_action(guint key_id)
Definition: keybindings.c:1541
static void free_key_binding(gpointer item)
Definition: keybindings.c:249
#define GEANY_ADD_POPUP_ACCEL(kb_id, wid)
Definition: keybindings.c:862
static void key_dialog_show_prefs(void)
Definition: keybindings.c:1041
static void insert_line_before(GeanyEditor *editor)
Definition: keybindings.c:2601
static gboolean check_fixed_kb(guint keyval, guint state)
Definition: keybindings.c:1091
static gboolean cb_func_editor_action(guint key_id)
Definition: keybindings.c:2103
static void keybindings_foreach(KBItemCallback cb, gpointer user_data)
Definition: keybindings.c:758
static gboolean check_menu_key(GeanyDocument *doc, guint keyval, guint state, guint32 event_time)
Definition: keybindings.c:1173
static gboolean cb_func_view_action(guint key_id)
Definition: keybindings.c:1615
static GtkWidget * find_focus_widget(GtkWidget *widget)
Definition: keybindings.c:1713
static void cb_func_menu_opencolorchooser(guint key_id)
static guint key_kp_translate(guint key_in)
Definition: keybindings.c:1271
GPtrArray * keybinding_groups
Definition: keybindings.c:62
static gint split_line(GeanyEditor *editor, gint column)
Definition: keybindings.c:2233
static void cb_func_menu_fullscreen(guint key_id)
static void add_popup_menu_accels(void)
Definition: keybindings.c:867
void keybindings_free_group(GeanyKeyGroup *group)
Definition: keybindings.c:2685
static void cb_func_menu_help(guint key_id)
static gboolean cb_func_format_action(guint key_id)
Definition: keybindings.c:2408
static gboolean cb_func_project_action(guint key_id)
Definition: keybindings.c:1498
static void on_dialog_response(GtkWidget *dialog, gint response, gpointer user_data)
Definition: keybindings.c:1069
static void cb_func_switch_tableft(guint key_id)
static const gchar keybindings_keyfile_group_name[]
Definition: keybindings.c:65
GeanyKeyGroup * keybindings_get_core_group(guint id)
Definition: keybindings.c:278
static gboolean cb_func_goto_action(guint key_id)
Definition: keybindings.c:1980
static gboolean check_current_word(GeanyDocument *doc, gboolean sci_word)
Definition: keybindings.c:1678
static void cb_func_move_tab(guint key_id)
Definition: keybindings.c:1882
#define ADD_KB_GROUP(group_id, label, callback)
Definition: keybindings.c:300
static gboolean cb_func_document_action(guint key_id)
Definition: keybindings.c:2532
static gboolean cb_func_switch_action(guint key_id)
Definition: keybindings.c:1754
static void init_default_kb(void)
Definition: keybindings.c:304
void keybindings_load_keyfile(void)
Reloads keybinding settings from configuration file.
Definition: keybindings.c:842
void keybindings_send_command(guint group_id, guint key_id)
Mimics a (built-in only) keybinding action.
Definition: keybindings.c:1426
static void add_kb(GeanyKeyGroup *group, gsize key_id, GeanyKeyCallback callback, guint key, GdkModifierType mod, const gchar *kf_name, const gchar *label, const gchar *widget_name)
Definition: keybindings.c:288
static void join_paragraph(GeanyEditor *editor)
Definition: keybindings.c:2381
static void fill_shortcut_labels_treeview(GtkWidget *tree)
Definition: keybindings.c:952
static void load_user_kb(void)
Definition: keybindings.c:790
static void reflow_lines(GeanyEditor *editor, gint column)
Definition: keybindings.c:2290
static void add_kb_group(GeanyKeyGroup *group, const gchar *name, const gchar *label, GeanyKeyGroupCallback callback, gboolean plugin)
Definition: keybindings.c:261
static void reflow_paragraph(GeanyEditor *editor)
Definition: keybindings.c:2354
GeanyKeyBinding * keybindings_set_item_full(GeanyKeyGroup *group, gsize key_id, guint key, GdkModifierType mod, const gchar *kf_name, const gchar *label, GtkWidget *menu_item, GeanyKeyBindingFunc cb, gpointer pdata, GDestroyNotify destroy_notify)
Creates a new keybinding using a GeanyKeyBindingFunc and attaches it to a keybinding group.
Definition: keybindings.c:231
static void goto_matching_brace(GeanyDocument *doc)
Definition: keybindings.c:1918
static void free_key_group(gpointer item)
Definition: keybindings.c:723
GdkModifierType keybindings_get_modifiers(GdkModifierType mods)
Gets significant modifiers from a GdkModifierType mask.
Definition: keybindings.c:121
static gboolean cb_func_file_action(guint key_id)
Definition: keybindings.c:1442
static gboolean cb_func_clipboard_action(guint key_id)
Definition: keybindings.c:1938
static void cb_func_menu_preferences(guint key_id)
Definition: keybindings.c:1521
GeanyKeyBinding * keybindings_get_item(GeanyKeyGroup *group, gsize key_id)
Looks up a keybinding item.
Definition: keybindings.c:140
static void join_lines(GeanyEditor *editor)
Definition: keybindings.c:2194
static GtkWidget * create_dialog(void)
Definition: keybindings.c:991
static void cb_func_switch_tabright(guint key_id)
GeanyKeyGroup * keybindings_set_group(GeanyKeyGroup *group, const gchar *section_name, const gchar *label, gsize count, GeanyKeyGroupCallback callback)
Definition: keybindings.c:2661
static void cb_func_switch_tablastused(guint key_id)
static gboolean check_snippet_completion(GeanyDocument *doc)
Definition: keybindings.c:1126
void(* KBItemCallback)(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
Definition: keybindings.c:756
void keybindings_init(void)
Definition: keybindings.c:742
void keybindings_free(void)
Definition: keybindings.c:934
static void duplicate_lines(GeanyEditor *editor)
Definition: keybindings.c:2081
gboolean keybindings_check_event(GdkEventKey *ev, GeanyKeyBinding *kb)
Definition: keybindings.c:1302
static gboolean cb_func_select_action(guint key_id)
Definition: keybindings.c:2497
void keybindings_write_to_file(void)
Definition: keybindings.c:915
static GtkWidget * key_dialog
Definition: keybindings.c:1067
gchar * keybindings_get_label(GeanyKeyBinding *kb)
Definition: keybindings.c:946
static GeanyKeyBinding binding_ids[GEANY_KEYS_COUNT]
Definition: keybindings.c:68
static void goto_tag(GeanyDocument *doc, gboolean definition)
Definition: keybindings.c:1966
static gchar * get_current_word_or_sel(GeanyDocument *doc, gboolean sci_word)
Definition: keybindings.c:1689
static const gboolean swap_alt_tab_order
Definition: keybindings.c:71
static gboolean read_current_word(GeanyDocument *doc, gboolean sci_word)
Definition: keybindings.c:1659
void keybindings_dialog_show_prefs_scroll(const gchar *name)
Definition: keybindings.c:1059
void keybindings_show_shortcuts(void)
Definition: keybindings.c:1080
GeanyKeyBinding * keybindings_set_item(GeanyKeyGroup *group, gsize key_id, GeanyKeyCallback callback, guint key, GdkModifierType mod, const gchar *kf_name, const gchar *label, GtkWidget *menu_item)
<simplesect kind="geany:skip"></simplesect> Fills a GeanyKeyBinding struct item.
Definition: keybindings.c:171
static void set_keyfile_kb(GeanyKeyGroup *group, GeanyKeyBinding *kb, gpointer user_data)
Definition: keybindings.c:903
static void cb_func_menu_messagewindow(guint key_id)
Configurable keyboard shortcuts.
#define GEANY_PRIMARY_MOD_MASK
Defines the primary modifier mask which is the Ctrl key mask on UNIX/Windows and Command key mask on ...
Definition: keybindings.h:36
gboolean(* GeanyKeyBindingFunc)(GeanyKeyBinding *key, guint key_id, gpointer user_data)
Function pointer type used for keybinding callbacks, with userdata for passing context.
Definition: keybindings.h:69
@ GEANY_KEY_GROUP_HELP
Group.
Definition: keybindings.h:118
@ GEANY_KEY_GROUP_SELECT
Group.
Definition: keybindings.h:106
@ GEANY_KEY_GROUP_NOTEBOOK
Group.
Definition: keybindings.h:114
@ GEANY_KEY_GROUP_VIEW
Group.
Definition: keybindings.h:112
@ GEANY_KEY_GROUP_SEARCH
Group.
Definition: keybindings.h:110
@ GEANY_KEY_GROUP_COUNT
Definition: keybindings.h:119
@ GEANY_KEY_GROUP_CLIPBOARD
Group.
Definition: keybindings.h:105
@ GEANY_KEY_GROUP_DOCUMENT
Group.
Definition: keybindings.h:115
@ GEANY_KEY_GROUP_INSERT
Group.
Definition: keybindings.h:108
@ GEANY_KEY_GROUP_PROJECT
Group.
Definition: keybindings.h:103
@ GEANY_KEY_GROUP_BUILD
Group.
Definition: keybindings.h:116
@ GEANY_KEY_GROUP_TOOLS
Group.
Definition: keybindings.h:117
@ GEANY_KEY_GROUP_SETTINGS
Group.
Definition: keybindings.h:109
@ GEANY_KEY_GROUP_GOTO
Group.
Definition: keybindings.h:111
@ GEANY_KEY_GROUP_EDITOR
Group.
Definition: keybindings.h:104
@ GEANY_KEY_GROUP_FORMAT
Group.
Definition: keybindings.h:107
@ GEANY_KEY_GROUP_FOCUS
Group.
Definition: keybindings.h:113
@ GEANY_KEY_GROUP_FILE
Group.
Definition: keybindings.h:102
@ GEANY_KEYS_EDITOR_DUPLICATELINE
Keybinding.
Definition: keybindings.h:150
@ GEANY_KEYS_GOTO_PREVWORDPART
Keybinding.
Definition: keybindings.h:239
@ GEANY_KEYS_VIEW_ZOOMIN
Keybinding.
Definition: keybindings.h:222
@ GEANY_KEYS_CLIPBOARD_CUTLINE
Keybinding.
Definition: keybindings.h:251
@ GEANY_KEYS_GOTO_TOGGLEMARKER
Keybinding.
Definition: keybindings.h:183
@ GEANY_KEYS_FILE_NEW
Keybinding.
Definition: keybindings.h:177
@ GEANY_KEYS_FORMAT_SENDTOCMD5
Keybinding.
Definition: keybindings.h:270
@ GEANY_KEYS_GOTO_TAGDEFINITION
Keybinding.
Definition: keybindings.h:184
@ GEANY_KEYS_CLIPBOARD_CUT
Keybinding.
Definition: keybindings.h:211
@ GEANY_KEYS_EDITOR_MOVELINEDOWN
Keybinding.
Definition: keybindings.h:203
@ GEANY_KEYS_DOCUMENT_TOGGLEFOLD
Keybinding.
Definition: keybindings.h:135
@ GEANY_KEYS_CLIPBOARD_COPYLINE
Keybinding.
Definition: keybindings.h:204
@ GEANY_KEYS_SEARCH_FIND
Keybinding.
Definition: keybindings.h:129
@ GEANY_KEYS_BUILD_COMPILE
Keybinding.
Definition: keybindings.h:136
@ GEANY_KEYS_BUILD_PREVIOUSERROR
Keybinding.
Definition: keybindings.h:191
@ GEANY_KEYS_EDITOR_CALLTIP
Keybinding.
Definition: keybindings.h:148
@ GEANY_KEYS_EDITOR_AUTOCOMPLETE
Keybinding.
Definition: keybindings.h:243
@ GEANY_KEYS_EDITOR_SUPPRESSSNIPPETCOMPLETION
Keybinding.
Definition: keybindings.h:173
@ GEANY_KEYS_BUILD_LINK
Keybinding.
Definition: keybindings.h:208
@ GEANY_KEYS_SEARCH_FINDNEXTSEL
Keybinding.
Definition: keybindings.h:157
@ GEANY_KEYS_FILE_RELOAD_ALL
Keybinding.
Definition: keybindings.h:278
@ GEANY_KEYS_FORMAT_REFLOWPARAGRAPH
Keybinding.
Definition: keybindings.h:198
@ GEANY_KEYS_FORMAT_SENDTOCMD7
Keybinding.
Definition: keybindings.h:272
@ GEANY_KEYS_CLIPBOARD_COPY
Keybinding.
Definition: keybindings.h:235
@ GEANY_KEYS_GOTO_NEXTMARKER
Keybinding.
Definition: keybindings.h:131
@ GEANY_KEYS_DOCUMENT_LINEWRAP
Keybinding.
Definition: keybindings.h:170
@ GEANY_KEYS_FOCUS_MESSAGES
Keybinding.
Definition: keybindings.h:158
@ GEANY_KEYS_DOCUMENT_CLONE
Keybinding.
Definition: keybindings.h:266
@ GEANY_KEYS_TOOLS_OPENCOLORCHOOSER
Keybinding.
Definition: keybindings.h:152
@ GEANY_KEYS_DOCUMENT_RELOADTAGLIST
Keybinding.
Definition: keybindings.h:230
@ GEANY_KEYS_SEARCH_FINDNEXT
Keybinding.
Definition: keybindings.h:182
@ GEANY_KEYS_NOTEBOOK_MOVETABLAST
Keybinding.
Definition: keybindings.h:232
@ GEANY_KEYS_GOTO_LINESTART
Keybinding.
Definition: keybindings.h:175
@ GEANY_KEYS_GOTO_MATCHINGBRACE
Keybinding.
Definition: keybindings.h:139
@ GEANY_KEYS_PROJECT_CLOSE
Keybinding.
Definition: keybindings.h:263
@ GEANY_KEYS_FORMAT_SENDTOCMD3
Keybinding.
Definition: keybindings.h:166
@ GEANY_KEYS_VIEW_TOGGLEALL
Keybinding.
Definition: keybindings.h:145
@ GEANY_KEYS_FORMAT_SENDTOCMD4
Keybinding.
Definition: keybindings.h:269
@ GEANY_KEYS_FORMAT_COMMENTLINETOGGLE
Keybinding.
Definition: keybindings.h:228
@ GEANY_KEYS_FILE_QUIT
Keybinding.
Definition: keybindings.h:267
@ GEANY_KEYS_DOCUMENT_REMOVE_MARKERS_INDICATORS
Keybinding.
Definition: keybindings.h:260
@ GEANY_KEYS_HELP_HELP
Keybinding.
Definition: keybindings.h:160
@ GEANY_KEYS_FILE_PROPERTIES
Keybinding.
Definition: keybindings.h:268
@ GEANY_KEYS_VIEW_SIDEBAR
Keybinding.
Definition: keybindings.h:236
@ GEANY_KEYS_BUILD_MAKE
Keybinding.
Definition: keybindings.h:142
@ GEANY_KEYS_FORMAT_SENDTOCMD9
Keybinding.
Definition: keybindings.h:274
@ GEANY_KEYS_FILE_PRINT
Keybinding.
Definition: keybindings.h:149
@ GEANY_KEYS_EDITOR_SCROLLLINEUP
Keybinding.
Definition: keybindings.h:248
@ GEANY_KEYS_SELECT_WORD
Keybinding.
Definition: keybindings.h:163
@ GEANY_KEYS_FORMAT_SENDTOCMD8
Keybinding.
Definition: keybindings.h:273
@ GEANY_KEYS_SETTINGS_PREFERENCES
Keybinding.
Definition: keybindings.h:165
@ GEANY_KEYS_SELECT_ALL
Keybinding.
Definition: keybindings.h:229
@ GEANY_KEYS_BUILD_RUN
Keybinding.
Definition: keybindings.h:159
@ GEANY_KEYS_FORMAT_SENDTOVTE
Keybinding.
Definition: keybindings.h:168
@ GEANY_KEYS_NOTEBOOK_MOVETABFIRST
Keybinding.
Definition: keybindings.h:246
@ GEANY_KEYS_FOCUS_SIDEBAR_DOCUMENT_LIST
Keybinding.
Definition: keybindings.h:197
@ GEANY_KEYS_SEARCH_NEXTMESSAGE
Keybinding.
Definition: keybindings.h:185
@ GEANY_KEYS_INSERT_LINEBEFORE
Keybinding.
Definition: keybindings.h:259
@ GEANY_KEYS_DOCUMENT_LINEBREAK
Keybinding.
Definition: keybindings.h:223
@ GEANY_KEYS_EDITOR_DELETELINETOBEGINNING
Keybinding.
Definition: keybindings.h:275
@ GEANY_KEYS_FILE_OPENLASTTAB
Keybinding.
Definition: keybindings.h:255
@ GEANY_KEYS_INSERT_LINEAFTER
Keybinding.
Definition: keybindings.h:258
@ GEANY_KEYS_SEARCH_FINDDOCUMENTUSAGE
Keybinding.
Definition: keybindings.h:140
@ GEANY_KEYS_FORMAT_INCREASEINDENTBYSPACE
Keybinding.
Definition: keybindings.h:181
@ GEANY_KEYS_FILE_OPEN
Keybinding.
Definition: keybindings.h:216
@ GEANY_KEYS_EDITOR_SNIPPETNEXTCURSOR
Keybinding.
Definition: keybindings.h:178
@ GEANY_KEYS_FILE_SAVEAS
Keybinding.
Definition: keybindings.h:237
@ GEANY_KEYS_EDITOR_DELETELINETOEND
Keybinding.
Definition: keybindings.h:186
@ GEANY_KEYS_EDITOR_MOVELINEUP
Keybinding.
Definition: keybindings.h:199
@ GEANY_KEYS_EDITOR_TRANSPOSELINE
Keybinding.
Definition: keybindings.h:126
@ GEANY_KEYS_GOTO_FORWARD
Keybinding.
Definition: keybindings.h:210
@ GEANY_KEYS_FORMAT_SENDTOCMD6
Keybinding.
Definition: keybindings.h:271
@ GEANY_KEYS_SEARCH_REPLACE
Keybinding.
Definition: keybindings.h:241
@ GEANY_KEYS_SELECT_WORDPARTRIGHT
Keybinding.
Definition: keybindings.h:195
@ GEANY_KEYS_NOTEBOOK_SWITCHTABRIGHT
Keybinding.
Definition: keybindings.h:179
@ GEANY_KEYS_FORMAT_AUTOINDENT
Keybinding.
Definition: keybindings.h:187
@ GEANY_KEYS_BUILD_MAKEOWNTARGET
Keybinding.
Definition: keybindings.h:205
@ GEANY_KEYS_FILE_CLOSE
Keybinding.
Definition: keybindings.h:154
@ GEANY_KEYS_SEARCH_FINDINFILES
Keybinding.
Definition: keybindings.h:256
@ GEANY_KEYS_EDITOR_REDO
Keybinding.
Definition: keybindings.h:224
@ GEANY_KEYS_FOCUS_VTE
Keybinding.
Definition: keybindings.h:219
@ GEANY_KEYS_FOCUS_SIDEBAR_SYMBOL_LIST
Keybinding.
Definition: keybindings.h:174
@ GEANY_KEYS_GOTO_LINEENDVISUAL
Keybinding.
Definition: keybindings.h:192
@ GEANY_KEYS_SEARCH_MARKALL
Keybinding.
Definition: keybindings.h:207
@ GEANY_KEYS_GOTO_NEXTWORDPART
Keybinding.
Definition: keybindings.h:257
@ GEANY_KEYS_NOTEBOOK_SWITCHTABLASTUSED
Keybinding.
Definition: keybindings.h:212
@ GEANY_KEYS_SELECT_PARAGRAPH
Keybinding.
Definition: keybindings.h:233
@ GEANY_KEYS_INSERT_ALTWHITESPACE
Keybinding.
Definition: keybindings.h:143
@ GEANY_KEYS_VIEW_MESSAGEWINDOW
Keybinding.
Definition: keybindings.h:196
@ GEANY_KEYS_GOTO_LINE
Keybinding.
Definition: keybindings.h:134
@ GEANY_KEYS_FORMAT_DECREASEINDENTBYSPACE
Keybinding.
Definition: keybindings.h:227
@ GEANY_KEYS_FOCUS_SIDEBAR
Keybinding.
Definition: keybindings.h:244
@ GEANY_KEYS_FILE_CLOSEALL
Keybinding.
Definition: keybindings.h:209
@ GEANY_KEYS_SEARCH_FINDUSAGE
Keybinding.
Definition: keybindings.h:176
@ GEANY_KEYS_GOTO_LINESTARTVISUAL
Keybinding.
Definition: keybindings.h:265
@ GEANY_KEYS_DOCUMENT_UNFOLDALL
Keybinding.
Definition: keybindings.h:138
@ GEANY_KEYS_FILE_RELOAD
Keybinding.
Definition: keybindings.h:156
@ GEANY_KEYS_VIEW_ZOOMRESET
Keybinding.
Definition: keybindings.h:162
@ GEANY_KEYS_GOTO_BACK
Keybinding.
Definition: keybindings.h:189
@ GEANY_KEYS_DOCUMENT_REMOVE_MARKERS
Keybinding.
Definition: keybindings.h:252
@ GEANY_KEYS_EDITOR_SCROLLLINEDOWN
Keybinding.
Definition: keybindings.h:144
@ GEANY_KEYS_BUILD_NEXTERROR
Keybinding.
Definition: keybindings.h:231
@ GEANY_KEYS_SEARCH_PREVIOUSMESSAGE
Keybinding.
Definition: keybindings.h:153
@ GEANY_KEYS_GOTO_LINEEND
Keybinding.
Definition: keybindings.h:147
@ GEANY_KEYS_FORMAT_DECREASEINDENT
Keybinding.
Definition: keybindings.h:254
@ GEANY_KEYS_SETTINGS_PLUGINPREFERENCES
Keybinding.
Definition: keybindings.h:161
@ GEANY_KEYS_NOTEBOOK_MOVETABRIGHT
Keybinding.
Definition: keybindings.h:213
@ GEANY_KEYS_DOCUMENT_REMOVE_ERROR_INDICATORS
Keybinding.
Definition: keybindings.h:127
@ GEANY_KEYS_GOTO_PREVIOUSMARKER
Keybinding.
Definition: keybindings.h:247
@ GEANY_KEYS_FORMAT_SENDTOCMD2
Keybinding.
Definition: keybindings.h:206
@ GEANY_KEYS_FORMAT_INCREASEINDENT
Keybinding.
Definition: keybindings.h:164
@ GEANY_KEYS_FOCUS_SCRIBBLE
Keybinding.
Definition: keybindings.h:151
@ GEANY_KEYS_DOCUMENT_FOLDALL
Keybinding.
Definition: keybindings.h:167
@ GEANY_KEYS_FOCUS_EDITOR
Keybinding.
Definition: keybindings.h:194
@ GEANY_KEYS_CLIPBOARD_PASTE
Keybinding.
Definition: keybindings.h:141
@ GEANY_KEYS_FILE_SAVE
Keybinding.
Definition: keybindings.h:180
@ GEANY_KEYS_DOCUMENT_STRIPTRAILINGSPACES
Keybinding.
Definition: keybindings.h:276
@ GEANY_KEYS_FORMAT_JOINLINES
Keybinding.
Definition: keybindings.h:264
@ GEANY_KEYS_SELECT_WORDPARTLEFT
Keybinding.
Definition: keybindings.h:221
@ GEANY_KEYS_VIEW_FULLSCREEN
Keybinding.
Definition: keybindings.h:146
@ GEANY_KEYS_FILE_SAVEALL
Keybinding.
Definition: keybindings.h:130
@ GEANY_KEYS_FOCUS_SEARCHBAR
Keybinding.
Definition: keybindings.h:128
@ GEANY_KEYS_EDITOR_WORDPARTCOMPLETION
Keybinding.
Definition: keybindings.h:242
@ GEANY_KEYS_GOTO_TAGDECLARATION
Keybinding.
Definition: keybindings.h:215
@ GEANY_KEYS_EDITOR_UNDO
Keybinding.
Definition: keybindings.h:202
@ GEANY_KEYS_FORMAT_TOGGLECASE
Keybinding.
Definition: keybindings.h:250
@ GEANY_KEYS_BUILD_OPTIONS
Keybinding.
Definition: keybindings.h:214
@ GEANY_KEYS_BUILD_MAKEOBJECT
Keybinding.
Definition: keybindings.h:253
@ GEANY_KEYS_EDITOR_CONTEXTACTION
Keybinding.
Definition: keybindings.h:225
@ GEANY_KEYS_FORMAT_SENDTOCMD1
Keybinding.
Definition: keybindings.h:220
@ GEANY_KEYS_EDITOR_SCROLLTOLINE
Keybinding.
Definition: keybindings.h:137
@ GEANY_KEYS_COUNT
Definition: keybindings.h:280
@ GEANY_KEYS_EDITOR_COMPLETESNIPPET
Keybinding.
Definition: keybindings.h:217
@ GEANY_KEYS_DOCUMENT_REPLACETABS
Keybinding.
Definition: keybindings.h:155
@ GEANY_KEYS_FORMAT_UNCOMMENTLINE
Keybinding.
Definition: keybindings.h:218
@ GEANY_KEYS_DOCUMENT_REPLACESPACES
Keybinding.
Definition: keybindings.h:193
@ GEANY_KEYS_FOCUS_COMPILER
Keybinding.
Definition: keybindings.h:249
@ GEANY_KEYS_FOCUS_MESSAGE_WINDOW
Keybinding.
Definition: keybindings.h:245
@ GEANY_KEYS_PROJECT_NEW
Keybinding.
Definition: keybindings.h:262
@ GEANY_KEYS_FILE_OPENSELECTED
Keybinding.
Definition: keybindings.h:188
@ GEANY_KEYS_EDITOR_DELETELINE
Keybinding.
Definition: keybindings.h:234
@ GEANY_KEYS_VIEW_ZOOMOUT
Keybinding.
Definition: keybindings.h:133
@ GEANY_KEYS_FORMAT_COMMENTLINE
Keybinding.
Definition: keybindings.h:238
@ GEANY_KEYS_SEARCH_FINDPREVSEL
Keybinding.
Definition: keybindings.h:226
@ GEANY_KEYS_NOTEBOOK_SWITCHTABLEFT
Keybinding.
Definition: keybindings.h:132
@ GEANY_KEYS_INSERT_DATE
Keybinding.
Definition: keybindings.h:190
@ GEANY_KEYS_SEARCH_FINDPREVIOUS
Keybinding.
Definition: keybindings.h:240
@ GEANY_KEYS_NOTEBOOK_MOVETABLEFT
Keybinding.
Definition: keybindings.h:200
@ GEANY_KEYS_PROJECT_OPEN
Keybinding.
Definition: keybindings.h:261
@ GEANY_KEYS_SELECT_LINE
Keybinding.
Definition: keybindings.h:201
@ GEANY_KEYS_PROJECT_PROPERTIES
Keybinding.
Definition: keybindings.h:169
void(* GeanyKeyCallback)(guint key_id)
Function pointer type used for keybinding callbacks.
Definition: keybindings.h:60
gboolean(* GeanyKeyGroupCallback)(guint key_id)
Function pointer type used for keybinding group callbacks.
Definition: keybindings.h:48
gboolean main_quit(void)
Definition: libmain.c:1383
GeanyApp * app
Definition: libmain.c:86
Main program-related commands.
#define MAX(a, b)
Definition: mio.c:93
void msgwin_switch_tab(gint tabnum, gboolean show)
Switches to the given notebook tab of the messages window.
Definition: msgwindow.c:1293
MessageWindow msgwindow
Definition: msgwindow.c:66
Message window functions (status, compiler, messages windows).
@ MSG_COMPILER
Index of the compiler tab.
Definition: msgwindow.h:47
@ MSG_VTE
Index of the VTE tab.
Definition: msgwindow.h:50
@ MSG_MESSAGE
Index of the messages tab.
Definition: msgwindow.h:48
@ MSG_SCRATCH
Index of the scratch tab.
Definition: msgwindow.h:49
void navqueue_go_forward(void)
Definition: navqueue.c:228
void navqueue_go_back(void)
Definition: navqueue.c:190
Simple code navigation.
void notebook_switch_tablastused(void)
Definition: notebook.c:269
void prefs_show_dialog(void)
Definition: prefs.c:1653
void prefs_kb_search_name(const gchar *search)
Definition: prefs.c:336
#define NULL
Definition: rbtree.h:150
gint sci_get_col_from_position(ScintillaObject *sci, gint position)
Gets the column number relative to the start of the line that position is on.
Definition: sciwrappers.c:480
void sci_set_current_line(ScintillaObject *sci, gint line)
Definition: sciwrappers.c:544
void sci_toggle_marker_at_line(ScintillaObject *sci, gint line, gint marker)
Definition: sciwrappers.c:420
gint sci_marker_next(ScintillaObject *sci, gint line, gint marker_mask, gboolean wrap)
Definition: sciwrappers.c:434
void sci_move_selected_lines_down(ScintillaObject *sci)
Definition: sciwrappers.c:1424
void sci_set_target_start(ScintillaObject *sci, gint start)
Definition: sciwrappers.c:1140
void sci_goto_pos(ScintillaObject *sci, gint pos, gboolean unfold)
Definition: sciwrappers.c:929
gchar * sci_get_selection_contents(ScintillaObject *sci)
Gets selected text.
Definition: sciwrappers.c:778
gint sci_get_current_position(ScintillaObject *sci)
Gets the cursor position.
Definition: sciwrappers.c:507
void sci_send_command(ScintillaObject *sci, gint cmd)
Sends Scintilla commands without any parameters.
Definition: sciwrappers.c:1180
void sci_set_line_indentation(ScintillaObject *sci, gint line, gint indent)
Sets the indentation of a line.
Definition: sciwrappers.c:1362
gint sci_get_lines_selected(ScintillaObject *sci)
Definition: sciwrappers.c:1199
gint sci_get_current_line(ScintillaObject *sci)
Gets current line number.
Definition: sciwrappers.c:1190
gint sci_get_line_indentation(ScintillaObject *sci, gint line)
Gets the indentation width of a line.
Definition: sciwrappers.c:1376
gint sci_get_selection_end(ScintillaObject *sci)
Gets the selection end position.
Definition: sciwrappers.c:636
void sci_set_selection(ScintillaObject *sci, gint anchorPos, gint currentPos)
Definition: sciwrappers.c:581
gint sci_get_line_indent_position(ScintillaObject *sci, gint line)
Definition: sciwrappers.c:1271
void sci_set_current_position(ScintillaObject *sci, gint position, gboolean scroll_to_caret)
Sets the cursor position.
Definition: sciwrappers.c:529
gchar sci_get_char_at(ScintillaObject *sci, gint pos)
Gets a character.
Definition: sciwrappers.c:889
void sci_lines_join(ScintillaObject *sci)
Definition: sciwrappers.c:1412
gint sci_get_position_from_col(ScintillaObject *sci, gint line, gint col)
Definition: sciwrappers.c:486
gboolean sci_has_selection(ScintillaObject *sci)
Checks if there's a selection.
Definition: sciwrappers.c:920
void sci_move_selected_lines_up(ScintillaObject *sci)
Definition: sciwrappers.c:1430
void sci_set_anchor(ScintillaObject *sci, gint pos)
Definition: sciwrappers.c:943
void sci_selection_duplicate(ScintillaObject *sci)
Definition: sciwrappers.c:1122
void sci_start_undo_action(ScintillaObject *sci)
Begins grouping a set of edits together as one Undo action.
Definition: sciwrappers.c:331
void sci_insert_text(ScintillaObject *sci, gint pos, const gchar *text)
Inserts text.
Definition: sciwrappers.c:1133
void sci_end_undo_action(ScintillaObject *sci)
Ends grouping a set of edits together as one Undo action.
Definition: sciwrappers.c:341
void sci_add_text(ScintillaObject *sci, const gchar *text)
Definition: sciwrappers.c:280
void sci_set_target_end(ScintillaObject *sci, gint end)
Definition: sciwrappers.c:1147
gint sci_marker_previous(ScintillaObject *sci, gint line, gint marker_mask, gboolean wrap)
Definition: sciwrappers.c:448
void sci_clear(ScintillaObject *sci)
Definition: sciwrappers.c:616
gint sci_get_line_end_position(ScintillaObject *sci, gint line)
Gets the position at the end of a line.
Definition: sciwrappers.c:592
gint sci_get_selection_start(ScintillaObject *sci)
Gets the selection start position.
Definition: sciwrappers.c:626
void sci_line_duplicate(ScintillaObject *sci)
Definition: sciwrappers.c:1116
gint sci_get_line_from_position(ScintillaObject *sci, gint position)
Gets the line number from position.
Definition: sciwrappers.c:469
gint sci_get_position_from_line(ScintillaObject *sci, gint line)
Gets the position for the start of line.
Definition: sciwrappers.c:497
gint sci_find_matching_brace(ScintillaObject *sci, gint pos)
Finds a matching brace at pos.
Definition: sciwrappers.c:1291
Wrapper functions for the Scintilla editor widget SCI_* messages.
gint search_mark_all(GeanyDocument *doc, const gchar *search_text, GeanyFindFlags flags)
Definition: search.c:1231
@ GEANY_FIND_WHOLEWORD
Definition: search.h:38
@ GEANY_FIND_MATCHCASE
Definition: search.h:37
void sidebar_focus_openfiles_tab(void)
Definition: sidebar.c:1129
SidebarTreeviews tv
Definition: sidebar.c:50
void sidebar_focus_symbols_tab(void)
Definition: sidebar.c:1141
StashGroup * group
Definition: stash-example.c:1
GtkWidget * dialog
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
gtk_widget_show_all(dialog)
struct GeanyProject * project
Currently active project or NULL if none is open.
Definition: app.h:49
gchar * configdir
User configuration directory, usually ~/.config/geany.
Definition: app.h:45
Structure for representing an open tab with all its properties.
Definition: document.h:81
struct GeanyDocumentPrivate * priv
Definition: document.h:121
gboolean is_valid
Flag used to check if this document is valid when iterating GeanyData::documents_array.
Definition: document.h:83
GeanyEditor * editor
The editor associated with the document.
Definition: document.h:98
Default prefs when creating a new editor window.
Definition: editor.h:99
gboolean newline_strip
Definition: editor.h:119
gint line_break_column
Definition: editor.h:128
gint long_line_column
Definition: editor.h:106
gboolean complete_snippets
Definition: editor.h:122
gint long_line_type
Definition: editor.h:105
gboolean smart_home_key
Definition: editor.h:118
gboolean folding
Definition: editor.h:114
Editor-owned fields for each document.
Definition: editor.h:150
gboolean line_breaking
Whether to split long lines as you type.
Definition: editor.h:158
ScintillaObject * sci
The Scintilla editor GtkWidget.
Definition: editor.h:152
gboolean strip_trailing_spaces
Definition: document.h:51
gboolean tab_order_ltr
Definition: document.h:53
Represents a single keybinding action.
Definition: keybindings.h:75
GeanyKeyBindingFunc cb_func
Definition: keybindings.h:89
GtkWidget * menu_item
Optional widget to set an accelerator for, or NULL.
Definition: keybindings.h:85
GdkModifierType default_mods
Definition: keybindings.h:88
gpointer cb_data
Definition: keybindings.h:90
gchar * name
Key name for the configuration file, such as "menu_new".
Definition: keybindings.h:78
GDestroyNotify cb_data_destroy
Definition: keybindings.h:91
GdkModifierType mods
Modifier keys, such as GDK_CONTROL_MASK or 0.
Definition: keybindings.h:77
GeanyKeyCallback callback
Function called when the key combination is pressed, or NULL to use the group callback (preferred).
Definition: keybindings.h:84
guint key
Key value in lower-case, such as GDK_KEY_a or 0.
Definition: keybindings.h:76
gchar * label
Label used in the preferences dialog keybindings tab.
Definition: keybindings.h:81
GtkWidget * window
Main window.
Definition: ui_utils.h:80
GtkWidget * notebook
Document notebook.
Definition: ui_utils.h:83
GtkWidget * editor_menu
Popup editor menu.
Definition: ui_utils.h:84
GtkWidget * sidebar_notebook
Sidebar notebook.
Definition: ui_utils.h:82
gboolean visible
Definition: toolbar.h:31
GtkWidget * tree_openfiles
Definition: sidebar.h:34
const gchar * name
Definition: stash.c:122
Defines internationalization macros.
#define _(String)
Definition: support.h:42
gboolean symbols_goto_tag(const gchar *name, gboolean definition)
Definition: symbols.c:2197
Tag-related functions.
GeanyToolbarPrefs toolbar_prefs
Definition: toolbar.c:48
GtkWidget * toolbar_get_widget_child_by_name(const gchar *name)
Definition: toolbar.c:141
Toolbar (prefs).
void tools_execute_custom_command(GeanyDocument *doc, const gchar *command)
Definition: tools.c:196
void ui_update_statusbar(GeanyDocument *doc, gint pos)
Definition: ui_utils.c:324
const gchar * ui_lookup_stock_label(const gchar *stock_id)
Finds the label text associated with stock_id.
Definition: ui_utils.c:3114
GtkWidget * ui_dialog_vbox_new(GtkDialog *dialog)
Makes a fixed border for dialogs without increasing the button box border.
Definition: ui_utils.c:1499
GeanyMainWidgets main_widgets
Definition: ui_utils.c:72
void ui_document_show_hide(GeanyDocument *doc)
Definition: ui_utils.c:1029
UIPrefs ui_prefs
Definition: ui_utils.c:74
GtkWidget * ui_lookup_widget(GtkWidget *widget, const gchar *widget_name)
Returns a widget from a name in a component, usually created by Glade.
Definition: ui_utils.c:2743
UIWidgets ui_widgets
Definition: ui_utils.c:75
User Interface general utility functions.
gint utils_write_file(const gchar *filename, const gchar *text)
Writes text into a file named filename.
Definition: utils.c:209
void utils_beep(void)
Definition: utils.c:918
gchar * utils_str_remove_chars(gchar *string, const gchar *chars)
Removes characters from a string, in place.
Definition: utils.c:1847
gboolean utils_isbrace(gchar c, gboolean include_angles)
Definition: utils.c:159
gchar * utils_get_locale_from_utf8(const gchar *utf8_text)
Converts the given UTF-8 encoded string into locale encoding.
Definition: utils.c:1243
General utility functions, non-GTK related.
#define foreach_ptr_array(item, idx, ptr_array)
Iterates all the pointers in ptr_array.
Definition: utils.h:108
#define SETPTR(ptr, result)
Assigns result to ptr, then frees the old value.
Definition: utils.h:50