void
xkb_layout_preview_update (GladeXML * chooser_dialog)
{
#ifdef HAVE_X11_EXTENSIONS_XKB_H
	GtkWidget *chooser = CWID ("xkb_layout_chooser");
	GtkWidget *kbdraw =
	    GTK_WIDGET (g_object_get_data (G_OBJECT (chooser), "kbdraw"));
	gchar *id = xkb_layout_chooser_get_selected_id (chooser_dialog);
	xkb_layout_preview_set_drawing_layout (kbdraw, id);
	g_free (id);
#endif
}
void
xkb_layout_chooser_response (GtkDialog * dialog, gint response)
{
	switch (response)
	case GTK_RESPONSE_OK:{
			/* Handled by the main code */
			break;
	case RESPONSE_PREVIEW:{
				gchar *selected_id = (gchar *)
				    xkb_layout_chooser_get_selected_id
				    (dialog);

				if (selected_id != NULL) {
					if (preview_dialog == NULL) {
						preview_dialog =
						    gkbd_keyboard_drawing_dialog_new
						    ();
						g_signal_connect (G_OBJECT
								  (preview_dialog),
								  "destroy",
								  G_CALLBACK
								  (xkb_preview_destroy_callback),
								  NULL);
						/* Put into the separate group to avoid conflict
						   with modal parent */
						gtk_window_group_add_window
						    (gtk_window_group_new
						     (),
						     GTK_WINDOW
						     (preview_dialog));
					};
					gkbd_keyboard_drawing_dialog_set_layout
					    (preview_dialog,
					     config_registry, selected_id);

					gtk_widget_show_all
					    (preview_dialog);
				}
			}

			return;
		}
	if (preview_dialog != NULL) {
		gtk_widget_destroy (preview_dialog);
	}
	if (search_pattern_list != NULL) {
		g_strfreev (search_pattern_list);
		search_pattern_list = NULL;
	}
	gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void
xkb_layout_chooser_print (GtkBuilder * chooser_dialog)
{
	GtkWidget *chooser = CWID ("xkb_layout_chooser");
	GtkWidget *kbdraw =
	    GTK_WIDGET (g_object_get_data (G_OBJECT (chooser), "kbdraw"));
	const char *id =
	    xkb_layout_chooser_get_selected_id (chooser_dialog);
	char *descr = xkb_layout_description_utf8 (id);
	matekbd_keyboard_drawing_print (MATEKBD_KEYBOARD_DRAWING
				     (kbdraw),
				     GTK_WINDOW (CWID
						 ("xkb_layout_chooser")),
				     descr);
	g_free (descr);
}
static gboolean
xkb_layout_chooser_selection_dupe (GtkDialog * dialog)
{
	gchar *selected_id =
	    (gchar *) xkb_layout_chooser_get_selected_id (dialog);
	gchar **layouts_list, **pl;
	gboolean rv = FALSE;
	if (selected_id == NULL)
		return rv;
	layouts_list = pl = xkb_layouts_get_selected_list ();
	while (pl && *pl) {
		if (!g_ascii_strcasecmp (*pl++, selected_id)) {
			rv = TRUE;
			break;
		}
	}
	g_strfreev (layouts_list);
	return rv;
}
static void
xkb_layout_chooser_response (GtkDialog * dialog,
			     gint response, GtkBuilder * chooser_dialog)
{
	GdkRectangle rect;

	if (response == GTK_RESPONSE_OK) {
		gchar *selected_id = (gchar *)
		    xkb_layout_chooser_get_selected_id (chooser_dialog);

		if (selected_id != NULL) {
			GSList *layouts_list =
			    xkb_layouts_get_selected_list ();

			selected_id = g_strdup (selected_id);

			layouts_list =
			    g_slist_append (layouts_list, selected_id);
			xkb_layouts_set_selected_list (layouts_list);

			xkl_layout_chooser_add_default_switcher_if_necessary
			    (layouts_list);

			clear_xkb_elements_list (layouts_list);
		}
	} else if (response == gtk_dialog_get_response_for_widget
		   (dialog, CWID ("btnPrint"))) {
		xkb_layout_chooser_print (chooser_dialog);
		g_signal_stop_emission_by_name (dialog, "response");
		return;
	}

	gtk_window_get_position (GTK_WINDOW (dialog), &rect.x, &rect.y);
	gtk_window_get_size (GTK_WINDOW (dialog), &rect.width,
			     &rect.height);
	matekbd_preview_save_position (&rect);
}
static void
chooser_response (GtkDialog  *chooser,
		  int         response_id,
		  GtkBuilder *dialog)
{
	if (response_id == GTK_RESPONSE_OK) {
		char *id, *name;
		GtkListStore *list_store;

		list_store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (WID ("xkb_layouts_selected"))));
		id = xkb_layout_chooser_get_selected_id (chooser);
		name = xkb_layout_description_utf8 (id);
		gtk_list_store_insert_with_values (list_store, NULL, G_MAXINT,
						   SEL_LAYOUT_TREE_COL_DESCRIPTION, name,
						   SEL_LAYOUT_TREE_COL_ID, id,
						   SEL_LAYOUT_TREE_COL_ENABLED, TRUE,
						   -1);
		g_free (name);
		add_default_switcher_if_necessary ();
		update_layouts_list (GTK_TREE_MODEL (list_store), dialog);
	}

	xkb_layout_chooser_response (chooser, response_id);
}