[Xfce4-commits] [panel-plugins/xfce4-xkb-plugin] 13/17: Allow to display language name instead of country name
noreply at xfce.org
noreply at xfce.org
Sat Jun 10 14:31:46 CEST 2017
This is an automated email from the git hooks/post-receive script.
n i n e t l s p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository panel-plugins/xfce4-xkb-plugin.
commit 0a8d39d4c0bc138e47c8dbc476e5f04fb88eecdc
Author: Viktor Odintsev <zakhams at gmail.com>
Date: Fri Mar 31 13:51:38 2017 +0300
Allow to display language name instead of country name
For example, the "EN" text will be shown instead of "US" in case of
"en_US" locale. This behavior is configurable.
A memory-stored GdkPixbuf is used to draw an image now.
---
panel-plugin/xkb-cairo.c | 48 +++-------
panel-plugin/xkb-cairo.h | 5 +-
panel-plugin/xkb-dialog.c | 43 +++++++--
panel-plugin/xkb-keyboard.c | 201 ++++++++++++++++++++++++++----------------
panel-plugin/xkb-keyboard.h | 9 +-
panel-plugin/xkb-plugin.c | 39 +++++---
panel-plugin/xkb-properties.h | 7 ++
panel-plugin/xkb-xfconf.c | 32 +++++++
panel-plugin/xkb-xfconf.h | 1 +
9 files changed, 245 insertions(+), 140 deletions(-)
diff --git a/panel-plugin/xkb-cairo.c b/panel-plugin/xkb-cairo.c
index dc77c75..8947f83 100644
--- a/panel-plugin/xkb-cairo.c
+++ b/panel-plugin/xkb-cairo.c
@@ -24,7 +24,6 @@
*/
#include <libxfce4util/libxfce4util.h>
-#include <librsvg/rsvg.h>
#include "xkb-cairo.h"
#include "xkb-util.h"
@@ -33,55 +32,36 @@
void
xkb_cairo_draw_flag (cairo_t *cr,
- const gchar *group_name,
+ GdkPixbuf *image,
gint actual_width,
gint actual_height,
gint variant_markers_count,
guint max_variant_markers_count,
- guint scale,
- GdkRGBA rgba)
+ guint scale)
{
- gchar *filename;
- RsvgHandle *handle;
- RsvgDimensionData dim;
double scalex, scaley;
- gint i;
+ gint i, width, height;
double layoutx, layouty, img_width, img_height;
double radius, diameter;
guint spacing;
g_assert (cr != NULL);
+ g_assert (image != NULL);
- if (!group_name)
- return;
+ width = gdk_pixbuf_get_width (image);
+ height = gdk_pixbuf_get_height (image);
- filename = xkb_util_get_flag_filename (group_name);
- handle = rsvg_handle_new_from_file (filename, NULL);
- g_free (filename);
-
- if (!handle)
- {
- xkb_cairo_draw_label (cr, group_name,
- actual_width, actual_height,
- variant_markers_count,
- scale,
- rgba);
- return;
- }
-
- rsvg_handle_get_dimensions (handle, &dim);
-
- scalex = (double) (actual_width - 4) / dim.width;
- scaley = (double) (actual_height - 4) / dim.height;
+ scalex = (double) (actual_width - 4) / width;
+ scaley = (double) (actual_height - 4) / height;
scalex *= scale / 100.0;
scaley *= scale / 100.0;
- img_width = dim.width * scalex;
- img_height = dim.height * scaley;
+ img_width = width * scalex;
+ img_height = height * scaley;
DBG ("scale x/y: %.3f/%.3f, dim w/h: %d/%d, scaled w/h: %.1f/%.1f",
- scalex, scaley, dim.width, dim.height, scalex*dim.width, scaley*dim.height);
+ scalex, scaley, width, height, scalex*width, scaley*height);
layoutx = (actual_width - img_width) / 2;
layouty = (actual_height - img_height) / 2;
@@ -90,7 +70,8 @@ xkb_cairo_draw_flag (cairo_t *cr,
cairo_save (cr);
cairo_scale (cr, scalex, scaley);
- rsvg_handle_render_cairo (handle, cr);
+ gdk_cairo_set_source_pixbuf (cr, image, 0, 0);
+ cairo_paint (cr);
cairo_restore (cr);
@@ -153,9 +134,6 @@ xkb_cairo_draw_flag (cairo_t *cr,
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_stroke (cr);
}
-
- rsvg_handle_close (handle, NULL);
- g_object_unref (handle);
}
void
diff --git a/panel-plugin/xkb-cairo.h b/panel-plugin/xkb-cairo.h
index e124760..1da2c6e 100644
--- a/panel-plugin/xkb-cairo.h
+++ b/panel-plugin/xkb-cairo.h
@@ -31,13 +31,12 @@
#include <pango/pangocairo.h>
void xkb_cairo_draw_flag (cairo_t *cr,
- const gchar *flag_name,
+ GdkPixbuf *image,
gint actual_width,
gint actual_height,
gint variant_markers_count,
guint max_variant_markers_count,
- guint scale,
- GdkRGBA rgba);
+ guint scale);
void xkb_cairo_draw_label (cairo_t *cr,
const gchar *group_name,
diff --git a/panel-plugin/xkb-dialog.c b/panel-plugin/xkb-dialog.c
index aa969fd..b7bb0d4 100644
--- a/panel-plugin/xkb-dialog.c
+++ b/panel-plugin/xkb-dialog.c
@@ -64,10 +64,12 @@ xkb_dialog_configure_plugin (XfcePanelPlugin *plugin,
{
GtkWidget *settings_dialog;
GtkWidget *display_type_combo;
+ GtkWidget *display_name_combo;
GtkWidget *display_scale_range;
GtkWidget *display_tooltip_icon_switch;
GtkWidget *group_policy_combo;
GtkWidget *vbox, *frame, *bin, *grid, *label;
+ gint grid_vertical;
DialogInstance *instance;
xfce_panel_plugin_block_menu (plugin);
@@ -88,6 +90,8 @@ xkb_dialog_configure_plugin (XfcePanelPlugin *plugin,
gtk_widget_show (vbox);
gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (settings_dialog))), vbox);
+ grid_vertical = 0;
+
frame = xfce_gtk_frame_box_new (_("Appearance"), &bin);
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 2);
@@ -101,35 +105,54 @@ xkb_dialog_configure_plugin (XfcePanelPlugin *plugin,
label = gtk_label_new (_("Show layout as:"));
gtk_label_set_xalign (GTK_LABEL (label), 0.f);
gtk_widget_set_hexpand (label, TRUE);
- gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), label, 0, grid_vertical, 1, 1);
display_type_combo = gtk_combo_box_text_new ();
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (display_type_combo), _("image"));
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (display_type_combo), _("text"));
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (display_type_combo), _("system"));
gtk_widget_set_size_request (display_type_combo, 230, -1);
- gtk_grid_attach (GTK_GRID (grid), display_type_combo, 1, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), display_type_combo, 1, grid_vertical, 1, 1);
+
+ grid_vertical++;
+
+ label = gtk_label_new (_("Layout name:"));
+ gtk_label_set_xalign (GTK_LABEL (label), 0.f);
+ gtk_widget_set_hexpand (label, TRUE);
+ gtk_grid_attach (GTK_GRID (grid), label, 0, grid_vertical, 1, 1);
+
+ display_name_combo = gtk_combo_box_text_new ();
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (display_name_combo), _("country"));
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (display_name_combo), _("language"));
+ gtk_widget_set_size_request (display_name_combo, 230, -1);
+ gtk_grid_attach (GTK_GRID (grid), display_name_combo, 1, grid_vertical, 1, 1);
+
+ grid_vertical++;
label = gtk_label_new (_("Widget size:"));
gtk_label_set_xalign (GTK_LABEL (label), 0.f);
gtk_widget_set_hexpand (label, TRUE);
- gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), label, 0, grid_vertical, 1, 1);
display_scale_range = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
DISPLAY_SCALE_MIN, DISPLAY_SCALE_MAX, 1);
instance->display_scale_range = display_scale_range;
gtk_scale_set_value_pos (GTK_SCALE (display_scale_range), GTK_POS_RIGHT);
gtk_widget_set_size_request (display_scale_range, 230, -1);
- gtk_grid_attach (GTK_GRID (grid), display_scale_range, 1, 1, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), display_scale_range, 1, grid_vertical, 1, 1);
+
+ grid_vertical++;
label = gtk_label_new (_("Tooltip icon:"));
gtk_label_set_xalign (GTK_LABEL (label), 0.f);
gtk_widget_set_hexpand (label, TRUE);
- gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), label, 0, grid_vertical, 1, 1);
display_tooltip_icon_switch = gtk_switch_new ();
gtk_widget_set_halign (display_tooltip_icon_switch, GTK_ALIGN_END);
- gtk_grid_attach (GTK_GRID (grid), display_tooltip_icon_switch, 1, 2, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), display_tooltip_icon_switch, 1, grid_vertical, 1, 1);
+
+ grid_vertical = 0;
frame = xfce_gtk_frame_box_new (_("Behavior"), &bin);
gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 2);
@@ -144,14 +167,14 @@ xkb_dialog_configure_plugin (XfcePanelPlugin *plugin,
label = gtk_label_new (_("Manage layout:"));
gtk_label_set_xalign (GTK_LABEL (label), 0.f);
gtk_widget_set_hexpand (label, TRUE);
- gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), label, 0, grid_vertical, 1, 1);
group_policy_combo = gtk_combo_box_text_new ();
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (group_policy_combo), _("globally"));
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (group_policy_combo), _("per window"));
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (group_policy_combo), _("per application"));
gtk_widget_set_size_request (group_policy_combo, 230, -1);
- gtk_grid_attach (GTK_GRID (grid), group_policy_combo, 1, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), group_policy_combo, 1, grid_vertical, 1, 1);
gtk_widget_show_all (vbox);
@@ -167,6 +190,10 @@ xkb_dialog_configure_plugin (XfcePanelPlugin *plugin,
G_OBJECT (display_type_combo),
"active", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+ g_object_bind_property (G_OBJECT (config), DISPLAY_NAME,
+ G_OBJECT (display_name_combo),
+ "active", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+
g_object_bind_property (G_OBJECT (config), DISPLAY_SCALE,
G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (display_scale_range))),
"value", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
diff --git a/panel-plugin/xkb-keyboard.c b/panel-plugin/xkb-keyboard.c
index fd1dd8b..7b35e1b 100644
--- a/panel-plugin/xkb-keyboard.c
+++ b/panel-plugin/xkb-keyboard.c
@@ -32,9 +32,13 @@
typedef struct
{
- gchar *group_name;
+ gchar *country_name;
+ gint country_index;
+ gchar *language_name;
+ gint language_index;
gchar *variant;
gchar *pretty_layout_name;
+ GdkPixbuf *display_pixbuf;
GdkPixbuf *tooltip_pixbuf;
} XkbGroupData;
@@ -52,7 +56,6 @@ struct _XkbKeyboard
XkbGroupData *group_data;
XkbGroupPolicy group_policy;
- GHashTable *variant_index_by_group;
GHashTable *application_map;
GHashTable *window_map;
@@ -106,7 +109,6 @@ xkb_keyboard_init (XkbKeyboard *keyboard)
keyboard->group_data = NULL;
keyboard->group_policy = GROUP_POLICY_GLOBAL;
- keyboard->variant_index_by_group = NULL;
keyboard->application_map = NULL;
keyboard->window_map = NULL;
@@ -196,7 +198,7 @@ xkb_keyboard_create_pretty_layout_name (XklConfigRegistry *registry,
else
{
g_snprintf (config_item->name, sizeof (config_item->name),
- "%s", layout_name);
+ "%s", layout_name);
if (xkl_config_registry_find_layout (registry, config_item))
{
pretty_layout_name = xkb_keyboard_xkb_description (config_item);
@@ -211,11 +213,27 @@ xkb_keyboard_create_pretty_layout_name (XklConfigRegistry *registry,
return pretty_layout_name;
}
+static gchar *
+xkb_keyboard_obtain_language_name (XklConfigRegistry *registry,
+ XklConfigItem *config_item,
+ gchar *layout_name)
+{
+ g_snprintf (config_item->name, sizeof (config_item->name),
+ "%s", layout_name);
+
+ if (xkl_config_registry_find_layout (registry, config_item))
+ {
+ return g_strdup (config_item->short_description);
+ }
+
+ return g_strdup (layout_name);
+}
+
static void
xkb_keyboard_initialize_xkb_options (XkbKeyboard *keyboard,
const XklConfigRec *config_rec)
{
- GHashTable *index_variants;
+ GHashTable *country_indexes, *language_indexes;
gchar **group;
gint val, i;
gpointer pval;
@@ -237,8 +255,8 @@ xkb_keyboard_initialize_xkb_options (XkbKeyboard *keyboard,
keyboard->application_map = g_hash_table_new (g_direct_hash, NULL);
keyboard->group_data = (XkbGroupData *) g_new0 (XkbGroupData,
keyboard->group_count);
- keyboard->variant_index_by_group = g_hash_table_new (NULL, NULL);
- index_variants = g_hash_table_new (g_str_hash, g_str_equal);
+ country_indexes = g_hash_table_new (g_str_hash, g_str_equal);
+ language_indexes = g_hash_table_new (g_str_hash, g_str_equal);
registry = xkl_config_registry_get_instance (keyboard->engine);
xkl_config_registry_load (registry, FALSE);
@@ -249,49 +267,50 @@ xkb_keyboard_initialize_xkb_options (XkbKeyboard *keyboard,
XkbGroupData *group_data = &keyboard->group_data[i];
RsvgHandle *handle;
- group_data->group_name = g_strdup (config_rec->layouts[i]);
+ group_data->country_name = g_strdup (config_rec->layouts[i]);
group_data->variant = (config_rec->variants[i] == NULL)
? g_strdup ("") : g_strdup (config_rec->variants[i]);
- pval = g_hash_table_lookup (
- index_variants,
- group_data->group_name
- );
- val = (pval != NULL) ? GPOINTER_TO_INT (pval) : 0;
- val++;
- g_hash_table_insert (
- keyboard->variant_index_by_group,
- GINT_TO_POINTER (i),
- GINT_TO_POINTER (val)
- );
- g_hash_table_insert (
- index_variants,
- group_data->group_name,
- GINT_TO_POINTER (val)
- );
-
- imgfilename = xkb_util_get_flag_filename (group_data->group_name);
+ group_data->pretty_layout_name = xkb_keyboard_create_pretty_layout_name (registry,
+ config_item, group_data->country_name, group_data->variant);
+
+ group_data->language_name = xkb_keyboard_obtain_language_name (registry,
+ config_item, group_data->country_name);
+
+ #define MODIFY_INDEXES(table, name, index) \
+ pval = g_hash_table_lookup ( \
+ table, \
+ group_data->name \
+ ); \
+ val = (pval != NULL) ? GPOINTER_TO_INT (pval) : 0; \
+ val++; \
+ group_data->index = val; \
+ g_hash_table_insert ( \
+ table, \
+ group_data->name, \
+ GINT_TO_POINTER (val) \
+ );
+
+ MODIFY_INDEXES (country_indexes, country_name, country_index);
+ MODIFY_INDEXES (language_indexes, language_name, language_index);
+
+ imgfilename = xkb_util_get_flag_filename (group_data->country_name);
handle = rsvg_handle_new_from_file (imgfilename, NULL);
if (handle)
{
- GdkPixbuf *tmp = rsvg_handle_get_pixbuf (handle);
- group_data->tooltip_pixbuf =
- gdk_pixbuf_scale_simple (tmp, 30, 22, GDK_INTERP_BILINEAR);
- g_object_unref (tmp);
+ group_data->display_pixbuf = rsvg_handle_get_pixbuf (handle);
+ group_data->tooltip_pixbuf = gdk_pixbuf_scale_simple (group_data->display_pixbuf,
+ 30, 22, GDK_INTERP_BILINEAR);
rsvg_handle_close (handle, NULL);
g_object_unref (handle);
}
g_free (imgfilename);
-
- group_data->pretty_layout_name =
- xkb_keyboard_create_pretty_layout_name (registry, config_item,
- group_data->group_name,
- group_data->variant);
}
g_object_unref (config_item);
g_object_unref (registry);
- g_hash_table_destroy (index_variants);
+ g_hash_table_destroy (country_indexes);
+ g_hash_table_destroy (language_indexes);
}
static void
@@ -299,9 +318,6 @@ xkb_keyboard_free (XkbKeyboard *keyboard)
{
gint i;
- if (keyboard->variant_index_by_group)
- g_hash_table_destroy (keyboard->variant_index_by_group);
-
if (keyboard->window_map)
g_hash_table_destroy (keyboard->window_map);
@@ -313,13 +329,16 @@ xkb_keyboard_free (XkbKeyboard *keyboard)
for (i = 0; i < keyboard->group_count; i++)
{
XkbGroupData *group_data = &keyboard->group_data[i];
- g_free (group_data->group_name);
+ g_free (group_data->country_name);
+ g_free (group_data->language_name);
g_free (group_data->variant);
g_free (group_data->pretty_layout_name);
+
+ if (group_data->display_pixbuf)
+ g_object_unref (group_data->display_pixbuf);
+
if (group_data->tooltip_pixbuf)
- {
g_object_unref (group_data->tooltip_pixbuf);
- }
}
g_free (keyboard->group_data);
}
@@ -528,32 +547,62 @@ xkb_keyboard_get_max_group_count (XkbKeyboard *keyboard)
const gchar*
xkb_keyboard_get_group_name (XkbKeyboard *keyboard,
+ XkbDisplayName display_name,
gint group)
{
- g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), NULL);
+ XkbGroupData *group_data;
- if (G_UNLIKELY (group >= keyboard->group_count))
- return NULL;
+ g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), NULL);
if (group == -1)
group = xkb_keyboard_get_current_group (keyboard);
- return keyboard->group_data[group].group_name;
+ if (G_UNLIKELY (group < 0 || group >= keyboard->group_count))
+ return NULL;
+
+ group_data = &keyboard->group_data[group];
+
+ switch (display_name)
+ {
+ case DISPLAY_NAME_COUNTRY:
+ return group_data->country_name;
+
+ case DISPLAY_NAME_LANGUAGE:
+ return group_data->language_name;
+
+ default:
+ return "";
+ }
}
-const gchar*
-xkb_keyboard_get_variant (XkbKeyboard *keyboard,
- gint group)
+gint
+xkb_keyboard_get_variant_index (XkbKeyboard *keyboard,
+ XkbDisplayName display_name,
+ gint group)
{
- g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), NULL);
+ XkbGroupData *group_data;
- if (G_UNLIKELY (group >= keyboard->group_count))
- return NULL;
+ g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), 0);
if (group == -1)
group = xkb_keyboard_get_current_group (keyboard);
- return keyboard->group_data[group].variant;
+ if (G_UNLIKELY (group < 0 || group >= keyboard->group_count))
+ return 0;
+
+ group_data = &keyboard->group_data[group];
+
+ switch (display_name)
+ {
+ case DISPLAY_NAME_COUNTRY:
+ return group_data->country_index - 1;
+
+ case DISPLAY_NAME_LANGUAGE:
+ return group_data->language_index - 1;
+
+ default:
+ return 0;
+ }
}
static void
@@ -611,28 +660,6 @@ xkb_keyboard_xkl_config_changed (XklEngine *engine,
}
}
-gint
-xkb_keyboard_variant_index_for_group (XkbKeyboard *keyboard,
- gint group)
-{
- gpointer presult;
- gint result;
-
- g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), 0);
-
- if (group == -1) group = xkb_keyboard_get_current_group (keyboard);
-
- presult = g_hash_table_lookup (
- keyboard->variant_index_by_group,
- GINT_TO_POINTER (group)
- );
- if (presult == NULL) return 0;
-
- result = GPOINTER_TO_INT (presult);
- result = (result <= 0) ? 0 : result - 1;
- return result;
-}
-
static GdkFilterReturn
xkb_keyboard_handle_xevent (GdkXEvent * xev, GdkEvent * event, gpointer user_data)
{
@@ -645,11 +672,22 @@ xkb_keyboard_handle_xevent (GdkXEvent * xev, GdkEvent * event, gpointer user_dat
}
GdkPixbuf *
-xkb_keyboard_get_tooltip_pixbuf (XkbKeyboard *keyboard,
- gint group)
+xkb_keyboard_get_pixbuf (XkbKeyboard *keyboard,
+ gboolean tooltip,
+ gint group)
{
g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), NULL);
- return keyboard->group_data[group].tooltip_pixbuf;
+
+ if (group == -1)
+ group = xkb_keyboard_get_current_group (keyboard);
+
+ if (G_UNLIKELY (group < 0 || group >= keyboard->group_count))
+ return 0;
+
+ if (tooltip)
+ return keyboard->group_data[group].tooltip_pixbuf;
+ else
+ return keyboard->group_data[group].display_pixbuf;
}
gchar*
@@ -657,6 +695,13 @@ xkb_keyboard_get_pretty_layout_name (XkbKeyboard *keyboard,
gint group)
{
g_return_val_if_fail (IS_XKB_KEYBOARD (keyboard), NULL);
+
+ if (group == -1)
+ group = xkb_keyboard_get_current_group (keyboard);
+
+ if (G_UNLIKELY (group < 0 || group >= keyboard->group_count))
+ return 0;
+
return keyboard->group_data[group].pretty_layout_name;
}
diff --git a/panel-plugin/xkb-keyboard.h b/panel-plugin/xkb-keyboard.h
index 62096e4..006edcc 100644
--- a/panel-plugin/xkb-keyboard.h
+++ b/panel-plugin/xkb-keyboard.h
@@ -58,15 +58,15 @@ void xkb_keyboard_set_group_policy (XkbKeyboard *ke
gint xkb_keyboard_get_group_count (XkbKeyboard *keyboard);
guint xkb_keyboard_get_max_group_count (XkbKeyboard *keyboard);
const gchar* xkb_keyboard_get_group_name (XkbKeyboard *keyboard,
+ XkbDisplayName display_name,
gint group);
-const gchar* xkb_keyboard_get_variant (XkbKeyboard *keyboard,
+gint xkb_keyboard_get_variant_index (XkbKeyboard *keyboard,
+ XkbDisplayName display_name,
gint group);
gboolean xkb_keyboard_set_group (XkbKeyboard *keyboard,
gint group);
gboolean xkb_keyboard_next_group (XkbKeyboard *keyboard);
gboolean xkb_keyboard_prev_group (XkbKeyboard *keyboard);
-gint xkb_keyboard_variant_index_for_group (XkbKeyboard *keyboard,
- gint group);
void xkb_keyboard_window_changed (XkbKeyboard *keyboard,
guint new_window_id,
@@ -75,7 +75,8 @@ void xkb_keyboard_application_closed (XkbKeyboard *ke
guint application_id);
void xkb_keyboard_window_closed (XkbKeyboard *keyboard,
guint window_id);
-GdkPixbuf* xkb_keyboard_get_tooltip_pixbuf (XkbKeyboard *keyboard,
+GdkPixbuf* xkb_keyboard_get_pixbuf (XkbKeyboard *keyboard,
+ gboolean tooltip,
gint group);
gchar* xkb_keyboard_get_pretty_layout_name (XkbKeyboard *keyboard,
gint group);
diff --git a/panel-plugin/xkb-plugin.c b/panel-plugin/xkb-plugin.c
index 128322c..2bc49c9 100644
--- a/panel-plugin/xkb-plugin.c
+++ b/panel-plugin/xkb-plugin.c
@@ -130,6 +130,7 @@ static void xkb_plugin_window_closed (WnckScreen *screen,
XkbPlugin *plugin);
static void xkb_plugin_display_type_changed (XkbPlugin *plugin);
+static void xkb_plugin_display_name_changed (XkbPlugin *plugin);
static void xkb_plugin_display_scale_changed (XkbPlugin *plugin);
static void xkb_plugin_group_policy_changed (XkbPlugin *plugin);
@@ -178,6 +179,8 @@ xkb_plugin_construct (XfcePanelPlugin *plugin)
xkb_plugin->config = xkb_xfconf_new (xfce_panel_plugin_get_property_base (plugin));
g_signal_connect_swapped (G_OBJECT (xkb_plugin->config), "notify::" DISPLAY_TYPE,
G_CALLBACK (xkb_plugin_display_type_changed), xkb_plugin);
+ g_signal_connect_swapped (G_OBJECT (xkb_plugin->config), "notify::" DISPLAY_NAME,
+ G_CALLBACK (xkb_plugin_display_name_changed), xkb_plugin);
g_signal_connect_swapped (G_OBJECT (xkb_plugin->config), "notify::" DISPLAY_SCALE,
G_CALLBACK (xkb_plugin_display_scale_changed), xkb_plugin);
g_signal_connect_swapped (G_OBJECT (xkb_plugin->config), "notify::" GROUP_POLICY,
@@ -557,19 +560,16 @@ xkb_plugin_set_tooltip (GtkWidget *widget,
GtkTooltip *tooltip,
XkbPlugin *plugin)
{
- gint group;
gchar *layout_name;
GdkPixbuf *pixbuf;
- group = xkb_keyboard_get_current_group (plugin->keyboard);
-
if (xkb_xfconf_get_display_tooltip_icon (plugin->config))
{
- pixbuf = xkb_keyboard_get_tooltip_pixbuf (plugin->keyboard, group);
+ pixbuf = xkb_keyboard_get_pixbuf (plugin->keyboard, TRUE, -1);
gtk_tooltip_set_icon (tooltip, pixbuf);
}
- layout_name = xkb_keyboard_get_pretty_layout_name (plugin->keyboard, group);
+ layout_name = xkb_keyboard_get_pretty_layout_name (plugin->keyboard, -1);
gtk_tooltip_set_text (tooltip, layout_name);
@@ -582,6 +582,8 @@ xkb_plugin_layout_image_draw (GtkWidget *widget,
XkbPlugin *plugin)
{
const gchar *group_name;
+ gint variant_index;
+ GdkPixbuf *pixbuf;
GtkAllocation allocation;
GtkStyleContext *style_ctx;
GtkStateFlags state;
@@ -589,9 +591,11 @@ xkb_plugin_layout_image_draw (GtkWidget *widget,
GdkRGBA rgba;
gint actual_hsize, actual_vsize;
XkbDisplayType display_type;
+ XkbDisplayName display_name;
gint display_scale;
display_type = xkb_xfconf_get_display_type (plugin->config);
+ display_name = xkb_xfconf_get_display_name (plugin->config);
display_scale = xkb_xfconf_get_display_scale (plugin->config);
gtk_widget_get_allocation (GTK_WIDGET (widget), &allocation);
@@ -601,7 +605,13 @@ xkb_plugin_layout_image_draw (GtkWidget *widget,
state = gtk_widget_get_state_flags (GTK_WIDGET (plugin->btn));
style_ctx = gtk_widget_get_style_context (GTK_WIDGET (plugin->btn));
gtk_style_context_get_color (style_ctx, state, &rgba);
- group_name = xkb_keyboard_get_group_name (plugin->keyboard, -1);
+
+ group_name = xkb_keyboard_get_group_name (plugin->keyboard, display_name, -1);
+ pixbuf = xkb_keyboard_get_pixbuf (plugin->keyboard, FALSE, -1);
+ variant_index = xkb_keyboard_get_variant_index (plugin->keyboard, display_name, -1);
+
+ if (pixbuf == NULL && display_type == DISPLAY_TYPE_IMAGE)
+ display_type = DISPLAY_TYPE_TEXT;
DBG ("img_exposed: actual h/v (%d/%d)",
actual_hsize, actual_vsize);
@@ -609,18 +619,17 @@ xkb_plugin_layout_image_draw (GtkWidget *widget,
switch (display_type)
{
case DISPLAY_TYPE_IMAGE:
- xkb_cairo_draw_flag (cr, group_name,
+ xkb_cairo_draw_flag (cr, pixbuf,
actual_hsize, actual_vsize,
- xkb_keyboard_variant_index_for_group (plugin->keyboard, -1),
+ variant_index,
xkb_keyboard_get_max_group_count (plugin->keyboard),
- display_scale,
- rgba
+ display_scale
);
break;
case DISPLAY_TYPE_TEXT:
xkb_cairo_draw_label (cr, group_name,
actual_hsize, actual_vsize,
- xkb_keyboard_variant_index_for_group (plugin->keyboard, -1),
+ variant_index,
display_scale,
rgba
);
@@ -629,7 +638,7 @@ xkb_plugin_layout_image_draw (GtkWidget *widget,
gtk_style_context_get (style_ctx, state, "font", &desc, NULL);
xkb_cairo_draw_label_system (cr, group_name,
actual_hsize, actual_vsize,
- xkb_keyboard_variant_index_for_group (plugin->keyboard, -1),
+ variant_index,
desc, rgba
);
break;
@@ -687,6 +696,12 @@ xkb_plugin_display_type_changed (XkbPlugin *plugin)
}
static void
+xkb_plugin_display_name_changed (XkbPlugin *plugin)
+{
+ xkb_plugin_refresh_gui (plugin);
+}
+
+static void
xkb_plugin_display_scale_changed (XkbPlugin *plugin)
{
xkb_plugin_refresh_gui (plugin);
diff --git a/panel-plugin/xkb-properties.h b/panel-plugin/xkb-properties.h
index 4aae8a6..d9b61a5 100644
--- a/panel-plugin/xkb-properties.h
+++ b/panel-plugin/xkb-properties.h
@@ -27,6 +27,7 @@
#define _XKB_PROPERTIES_H_
#define DISPLAY_TYPE "display-type"
+#define DISPLAY_NAME "display-name"
#define DISPLAY_SCALE "display-scale"
#define DISPLAY_TOOLTIP_ICON "display-tooltip-icon"
#define GROUP_POLICY "group-policy"
@@ -38,6 +39,12 @@ typedef enum
DISPLAY_TYPE_SYSTEM = 2
} XkbDisplayType;
+typedef enum
+{
+ DISPLAY_NAME_COUNTRY = 0,
+ DISPLAY_NAME_LANGUAGE = 1,
+} XkbDisplayName;
+
#define DISPLAY_SCALE_MIN 0
#define DISPLAY_SCALE_MAX 100
diff --git a/panel-plugin/xkb-xfconf.c b/panel-plugin/xkb-xfconf.c
index c73eb97..83c6ec5 100644
--- a/panel-plugin/xkb-xfconf.c
+++ b/panel-plugin/xkb-xfconf.c
@@ -34,6 +34,7 @@
#include <xfconf/xfconf.h>
#define DEFAULT_DISPLAY_TYPE DISPLAY_TYPE_IMAGE
+#define DEFAULT_DISPLAY_NAME DISPLAY_NAME_COUNTRY
#define DEFAULT_DISPLAY_SCALE DISPLAY_SCALE_MAX
#define DEFAULT_DISPLAY_TOOLTIP_ICON TRUE
#define DEFAULT_GROUP_POLICY GROUP_POLICY_PER_APPLICATION
@@ -58,6 +59,7 @@ struct _XkbXfconf
GObject __parent__;
XkbDisplayType display_type;
+ XkbDisplayName display_name;
guint display_scale;
gboolean display_tooltip_icon;
XkbGroupPolicy group_policy;
@@ -67,6 +69,7 @@ enum
{
PROP_0,
PROP_DISPLAY_TYPE,
+ PROP_DISPLAY_NAME,
PROP_DISPLAY_SCALE,
PROP_DISPLAY_TOOLTIP_ICON,
PROP_GROUP_POLICY,
@@ -98,6 +101,11 @@ xkb_xfconf_class_init (XkbXfconfClass *klass)
DISPLAY_TYPE_IMAGE, DISPLAY_TYPE_SYSTEM, DEFAULT_DISPLAY_TYPE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DISPLAY_NAME,
+ g_param_spec_uint (DISPLAY_NAME, NULL, NULL,
+ DISPLAY_NAME_COUNTRY, DISPLAY_NAME_LANGUAGE, DEFAULT_DISPLAY_NAME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class, PROP_DISPLAY_SCALE,
g_param_spec_uint (DISPLAY_SCALE, NULL, NULL,
DISPLAY_SCALE_MIN, DISPLAY_SCALE_MAX, DEFAULT_DISPLAY_SCALE,
@@ -126,6 +134,7 @@ static void
xkb_xfconf_init (XkbXfconf *config)
{
config->display_type = DEFAULT_DISPLAY_TYPE;
+ config->display_name = DEFAULT_DISPLAY_NAME;
config->display_scale = DEFAULT_DISPLAY_SCALE;
config->display_tooltip_icon = DEFAULT_DISPLAY_TOOLTIP_ICON;
config->group_policy = DEFAULT_GROUP_POLICY;
@@ -148,6 +157,9 @@ xkb_xfconf_get_property (GObject *object, guint prop_id, GValue *value, GParamSp
case PROP_DISPLAY_TYPE:
g_value_set_uint (value, config->display_type);
break;
+ case PROP_DISPLAY_NAME:
+ g_value_set_uint (value, config->display_name);
+ break;
case PROP_DISPLAY_SCALE:
g_value_set_uint (value, config->display_scale);
break;
@@ -181,6 +193,15 @@ xkb_xfconf_set_property (GObject *object, guint prop_id, const GValue *value, GP
g_signal_emit (G_OBJECT (config), xkb_xfconf_signals [CONFIGURATION_CHANGED], 0);
}
break;
+ case PROP_DISPLAY_NAME:
+ val_uint = g_value_get_uint (value);
+ if (config->display_name != val_uint)
+ {
+ config->display_name = val_uint;
+ g_object_notify (G_OBJECT (config), DISPLAY_NAME);
+ g_signal_emit (G_OBJECT (config), xkb_xfconf_signals [CONFIGURATION_CHANGED], 0);
+ }
+ break;
case PROP_DISPLAY_SCALE:
val_uint = g_value_get_uint (value);
if (config->display_scale != val_uint)
@@ -221,6 +242,13 @@ xkb_xfconf_get_display_type (XkbXfconf *config)
return config->display_type;
}
+XkbDisplayName
+xkb_xfconf_get_display_name (XkbXfconf *config)
+{
+ g_return_val_if_fail (IS_XKB_XFCONF (config), DEFAULT_DISPLAY_NAME);
+ return config->display_name;
+}
+
guint
xkb_xfconf_get_display_scale (XkbXfconf *config)
{
@@ -259,6 +287,10 @@ xkb_xfconf_new (const gchar *property_base)
xfconf_g_property_bind (channel, property, G_TYPE_UINT, config, DISPLAY_TYPE);
g_free (property);
+ property = g_strconcat (property_base, "/" DISPLAY_NAME, NULL);
+ xfconf_g_property_bind (channel, property, G_TYPE_UINT, config, DISPLAY_NAME);
+ g_free (property);
+
property = g_strconcat (property_base, "/" DISPLAY_SCALE, NULL);
xfconf_g_property_bind (channel, property, G_TYPE_UINT, config, DISPLAY_SCALE);
g_free (property);
diff --git a/panel-plugin/xkb-xfconf.h b/panel-plugin/xkb-xfconf.h
index c9c0bc7..d609976 100644
--- a/panel-plugin/xkb-xfconf.h
+++ b/panel-plugin/xkb-xfconf.h
@@ -46,6 +46,7 @@ GType xkb_xfconf_get_type (void)
XkbXfconf *xkb_xfconf_new (const gchar *property_base);
XkbDisplayType xkb_xfconf_get_display_type (XkbXfconf *config);
+XkbDisplayName xkb_xfconf_get_display_name (XkbXfconf *config);
guint xkb_xfconf_get_display_scale (XkbXfconf *config);
gboolean xkb_xfconf_get_display_tooltip_icon (XkbXfconf *config);
XkbGroupPolicy xkb_xfconf_get_group_policy (XkbXfconf *config);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list