[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