@@ -89,38 +89,46 @@ void KeyboardLayoutsModel::buildModel()
8989{
9090 beginResetModel();
9191
92+
93+ GList *sources, *tmp;
94+ const gchar *display_name;
95+ const gchar *short_name;
96+ const gchar *xkb_layout;
97+ const gchar *xkb_variant;
98+
9299 if (m_language.isEmpty()) {
93− GList *sources, *tmp;
94− const gchar *display_name;
95− const gchar *short_name;
96− const gchar *xkb_layout;
97− const gchar *xkb_variant;
98100 sources = gnome_xkb_info_get_all_layouts(m_xkbInfo);
101+ } else {
102+ sources = gnome_xkb_info_get_layouts_for_language(m_xkbInfo, m_language.toUtf8().constData());
103+ }
99104
100− m_layouts.clear();
101− m_layouts.reserve(g_list_length(sources));
105+ m_layouts.clear();
106+ m_layouts.reserve(g_list_length(sources));
102107
103− for (tmp = sources; tmp != NULL; tmp = tmp->next) {
104− gnome_xkb_info_get_layout_info(m_xkbInfo, (const gchar *)tmp->data,
105− &display_name, &short_name, &xkb_layout, &xkb_variant);
108+ qDebug() << "!!! Got" << m_layouts.count() << "layouts";
106109
107− KeyboardLayoutInfo layout;
108− layout.id = QString::fromUtf8((const gchar *)tmp->data);
109− layout.shortName = QString::fromUtf8(short_name);
110− layout.displayName = QString::fromUtf8(display_name);
111− layout.layoutAndVariant = QString::fromUtf8(g_strconcat(xkb_layout, "+", xkb_variant, NULL));
110+ for (tmp = sources; tmp != NULL; tmp = tmp->next) {
111+ gboolean result = gnome_xkb_info_get_layout_info(m_xkbInfo, (const gchar *)tmp->data,
112+ &display_name, &short_name, &xkb_layout, &xkb_variant);
113+ if (!result) {
114+ qWarning() << "!!! Skipping invalid layout";
115+ continue;
116+ }
112117
113− if (!layout.shortName.isEmpty()) {
114− qDebug() << "Appending layout with id:" << layout.id;
115− m_layouts.append(layout);
116− }
118+ KeyboardLayoutInfo layout;
119+ layout.id = QString::fromUtf8((const gchar *)tmp->data);
120+ layout.shortName = QString::fromUtf8(short_name);
121+ layout.displayName = QString::fromUtf8(display_name);
122+ layout.layoutAndVariant = QString::fromUtf8(g_strconcat(xkb_layout, "+", xkb_variant, NULL));
117123
124+ if (!layout.shortName.isEmpty()) {
125+ qDebug() << "!!! Appending layout with id:" << layout.id;
126+ m_layouts.append(layout);
118127 }
119− g_list_free(sources);
120− std::sort(m_layouts.begin(), m_layouts.end(), compareLayouts);
121− } else {
122− // TODO
128+
123129 }
130+ g_list_free(sources);
131+ std::sort(m_layouts.begin(), m_layouts.end(), compareLayouts);
124132
125133 endResetModel();
126134}