first round of working model chooser - not complete yet

This commit is contained in:
Sergey V. Udaltsov 2004-07-25 23:28:35 +00:00
parent 85cb682efc
commit 885acff46a
5 changed files with 331 additions and 111 deletions

View file

@ -40,6 +40,8 @@
#include "gnome-keyboard-properties-xkb.h"
#define CWID(s) glade_xml_get_widget (chooserDialog, s)
static GSwitchItXkbConfig initialConfig;
char *
@ -50,67 +52,22 @@ xci_desc_to_utf8 (XklConfigItem * ci)
g_locale_to_utf8 (sd, -1, NULL, NULL, NULL);
}
static GConfValue *
model_from_widget (GConfPropertyEditor * peditor, GConfValue * value)
{
GConfValue *new_value = gconf_value_new (GCONF_VALUE_STRING);
const char *rvs = "";
if (value->type == GCONF_VALUE_INT)
{
GtkWidget *omenu =
GTK_WIDGET (gconf_property_editor_get_ui_control (peditor));
const int ivalue = gconf_value_get_int (value);
GtkWidget *menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu));
GList *items = GTK_MENU_SHELL (menu)->children;
while (items != NULL)
{
GtkWidget *item = GTK_WIDGET (items->data);
const int itemNo =
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "itemNo"));
if (itemNo == ivalue)
{
rvs = (const char *)
g_object_get_data (G_OBJECT (item), "itemId");
break;
}
items = items->next;
}
}
gconf_value_set_string (new_value, rvs);
return new_value;
}
static GConfValue *
model_to_widget (GConfPropertyEditor * peditor, GConfValue * value)
{
GConfValue *new_value;
int rvi = -1;
new_value = gconf_value_new (GCONF_VALUE_INT);
new_value = gconf_value_new (GCONF_VALUE_STRING);
if (value->type == GCONF_VALUE_STRING)
{
GtkWidget *omenu =
GTK_WIDGET (gconf_property_editor_get_ui_control (peditor));
const char *svalue = gconf_value_get_string (value);
GtkWidget *menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu));
GList *items = GTK_MENU_SHELL (menu)->children;
while (items != NULL)
{
GtkWidget *item = GTK_WIDGET (items->data);
const char *itemId = (const char *)
g_object_get_data (G_OBJECT (item), "itemId");
if (!g_strcasecmp (itemId, svalue))
{
rvi =
GPOINTER_TO_INT (g_object_get_data
(G_OBJECT (item), "itemNo"));
break;
}
items = items->next;
}
XklConfigItem ci;
g_snprintf( ci.name, sizeof (ci.name), "%s", gconf_value_get_string( value ) );
if ( XklConfigFindModel( &ci ) )
gconf_value_set_string( new_value, ci.description );
else
gconf_value_set_string( new_value, _("Unknown") );
}
gconf_value_set_int (new_value, rvi);
return new_value;
}
@ -124,54 +81,6 @@ cleanup_xkb_tabs (GladeXML * dialog)
XklTerm ();
}
static void
add_model_to_option_menu (const XklConfigItemPtr configItem, GtkWidget * menu)
{
GList *existingItemNode = GTK_MENU_SHELL (menu)->children;
char *utfModelName = xci_desc_to_utf8 (configItem);
GtkWidget *menuItem = gtk_menu_item_new_with_label (utfModelName);
int position = 0;
g_object_set_data_full (G_OBJECT (menuItem), "itemId",
g_strdup (configItem->name),
(GDestroyNotify) g_free);
for (; existingItemNode != NULL;
position++, existingItemNode = existingItemNode->next)
{
GtkWidget *menuItem = GTK_WIDGET (existingItemNode->data);
GtkWidget *lbl = GTK_BIN (menuItem)->child;
const char *txt = gtk_label_get_text (GTK_LABEL (lbl));
if (g_utf8_collate (txt, utfModelName) > 0)
break;
}
g_free (utfModelName);
gtk_menu_shell_insert (GTK_MENU_SHELL (menu),
GTK_WIDGET (menuItem), position);
}
static void
fill_models_option_menu (GladeXML * dialog)
{
GtkWidget *menu = gtk_menu_new ();
int itemCounter = 0;
GList *items;
XklConfigEnumModels ((ConfigItemProcessFunc)
add_model_to_option_menu, menu);
items = GTK_MENU_SHELL (menu)->children;
while (items != NULL)
{
GtkWidget *menuItem = GTK_WIDGET (items->data);
g_object_set_data (G_OBJECT (menuItem), "itemNo",
GINT_TO_POINTER (itemCounter++));
items = items->next;
}
gtk_option_menu_set_menu (GTK_OPTION_MENU (WID ("xkb_models")),
GTK_WIDGET (menu));
gtk_widget_show_all (menu);
}
static void
reset_to_defaults (GtkWidget * button, GladeXML * dialog)
{
@ -197,13 +106,12 @@ setup_xkb_tabs (GladeXML * dialog, GConfChangeSet * changeset)
XklConfigInit ();
XklConfigLoadRegistry ();
fill_models_option_menu (dialog);
// fill_models_option_menu (dialog);
gconf_peditor_new_select_menu
gconf_peditor_new_string
(changeset, (gchar *) GSWITCHIT_CONFIG_XKB_KEY_MODEL,
WID ("xkb_models"),
"conv-to-widget-cb", model_to_widget,
"conv-from-widget-cb", model_from_widget, NULL);
WID ("xkb_model"),
"conv-to-widget-cb", model_to_widget, NULL);
fill_available_layouts_tree (dialog);
fill_available_options_tree (dialog);
@ -217,6 +125,9 @@ setup_xkb_tabs (GladeXML * dialog, GConfChangeSet * changeset)
g_signal_connect (G_OBJECT (WID ("xkb_reset_to_defaults")), "clicked",
G_CALLBACK (reset_to_defaults), dialog);
g_signal_connect_swapped (G_OBJECT (WID ("xkb_model_pick")), "clicked",
G_CALLBACK (choose_model), dialog);
register_layouts_gconf_listener (dialog);
register_options_gconf_listener (dialog);