Kaydet (Commit) 82b413e5 authored tarafından Jiří Techet's avatar Jiří Techet

Fix keybindings on OS X

On OS X the Command key is used for common keybindings instead
of Ctrl. Introduce a new macro, GEANY_PRIMARY_MOD_MASK that
represents the Command key on OS X and Ctrl on other platforms.

For some events, such as mouse key press, GDK_MOD2_MASK is returned
for the Command key by GTK instead of GDK_META_MASK (which is returned
when Command is pressed together with some other key). To hide this
behavior from users, introduce keybindings_get_modifiers() which can be
used instead of gtk_accelerator_get_default_mod_mask() and which
inserts GDK_META_MASK when GDK_MOD2_MASK is found in the mask
on OS X.
üst ac76c84f
......@@ -1697,7 +1697,7 @@ G_MODULE_EXPORT void on_page_setup1_activate(GtkMenuItem *menuitem, gpointer use
G_MODULE_EXPORT gboolean on_escape_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
guint state = event->state & gtk_accelerator_get_default_mod_mask();
guint state = keybindings_get_modifiers(event->state);
/* make pressing escape in the sidebar and toolbar focus the editor */
if (event->keyval == GDK_Escape && state == 0)
......
......@@ -313,14 +313,14 @@ static gboolean on_editor_button_press_event(GtkWidget *widget, GdkEventButton *
if (event->button == 1)
{
guint state = event->state & gtk_accelerator_get_default_mod_mask();
guint state = keybindings_get_modifiers(event->state);
if (event->type == GDK_BUTTON_PRESS && editor_prefs.disable_dnd)
{
gint ss = sci_get_selection_start(editor->sci);
sci_set_selection_end(editor->sci, ss);
}
if (event->type == GDK_BUTTON_PRESS && state == GDK_CONTROL_MASK)
if (event->type == GDK_BUTTON_PRESS && state == GEANY_PRIMARY_MOD_MASK)
{
sci_set_current_position(editor->sci, editor_info.click_pos, FALSE);
......
This diff is collapsed.
......@@ -26,6 +26,12 @@
G_BEGIN_DECLS
#ifdef __APPLE__
#define GEANY_PRIMARY_MOD_MASK GDK_META_MASK
#else
#define GEANY_PRIMARY_MOD_MASK GDK_CONTROL_MASK
#endif
/** Function pointer type used for keybinding callbacks. */
typedef void (*GeanyKeyCallback) (guint key_id);
......@@ -246,6 +252,7 @@ GeanyKeyBinding *keybindings_set_item(GeanyKeyGroup *group, gsize key_id,
GeanyKeyBinding *keybindings_get_item(GeanyKeyGroup *group, gsize key_id);
GdkModifierType keybindings_get_modifiers(GdkModifierType mods);
#ifdef GEANY_PRIVATE
......
......@@ -617,8 +617,8 @@ static gboolean notebook_tab_click(GtkWidget *widget, GdkEventButton *event, gpo
return TRUE; /* stop other handlers like notebook_tab_bar_click_cb() */
}
/* switch last used tab on ctrl-click */
state = event->state & gtk_accelerator_get_default_mod_mask();
if (event->button == 1 && state == GDK_CONTROL_MASK)
state = keybindings_get_modifiers(event->state);
if (event->button == 1 && state == GEANY_PRIMARY_MOD_MASK)
{
keybindings_send_command(GEANY_KEY_GROUP_NOTEBOOK,
GEANY_KEYS_NOTEBOOK_SWITCHTABLASTUSED);
......
......@@ -1414,7 +1414,7 @@ static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *
g_return_val_if_fail(GTK_IS_LABEL(label), FALSE);
state = event->state & gtk_accelerator_get_default_mod_mask();
state = keybindings_get_modifiers(event->state);
if (event->keyval == GDK_Escape)
return FALSE; /* close the dialog, don't allow escape when detecting keybindings. */
......
......@@ -41,6 +41,7 @@
#include "symbols.h"
#include "ui_utils.h"
#include "utils.h"
#include "keybindings.h"
#include <string.h>
......@@ -912,7 +913,8 @@ static gboolean taglist_go_to_selection(GtkTreeSelection *selection, guint keyva
if (doc != NULL)
{
navqueue_goto_line(doc, doc, line);
if (keyval != GDK_space && ! (state & GDK_CONTROL_MASK))
state = keybindings_get_modifiers(state);
if (keyval != GDK_space && ! (state & GEANY_PRIMARY_MOD_MASK))
change_focus_to_editor(doc, NULL);
else
handled = FALSE;
......
......@@ -39,6 +39,7 @@
#include "support.h"
#include "ui_utils.h"
#include "utils.h"
#include "keybindings.h"
#include "gtkcompat.h"
......@@ -328,7 +329,7 @@ void vte_close(void)
static gboolean vte_keyrelease_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
if (ui_is_keyval_enter_or_return(event->keyval) ||
((event->keyval == GDK_c) && (event->state & GDK_CONTROL_MASK)))
((event->keyval == GDK_c) && (event->state & GEANY_PRIMARY_MOD_MASK)))
{
/* assume any text on the prompt has been executed when pressing Enter/Return */
clean = TRUE;
......@@ -349,7 +350,7 @@ static gboolean vte_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer
event->keyval == GDK_d ||
event->keyval == GDK_C ||
event->keyval == GDK_D) &&
event->state & GDK_CONTROL_MASK &&
event->state & GEANY_PRIMARY_MOD_MASK &&
! (event->state & GDK_SHIFT_MASK) && ! (event->state & GDK_MOD1_MASK))
{
vte_restart(widget);
......@@ -560,14 +561,14 @@ static GtkWidget *vte_create_popup_menu(void)
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, NULL);
gtk_widget_add_accelerator(item, "activate", accel_group,
GDK_c, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
GDK_c, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
gtk_widget_show(item);
gtk_container_add(GTK_CONTAINER(menu), item);
g_signal_connect(item, "activate", G_CALLBACK(vte_popup_menu_clicked), GINT_TO_POINTER(POPUP_COPY));
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, NULL);
gtk_widget_add_accelerator(item, "activate", accel_group,
GDK_v, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
GDK_v, GEANY_PRIMARY_MOD_MASK | GDK_SHIFT_MASK, GTK_ACCEL_VISIBLE);
gtk_widget_show(item);
gtk_container_add(GTK_CONTAINER(menu), item);
g_signal_connect(item, "activate", G_CALLBACK(vte_popup_menu_clicked), GINT_TO_POINTER(POPUP_PASTE));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment