As far as I am concerned, gtk+ uses two systems of keypress handling:
The key accelerators are used to tell the widget to "activate". I haven't explored them very much, as they are almost exclusive to menu items. There is probably more to them, however.
The work I have been focusing on deals with the gtk_*_key_press[_event] functions for the various widgets that have them. Essentially, any widget that must deal with keyboard input on a regular basis has a function of the form:
static gint gtk_<widget name>_key_press (GtkWidget *widget, GdkEventKey *event)
static gint gtk_<widget name>_key_press_event (GtkWidget *widget, GdkEventKey *event)
There are a few exceptions, but this is the general form.
Each of these functions are usually one large switch
statement (in the case of a widget that has only one or two keys to respond to, it may even be a simple if
) comparing the keyval and state of the incoming GdkEventKey to the key (e.g. the right arrow) and keyboard mask (e.g. ctrl, shift, or alt) that it should respond to.
Staring blankly at all of these switch
statements eventually led me to a realization. For any given keypress, a widget will have a very small and well defined number of possible reactions. All of these reactions are defined by the switch
and if
statements. There are no other reactions (except no reaction, which is taken care of by simply doing nothing).
It therefore became evident to me that any system I made would contain a set of possible actions that a widget might perform, and a corresponding list of keypresses that would trigger each particular response.
With this in mind, I went through all of the widgets using these gtk_*_key_press functions and built a text file of all the events and what keypresses trigger them by default that I could easily figure out. They are the remainder of this page, in alphabetical order... :D
Legend: all the funky keys in here (like right arrow, left arrow, tab, etc.) are represented by their entries in the gdk/gdkkeysyms.h file. They should be fairly straightforward.
GtkCalendar (gtkcalendar.c) in function gtk_calendar_key_press: GTK_CALENDAR_SEL_UP - GDK_Up - move date selection box up GTK_CALENDAR_SEL_DOWN - GDK_Down - move date selection box down GTK_CALENDAR_SEL_LEFT - GDK_Left - move date selection box to the left GTK_CALENDAR_SEL_RIGHT - GDK_Right - move date selection box to the right GTK_CALENDAR_SEL_SEL - GDK_Space - give currently highlighted date (under the selection box) focus (changes months if selected date belongs to an adjacent month GTK_CALENDAR_MONTH_NEXT - <ctrl> + GDK_Right - moves the calendar to the next month GTK_CALENDAR_MONTH_PREV - <ctrl> + GDK_Left - move calendar to the previous month GTK_CALENDAR_YEAR_PREV - <ctrl> + GDK_Up - move calendar to previous year GTK_CALENDAR_YEAR_NEXT - <ctrl> + GDK_Down - move calendar to next year
GtkCList (gtkclist.c) in function gtk_clist_keypress: GTK_CLIST_FOCUS_FORWARD - GDK_Tab, GDK_ISO_Left_Tab - put focus on the next widget in the clist GTK_CLIST_FOCUS_BACKWARD - <shift> + GDK_Tab, <shift> + GDK_ISO_Left_Tab - put focus on the previous widget in the clist
GtkCombo (gtkcombo.c) in function gtk_combo_list_key_press GTK_COMBO_ENTRY_UNSELECT - GDK_Escape - hide self if popped up, else unselect item in function gtk_combo_entry_key_press GTK_COMBO_ENTRY_AUTOCOMPLETE - <alt> + GDK_Tab - attempt to autocomplete a text entry GTK_COMBO_ENTRY_PREV - GDK_Up, GDK_KP_Up, <alt> + p, <alt> + P - select previous entry in combo list GTK_COMBO_ENTRY_NEXT - GDK_Down, GDK_KP_Down; <alt> + n, <alt> + N - select next entry in combo list in function gtk_combo_window_key_press GTK_COMBO_ENTRY_SEL - GDK_Return, GDK_KP_Enter - hide self if popped up, keep selection
GtkDnD (gtkdnd) in function gtk_drag_key_cb GTK_DND_ABORT_DND - GDK_Escape - abort a drag and drop operation in function gtk_drag_get_event_actions GTK_DND_ACTION_LINK - <ctrl> + <shift> - make a DND operation a 'link' GTK_DND_ACTION_COPY - <ctrl> - make a DND operation a 'copy' GTK_DND_ACTION_MOVE - <shift> - make a DND operation a 'move' GTK_DND_ACTION_ASK - <alt> - inquire about a DND operation?
GtkEntry (gtkentry.c) in function gtk_entry_key_press GTK_ENTRY_DELETE_CHAR_PREV - GDK_Backspace - delete previous character (or selection) GTK_ENTRY_DELETE_WORD_PREV - <ctrl> + GDK_Backspace - delete previous word (or selection) GTK_ENTRY_DELETE_LINE - GDK_Clear - delete current line GTK_ENTRY_CLIPBOARD_PASTE - <shift> + GDK_Insert - insert from clipboard GTK_ENTRY_CLIPBOARD_COPY - <ctrl> + GDK_Insert - copy to clipboard GTK_ENTRY_INSERT_TOGGLE - GDK_Insert - toggle insert (not implemented) GTK_ENTRY_CLIPBOARD_CUT - <shift> + GDK_Delete - delete selection and copy to clipboard GTK_ENTRY_DELETE_CHAR_NEXT - GDK_Delete - delete next character (or selection) GTK_ENTRY_DELETE_WORD_NEXT - <ctrl> + GDK_Delete - delete next word GTK_ENTRY_CURSOR_TO_LINE_BEGINNING - GDK_Home - move cursor to beginning of line GTK_ENTRY_CURSOR_TO_LINE_END - GDK_End - move cursor to end of line GTK_ENTRY_SELECTION_LEFT - <shift> + GDK_Left - extend/shrink selection one character to the left GTK_ENTRY_CURSOR_BACK_WORD - <ctrl> + GDK_Left - move cursor back one word GTK_ENTRY_CURSOR_BACK_CHAR - GDK_Left - move cursor back one character GTK_ENTRY_SELECTION_RIGHT - <shift> + GDK_Right - extend/shrink selection one character to the right GTK_ENTRY_CURSOR_FORWARD_WORD - <ctrl> + GDK_Right - move cursor forward one word GTK_ENTRY_CURSOR_FORWARD_CHAR - GDK_Right - move cursor forward one character GTK_ENTRY_ACTIVATE - GDK_Return - 'gtk_widget_activate (widget);' GTK_ENTRY_IGNORE - GDK_Tab, GDK_Escape - explicitly ignored and passed up to the parent so they don't end up in the text.
GtkFileSel (gtkfilesel.c) in function gtk_file_selection_key_press GTK_FILESEL_ACT_CHANGE - GDK_Tab - activate changes based on dir selections before changing widget focus
GtkFontSel (gtkfontsel.c) in function gtk_font_selection_on_clist_key_press GTK_FONTSEL_FONT_PREV - GDK_Up - select previous font in clist GTK_FONTSEL_FONT_NEXT - GDK_Down - select next font in clist
GtkNotebook (gtknotebook.c) in function gtk_notebook_key_press GTK_NOTEBOOK_UP - GDK_Up - move based on tab positions or something select current page if tabs are along bottom GTK_NOTEBOOK_LEFT - GDK_Left - move based on tab positions or something select current page if tabs are on right GTK_NOTEBOOK_DOWN - GDK_Down - move based on tab positions or something select current page if tabs are on top GTK_NOTEBOOK_RIGHT - GDK_Right - yes, there is a pattern here GTK_NOTEBOOK_TAB_NEXT - GDK_Tab;GDK_ISO_Left_Tab - move to next tab/widget GTK_NOTEBOOK_TAB_FIRST - GDK_Home - go to first tab GTK_NOTEBOOK_TAB_LAST - GDK_End - go to last tab GTK_NOTEBOOK_TAB_SEL - GDK_Return;GDK_space - select the currently highlighted page/tab
GtkOptionMenu (gtkoptionmenu.c) in function gtk_option_menu_key_press GTK_OPTION_MENU_POPUP_CHILD - pop up child menu
GtkPlug (gtkplug.c) in function gtk_plug_key_press_event GTK_PLUG_ACTIVATE_SELECTED - GDK_space - activate selected widget GTK_PLUG_ACTIVATE_DEFAULT - GDK_Return;GDK_KP_Enter - activate default widget, selected widget otherwise GTK_PLUG_DIR_UP - GDK_Up - pass it on GTK_PLUG_DIR_DOWN - GDK_Down - pass it on GTK_PLUG_DIR_LEFT - GDK_Left - pass it on GTK_PLUG_DIR_RIGHT - GDK_Right - pass it on GTK_PLUG_DIR_TAB_FORWARD - GDK_Tab - pass on tab GTK_PLUG_DIR_TAB_BACKWARD - <shift> + GDK_Tab - pass on backwards tab
GtkSpinButton (gtkspinbutton.c) in function gtk_spin_button_key_press GTK_SPIN_BUTTON_UP_LITTLE - GDK_Up - spin a bit GTK_SPIN_BUTTON_DOWN_LITTLE - GDK_Down - spin a bit GTK_SPIN_BUTTON_UP_LOTS - GDK_Page_Up - spin a lot GTK_SPIN_BUTTON_DOWN_LOTS - GDK_Page_Down - spin a lot
GtkText (gtktext.c) in function gtk_text_key_press GTK_TEXT_TO_TOP - <ctrl> + GDK_Home - cursor to top of area GTK_TEXT_TO_LINE_BEGINNING - GDK_Home - cursor to line beginning GTK_TEXT_TO_BOTTOM - <ctrl> + GDK_End - cursor to bottom of area GTK_TEXT_TO_LINE_END - GDK_End - bring selection with you GTK_TEXT_PAGE_UP - GDK_Page_Up - page up GTK_TEXT_PAGE_DOWN - GDK_Page_Down - page down GTK_TEXT_TO_PREV_ROW - GDK_Up - move up a row GTK_TEXT_TO_NEXT_ROW - GDK_Down - move down a row GTK_TEXT_BACK_CHAR - GDK_Left - move left a character GTK_TEXT_BACK_WORD - <ctrl> + GDK_Left - move left a word GTK_TEXT_FORWARD_CHAR - GDK_Right - move right a character GTK_TEXT_FORWARD_WORD - <ctrl> + GDK_Right - more right a word GTK_TEXT_DELETE_WORD_PREV - <ctrl> + GDK_Backspace - delete prev word GTK_TEXT_DELETE_CHAR_PREV - GDK_Backspace - delete prev char GTK_TEXT_DELETE_LINE - GDK_Clear - delete line GTK_TEXT_CLIPBOARD_PASTE - <shift> + GDK_Insert - paste GTK_TEXT_CLIPBOARD_COPY - <ctrl> + GDK_Insert - copy GTK_TEXT_TOGGLE_INSERT - GDK_Insert - toggle insert (not implemented) GTK_TEXT_DELETE_WORD_NEXT - <ctrl> + GDK_Delete - delete next word GTK_TEXT_DELETE_CHAR_NEXT - GDK_Delete - delete next char GTK_TEXT_CLIPBOARD_CUT - <shift> + GDK_Delete - cut selection to clipboard GTK_TEXT_INSERT_TAB - GDK_Tab - INSERT A TAB CHARACTER! GTK_TEXT_ACTIVATE_TEXT - <ctrl> + GDK_Return - activate text(?) GTK_TEXT_INSERT_NEWLINE - GDK_Return - insert a newline! GTK_TEXT_IGNORE - GDK_Escape explicitly ignored so as not to end up in the text GTK_TEXT_SHIFT_MASK - <shift> - modifier key used to make each motion involve the current selection: used to change selection's size
GtkWindow (gtkwindow.c) in function gtk_window_key_press_event GTK_WINDOW_ACTIVATE_SELECTED - GDK_space - activate the widget with focus GTK_WINDOW_ACTIVATE_DEFAULT - GDK_Return;GDK_KP_Enter - activate default widget, selected if no default GTK_WINDOW_SEL_UP - GDK_Up;GDK_KP_Up - move focus in the direction pressed GTK_WINDOW_SEL_DOWN - GDK_Down;GDK_KP_Down - move focus in the direction pressed GTK_WINDOW_SEL_LEFT - GDK_Left;GDK_KP_Left - move focus in the direction pressed GTK_WINDOW_SEL_RIGHT - GDK_Right;GDK_KP_Right - move focus in the direction pressed GTK_WINDOW_SEL_TAB_FORWARD - GDK_Tab;GDK_ISO_Left_Tab - move focus in the direction pressed GTK_WINDOW_SEL_TAB_BACKWARD - <shift> + GDK_Tab; <shift> + GDK_ISO_Left_Tab - move focus backwards tabbed-like