app: add more modifier utility functions to gimpwidgets-utils.[ch]

- gimp_modifiers_to_channel_op() translates a modifier state to REPLACE,
  ADD, SUBTRACT or INTERSECT.

- gimp_replace_virtual_modifiers() uses gdk_keymap_add_virtual_modifiers()
  to replace the physical bits in a modifier state to their virtual
  counterparts (and not just adds the virtual ones like the GDK
  function).
This commit is contained in:
Michael Natterer 2011-10-05 19:15:17 +02:00
parent f45cccbc82
commit fdf103ce08
2 changed files with 68 additions and 0 deletions

View file

@ -616,6 +616,69 @@ gimp_suggest_modifiers (const gchar *message,
}
#undef BUF_SIZE
GimpChannelOps
gimp_modifiers_to_channel_op (GtkWidget *widget,
GdkModifierType modifiers)
{
GdkModifierType extend_mask;
GdkModifierType modify_mask;
g_return_val_if_fail (GTK_IS_WIDGET (widget), GIMP_CHANNEL_OP_REPLACE);
extend_mask =
gtk_widget_get_modifier_mask (widget,
GDK_MODIFIER_INTENT_EXTEND_SELECTION);
modify_mask =
gtk_widget_get_modifier_mask (widget,
GDK_MODIFIER_INTENT_MODIFY_SELECTION);
if (modifiers & extend_mask)
{
if (modifiers & modify_mask)
{
return GIMP_CHANNEL_OP_INTERSECT;
}
else
{
return GIMP_CHANNEL_OP_ADD;
}
}
else if (modifiers & modify_mask)
{
return GIMP_CHANNEL_OP_SUBTRACT;
}
return GIMP_CHANNEL_OP_REPLACE;
}
GdkModifierType
gimp_replace_virtual_modifiers (GdkModifierType modifiers)
{
GdkDisplay *display = gdk_display_get_default ();
GdkModifierType result = 0;
gint i;
for (i = 0; i < 8; i++)
{
GdkModifierType real = 1 << i;
if (modifiers & real)
{
GdkModifierType virtual = real;
gdk_keymap_add_virtual_modifiers (gdk_keymap_get_for_display (display),
&virtual);
if (virtual == real)
result |= virtual;
else
result |= virtual & ~real;
}
}
return result;
}
/**
* gimp_get_screen_resolution:
* @screen: a #GdkScreen or %NULL

View file

@ -50,6 +50,7 @@ GtkIconSize gimp_get_icon_size (GtkWidget *widget
gint width,
gint height);
GimpTabStyle gimp_preview_tab_style_to_icon (GimpTabStyle tab_style);
const gchar * gimp_get_mod_separator (void);
const gchar * gimp_get_mod_string (GdkModifierType modifiers);
gchar * gimp_suggest_modifiers (const gchar *message,
@ -57,6 +58,10 @@ gchar * gimp_suggest_modifiers (const gchar *messag
const gchar *shift_format,
const gchar *control_format,
const gchar *alt_format);
GimpChannelOps gimp_modifiers_to_channel_op (GtkWidget *widget,
GdkModifierType modifiers);
GdkModifierType gimp_replace_virtual_modifiers (GdkModifierType modifiers);
void gimp_get_screen_resolution (GdkScreen *screen,
gdouble *xres,
gdouble *yres);