Merge branch 'wip/gabrybarbe/fix-windows-actions' into 'master'

Draft: actions: fix windows actions for different keyboard layouts

Closes #11684 and #11685

See merge request GNOME/gimp!2239
This commit is contained in:
Gabriele 2025-07-01 19:29:22 +02:00
commit 67d1510d38
3 changed files with 100 additions and 40 deletions

View file

@ -856,3 +856,49 @@ action_message (GimpDisplay *display,
icon_name, format, args);
va_end (args);
}
guint
action_get_numrow_keyval (guint index)
{
GdkKeymap *keymap = gdk_keymap_get_for_display (gdk_display_get_default ());
guint keyval = GDK_KEY_1 + index;
GdkKeymapKey *keys = NULL;
gint n_keys = 0;
guint return_keyval = keyval;
if (gdk_keymap_get_entries_for_keyval (keymap, keyval, &keys, &n_keys))
{
for (guint i = 0; i < n_keys; i++)
{
if (keys[i].level == 0 && keys[i].group == 0)
{
return_keyval = keyval;
break;
}
else if (keys[i].level == 1 && keys[i].group == 0)
{
GdkKeymapKey *keycode_entries = NULL;
guint *keyvals_for_keycode = NULL;
gint n_keycode_entries = 0;
if (gdk_keymap_get_entries_for_keycode (keymap, keys[i].keycode,
&keycode_entries, &keyvals_for_keycode,
&n_keycode_entries))
{
for (guint j = 0; j < n_keycode_entries; j++)
{
if (keycode_entries[j].level == 0 && keycode_entries[j].group == 0)
{
return_keyval = keyvals_for_keycode[j];
break;
}
}
g_free (keycode_entries);
g_free (keyvals_for_keycode);
}
}
}
g_free (keys);
}
return return_keyval;
}

View file

@ -22,43 +22,44 @@
extern GimpActionFactory *global_action_factory;
void actions_init (Gimp *gimp);
void actions_exit (Gimp *gimp);
void actions_init (Gimp *gimp);
void actions_exit (Gimp *gimp);
Gimp * action_data_get_gimp (gpointer data);
GimpContext * action_data_get_context (gpointer data);
GimpImage * action_data_get_image (gpointer data);
GimpDisplay * action_data_get_display (gpointer data);
GimpDisplayShell * action_data_get_shell (gpointer data);
GtkWidget * action_data_get_widget (gpointer data);
gint action_data_sel_count (gpointer data);
Gimp * action_data_get_gimp (gpointer data);
GimpContext * action_data_get_context (gpointer data);
GimpImage * action_data_get_image (gpointer data);
GimpDisplay * action_data_get_display (gpointer data);
GimpDisplayShell * action_data_get_shell (gpointer data);
GtkWidget * action_data_get_widget (gpointer data);
gint action_data_sel_count (gpointer data);
gdouble action_select_value (GimpActionSelectType select_type,
gdouble value,
gdouble min,
gdouble max,
gdouble def,
gdouble small_inc,
gdouble inc,
gdouble skip_inc,
gdouble delta_factor,
gboolean wrap);
void action_select_property (GimpActionSelectType select_type,
GimpDisplay *display,
GObject *object,
const gchar *property_name,
gdouble small_inc,
gdouble inc,
gdouble skip_inc,
gdouble delta_factor,
gboolean wrap);
GimpObject * action_select_object (GimpActionSelectType select_type,
GimpContainer *container,
GimpObject *current);
void action_message (GimpDisplay *display,
GObject *object,
const gchar *format,
...) G_GNUC_PRINTF(3,4);
gdouble action_select_value (GimpActionSelectType select_type,
gdouble value,
gdouble min,
gdouble max,
gdouble def,
gdouble small_inc,
gdouble inc,
gdouble skip_inc,
gdouble delta_factor,
gboolean wrap);
void action_select_property (GimpActionSelectType select_type,
GimpDisplay *display,
GObject *object,
const gchar *property_name,
gdouble small_inc,
gdouble inc,
gdouble skip_inc,
gdouble delta_factor,
gboolean wrap);
GimpObject * action_select_object (GimpActionSelectType select_type,
GimpContainer *container,
GimpObject *current);
void action_message (GimpDisplay *display,
GObject *object,
const gchar *format,
...) G_GNUC_PRINTF(3,4);
guint action_get_numrow_keyval (guint index);
#define return_if_no_gimp(gimp,data) \

View file

@ -45,6 +45,7 @@
#include "dialogs/dialogs.h"
#include "actions.h"
#include "windows-actions.h"
#include "windows-commands.h"
@ -87,6 +88,8 @@ static void windows_actions_recent_remove (GimpContainer *conta
static void windows_actions_single_window_mode_notify (GimpDisplayConfig *config,
GParamSpec *pspec,
GimpActionGroup *group);
static void windows_actions_layout_changed (GdkKeymap *keymap,
gpointer user_data);
/* The only reason we have "Tab" in the action entries below is to
@ -164,7 +167,8 @@ static const GimpRadioActionEntry windows_tabs_position_actions[] =
void
windows_actions_setup (GimpActionGroup *group)
{
GList *list;
GList *list;
GdkKeymap *keymap;
gimp_action_group_add_actions (group, "windows-action",
windows_actions,
@ -237,6 +241,11 @@ windows_actions_setup (GimpActionGroup *group)
g_signal_connect_object (group->gimp->config, "notify::single-window-mode",
G_CALLBACK (windows_actions_single_window_mode_notify),
group, 0);
keymap = gdk_keymap_get_for_display (gdk_display_get_default ());
g_signal_connect (keymap, "keys-changed",
G_CALLBACK (windows_actions_layout_changed),
group);
}
void
@ -456,10 +465,7 @@ windows_actions_update_display_accels (GimpActionGroup *group)
"max-width-chars", 40,
NULL);
if (i < 9)
accel = gtk_accelerator_name (GDK_KEY_1 + i, GDK_MOD1_MASK);
else
accel = gtk_accelerator_name (GDK_KEY_0 + i, GDK_MOD1_MASK);
accel = gtk_accelerator_name (action_get_numrow_keyval (i), GDK_MOD1_MASK);
gimp_action_set_accels (action, (const gchar*[]) { accel, NULL });
g_free (accel);
@ -622,3 +628,10 @@ windows_actions_single_window_mode_notify (GimpDisplayConfig *config,
"windows-use-single-window-mode",
GIMP_GUI_CONFIG (config)->single_window_mode);
}
static void
windows_actions_layout_changed (GdkKeymap *keymap,
gpointer user_data)
{
windows_actions_update_display_accels ((GimpActionGroup *) user_data);
}