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 <zakh...@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. _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits