Merge branch 'remove-unused-sources' into 'master'
Remove unlisted files See merge request Librem5/squeekboard!38
This commit is contained in:
		@ -1,320 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#endif  /* HAVE_CONFIG_H */
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#ifdef HAVE_ATSPI
 | 
			
		||||
#include <dbus/dbus.h>
 | 
			
		||||
#include <atspi/atspi.h>
 | 
			
		||||
#endif  /* HAVE_ATSPI */
 | 
			
		||||
#ifdef HAVE_IBUS
 | 
			
		||||
#include <ibus.h>
 | 
			
		||||
#endif  /* HAVE_IBUS */
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include <glib/gi18n.h>
 | 
			
		||||
#include "eekboard/eekboard-client.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
static gboolean opt_system = FALSE;
 | 
			
		||||
static gboolean opt_session = FALSE;
 | 
			
		||||
static gchar *opt_address = NULL;
 | 
			
		||||
 | 
			
		||||
static gboolean opt_focus = FALSE;
 | 
			
		||||
#ifdef HAVE_ATSPI
 | 
			
		||||
static gboolean opt_keystroke = FALSE;
 | 
			
		||||
#endif  /* HAVE_ATSPI */
 | 
			
		||||
 | 
			
		||||
static gchar *opt_keyboards = NULL;
 | 
			
		||||
 | 
			
		||||
static gboolean opt_fullscreen = FALSE;
 | 
			
		||||
 | 
			
		||||
static const GOptionEntry options[] = {
 | 
			
		||||
    {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system,
 | 
			
		||||
     N_("Connect to the system bus")},
 | 
			
		||||
    {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session,
 | 
			
		||||
     N_("Connect to the session bus")},
 | 
			
		||||
    {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address,
 | 
			
		||||
     N_("Connect to the given D-Bus address")},
 | 
			
		||||
#if ENABLE_FOCUS_LISTENER
 | 
			
		||||
    {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
 | 
			
		||||
     N_("Listen focus change events")},
 | 
			
		||||
#endif  /* ENABLE_FOCUS_LISTENER */
 | 
			
		||||
#ifdef HAVE_ATSPI
 | 
			
		||||
    {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
 | 
			
		||||
     N_("Listen keystroke events with AT-SPI")},
 | 
			
		||||
#endif  /* HAVE_ATSPI */
 | 
			
		||||
    {"keyboards", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboards,
 | 
			
		||||
     N_("Specify keyboards (comma separated)")},
 | 
			
		||||
    {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen,
 | 
			
		||||
     N_("Create window in fullscreen mode")},
 | 
			
		||||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_context_destroyed (EekboardContext *context,
 | 
			
		||||
                      gpointer         user_data)
 | 
			
		||||
{
 | 
			
		||||
    gtk_main_quit ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_destroyed (EekboardClient *eekboard,
 | 
			
		||||
              gpointer          user_data)
 | 
			
		||||
{
 | 
			
		||||
    gtk_main_quit ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum FocusListenerType {
 | 
			
		||||
    FOCUS_NONE,
 | 
			
		||||
    FOCUS_ATSPI,
 | 
			
		||||
    FOCUS_IBUS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
set_keyboards (SeatEmitter              *client,
 | 
			
		||||
               const gchar * const *keyboards)
 | 
			
		||||
{
 | 
			
		||||
    if (g_strv_length ((gchar **)keyboards) == 0) {
 | 
			
		||||
        if (!client_enable_xkl (client)) {
 | 
			
		||||
            g_printerr ("Can't register xklavier event listeners\n");
 | 
			
		||||
            return FALSE;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        if (!client_set_keyboards (client, keyboards)) {
 | 
			
		||||
            gchar *str = g_strjoinv (", ", (gchar **)keyboards);
 | 
			
		||||
            g_printerr ("Can't set keyboards \"%s\"\n", str);
 | 
			
		||||
            g_free (str);
 | 
			
		||||
            return FALSE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    SeatEmitter *client = NULL;
 | 
			
		||||
    EekboardClient *eekboard;
 | 
			
		||||
    EekboardContext *context;
 | 
			
		||||
    GBusType bus_type;
 | 
			
		||||
    GDBusConnection *connection;
 | 
			
		||||
    GError *error;
 | 
			
		||||
    GOptionContext *option_context;
 | 
			
		||||
    gint focus;
 | 
			
		||||
    GSettings *settings = NULL;
 | 
			
		||||
    gchar **keyboards = NULL;
 | 
			
		||||
    gint retval = 0;
 | 
			
		||||
 | 
			
		||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
			
		||||
        g_printerr ("Can't init GTK\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    eek_init ();
 | 
			
		||||
 | 
			
		||||
    option_context = g_option_context_new ("eekboard-desktop-client");
 | 
			
		||||
    g_option_context_add_main_entries (option_context, options, NULL);
 | 
			
		||||
    g_option_context_parse (option_context, &argc, &argv, NULL);
 | 
			
		||||
    g_option_context_free (option_context);
 | 
			
		||||
 | 
			
		||||
    if (opt_system)
 | 
			
		||||
        bus_type = G_BUS_TYPE_SYSTEM;
 | 
			
		||||
    else if (opt_address)
 | 
			
		||||
        bus_type = G_BUS_TYPE_NONE;
 | 
			
		||||
    else
 | 
			
		||||
        bus_type = G_BUS_TYPE_SESSION;
 | 
			
		||||
 | 
			
		||||
    switch (bus_type) {
 | 
			
		||||
    case G_BUS_TYPE_SYSTEM:
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
 | 
			
		||||
        if (connection == NULL) {
 | 
			
		||||
            g_printerr ("Can't connect to the system bus: %s\n",
 | 
			
		||||
                        error->message);
 | 
			
		||||
            g_error_free (error);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case G_BUS_TYPE_SESSION:
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
 | 
			
		||||
        if (connection == NULL) {
 | 
			
		||||
            g_printerr ("Can't connect to the session bus: %s\n",
 | 
			
		||||
                        error->message);
 | 
			
		||||
            g_error_free (error);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case G_BUS_TYPE_NONE:
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        connection = g_dbus_connection_new_for_address_sync (opt_address,
 | 
			
		||||
                                                             0,
 | 
			
		||||
                                                             NULL,
 | 
			
		||||
                                                             NULL,
 | 
			
		||||
                                                             &error);
 | 
			
		||||
        if (connection == NULL) {
 | 
			
		||||
            g_printerr ("Can't connect to the bus at %s: %s\n",
 | 
			
		||||
                        opt_address,
 | 
			
		||||
                        error->message);
 | 
			
		||||
            g_error_free (error);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_assert_not_reached ();
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    client = client_new (connection);
 | 
			
		||||
    g_object_unref (connection);
 | 
			
		||||
 | 
			
		||||
    if (client == NULL) {
 | 
			
		||||
        g_printerr ("Can't create a client\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
			
		||||
    focus = FOCUS_NONE;
 | 
			
		||||
    if (opt_focus) {
 | 
			
		||||
        gchar *focus_listener = g_settings_get_string (settings,
 | 
			
		||||
                                                       "focus-listener");
 | 
			
		||||
        const struct {
 | 
			
		||||
            const gchar *name;
 | 
			
		||||
            enum FocusListenerType type;
 | 
			
		||||
        } focus_listeners[] = {
 | 
			
		||||
#ifdef HAVE_ATSPI
 | 
			
		||||
            { "atspi", FOCUS_ATSPI },
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef HAVE_IBUS
 | 
			
		||||
            { "ibus", FOCUS_IBUS },
 | 
			
		||||
#endif
 | 
			
		||||
            { NULL }
 | 
			
		||||
        };
 | 
			
		||||
        gint i;
 | 
			
		||||
 | 
			
		||||
        focus = FOCUS_NONE;
 | 
			
		||||
        for (i = 0; focus_listeners[i].name; i++) {
 | 
			
		||||
            if (g_strcmp0 (focus_listener, focus_listeners[i].name) == 0)
 | 
			
		||||
                focus = focus_listeners[i].type;
 | 
			
		||||
        }
 | 
			
		||||
        if (focus == FOCUS_NONE) {
 | 
			
		||||
            g_printerr ("Unknown focus listener \"%s\".  "
 | 
			
		||||
                        "Try \"atspi\" or \"ibus\"\n", focus_listener);
 | 
			
		||||
            retval = 1;
 | 
			
		||||
            goto out;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
        
 | 
			
		||||
#ifdef HAVE_ATSPI
 | 
			
		||||
    if (focus == FOCUS_ATSPI || opt_keystroke) {
 | 
			
		||||
        GSettings *desktop_settings =
 | 
			
		||||
            g_settings_new ("org.gnome.desktop.interface");
 | 
			
		||||
        gboolean accessibility_enabled =
 | 
			
		||||
            g_settings_get_boolean (desktop_settings, "toolkit-accessibility");
 | 
			
		||||
        g_object_unref (desktop_settings);
 | 
			
		||||
 | 
			
		||||
        if (accessibility_enabled) {
 | 
			
		||||
            if (atspi_init () != 0) {
 | 
			
		||||
                g_printerr ("Can't init AT-SPI 2\n");
 | 
			
		||||
                retval = 1;
 | 
			
		||||
                goto out;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (focus == FOCUS_ATSPI &&
 | 
			
		||||
                !client_enable_atspi_focus (client)) {
 | 
			
		||||
                g_printerr ("Can't register AT-SPI focus change event listeners\n");
 | 
			
		||||
                retval = 1;
 | 
			
		||||
                goto out;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (opt_keystroke &&
 | 
			
		||||
                !client_enable_atspi_keystroke (client)) {
 | 
			
		||||
                g_printerr ("Can't register AT-SPI keystroke event listeners\n");
 | 
			
		||||
                retval = 1;
 | 
			
		||||
                goto out;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            g_printerr ("Desktop accessibility support is disabled\n");
 | 
			
		||||
            retval = 1;
 | 
			
		||||
            goto out;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_ATSPI */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_IBUS
 | 
			
		||||
    if (focus == FOCUS_IBUS) {
 | 
			
		||||
        ibus_init ();
 | 
			
		||||
 | 
			
		||||
        if (!client_enable_ibus_focus (client)) {
 | 
			
		||||
            g_printerr ("Can't register IBus focus change event listeners\n");
 | 
			
		||||
            retval = 1;
 | 
			
		||||
            goto out;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_IBUS */
 | 
			
		||||
 | 
			
		||||
//#ifdef HAVE_XTEST
 | 
			
		||||
    if (!client_enable_xtest (client)) {
 | 
			
		||||
        g_printerr ("Can't init xtest\n");
 | 
			
		||||
        g_object_unref (client);
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
//#endif  /* HAVE_XTEST */
 | 
			
		||||
 | 
			
		||||
    if (!opt_focus) {
 | 
			
		||||
        g_object_get (client, "context", &context, NULL);
 | 
			
		||||
        g_signal_connect (context, "destroyed",
 | 
			
		||||
                          G_CALLBACK(on_context_destroyed), NULL);
 | 
			
		||||
        g_object_unref (context);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_fullscreen ||
 | 
			
		||||
        g_settings_get_boolean (settings, "start-fullscreen")) {
 | 
			
		||||
        g_object_get (client, "context", &context, NULL);
 | 
			
		||||
        eekboard_context_set_fullscreen (context, TRUE, NULL);
 | 
			
		||||
        g_object_unref (context);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    g_object_get (client, "eekboard", &eekboard, NULL);
 | 
			
		||||
    g_signal_connect (eekboard, "destroyed",
 | 
			
		||||
                      G_CALLBACK(on_destroyed), NULL);
 | 
			
		||||
    g_object_unref (eekboard);
 | 
			
		||||
    
 | 
			
		||||
    if (opt_keyboards != NULL) {
 | 
			
		||||
        keyboards = g_strsplit (opt_keyboards, ",", -1);
 | 
			
		||||
 | 
			
		||||
        if (!set_keyboards (client, (const gchar * const *)keyboards)) {
 | 
			
		||||
            g_strfreev (keyboards);
 | 
			
		||||
            retval = 1;
 | 
			
		||||
            goto out;
 | 
			
		||||
        }
 | 
			
		||||
        g_strfreev (keyboards);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gtk_main ();
 | 
			
		||||
 | 
			
		||||
 out:
 | 
			
		||||
    if (client)
 | 
			
		||||
        g_object_unref (client);
 | 
			
		||||
    if (settings)
 | 
			
		||||
        g_object_unref (settings);
 | 
			
		||||
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1166
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										1166
									
								
								src/client.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										55
									
								
								src/client.h
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/client.h
									
									
									
									
									
								
							@ -1,55 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef CLIENT_H
 | 
			
		||||
#define CLIENT_H 1
 | 
			
		||||
 | 
			
		||||
#include <gio/gio.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define TYPE_CLIENT (client_get_type())
 | 
			
		||||
#define CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CLIENT, Client))
 | 
			
		||||
#define CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CLIENT, ClientClass))
 | 
			
		||||
#define IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CLIENT))
 | 
			
		||||
#define IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CLIENT))
 | 
			
		||||
#define CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CLIENT, ClientClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _Client SeatEmitter;
 | 
			
		||||
 | 
			
		||||
SeatEmitter  *client_new                     (GDBusConnection     *connection);
 | 
			
		||||
 | 
			
		||||
gboolean client_set_keyboards           (SeatEmitter              *client,
 | 
			
		||||
                                         const gchar * const *keyboard);
 | 
			
		||||
 | 
			
		||||
gboolean client_enable_xkl              (SeatEmitter              *client);
 | 
			
		||||
void     client_disable_xkl             (SeatEmitter              *client);
 | 
			
		||||
 | 
			
		||||
gboolean client_enable_atspi_focus      (SeatEmitter              *client);
 | 
			
		||||
void     client_disable_atspi_focus     (SeatEmitter              *client);
 | 
			
		||||
 | 
			
		||||
gboolean client_enable_atspi_keystroke  (SeatEmitter              *client);
 | 
			
		||||
void     client_disable_atspi_keystroke (SeatEmitter              *client);
 | 
			
		||||
 | 
			
		||||
gboolean client_enable_xtest            (SeatEmitter              *client);
 | 
			
		||||
void     client_disable_xtest           (SeatEmitter              *client);
 | 
			
		||||
 | 
			
		||||
gboolean client_enable_ibus_focus       (SeatEmitter              *client);
 | 
			
		||||
void     client_disable_ibus_focus      (SeatEmitter              *client);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif  /* CLIENT_H */
 | 
			
		||||
@ -1,415 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#endif  /* HAVE_CONFIG_H */
 | 
			
		||||
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include "preferences-dialog.h"
 | 
			
		||||
#include <eek/eek.h>
 | 
			
		||||
 | 
			
		||||
struct _PreferencesDialog {
 | 
			
		||||
    GtkWidget *dialog;
 | 
			
		||||
    GtkWidget *repeat_toggle;
 | 
			
		||||
    GtkWidget *repeat_delay_scale;
 | 
			
		||||
    GtkWidget *repeat_speed_scale;
 | 
			
		||||
    GtkWidget *auto_hide_toggle;
 | 
			
		||||
    GtkWidget *auto_hide_delay_scale;
 | 
			
		||||
    GtkWidget *selected_keyboards_treeview;
 | 
			
		||||
    GtkWidget *up_button;
 | 
			
		||||
    GtkWidget *down_button;
 | 
			
		||||
    GtkWidget *add_button;
 | 
			
		||||
    GtkWidget *remove_button;
 | 
			
		||||
 | 
			
		||||
    GtkWidget *new_keyboard_dialog;
 | 
			
		||||
    GtkWidget *available_keyboards_treeview;
 | 
			
		||||
 | 
			
		||||
    GList *available_keyboards;
 | 
			
		||||
    GSettings *settings;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
get_rate (GValue   *value,
 | 
			
		||||
          GVariant *variant,
 | 
			
		||||
          gpointer  user_data)
 | 
			
		||||
{
 | 
			
		||||
    int rate;
 | 
			
		||||
    gdouble fraction;
 | 
			
		||||
 | 
			
		||||
    rate = g_variant_get_uint32 (variant);
 | 
			
		||||
    fraction = 1.0 / ((gdouble) rate / 1000.0);
 | 
			
		||||
    g_value_set_double (value, fraction);
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GVariant *
 | 
			
		||||
set_rate (const GValue       *value,
 | 
			
		||||
          const GVariantType *expected_type,
 | 
			
		||||
          gpointer            user_data)
 | 
			
		||||
{
 | 
			
		||||
    gdouble rate;
 | 
			
		||||
    int msecs;
 | 
			
		||||
 | 
			
		||||
    rate = g_value_get_double (value);
 | 
			
		||||
    msecs = (1 / rate) * 1000;
 | 
			
		||||
    return g_variant_new_uint32 (msecs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
add_keyboard_to_treeview (GtkTreeView *treeview,
 | 
			
		||||
                          const gchar *id,
 | 
			
		||||
                          const gchar *longname)
 | 
			
		||||
{
 | 
			
		||||
    GtkTreeModel *model = gtk_tree_view_get_model (treeview);
 | 
			
		||||
    GtkTreeIter iter;
 | 
			
		||||
 | 
			
		||||
    if (gtk_tree_model_get_iter_first (model, &iter)) {
 | 
			
		||||
        do {
 | 
			
		||||
            gchar *_id;
 | 
			
		||||
            gtk_tree_model_get (model, &iter, 0, &_id, -1);
 | 
			
		||||
            if (g_strcmp0 (id, _id) == 0) {
 | 
			
		||||
                g_free (_id);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            g_free (_id);
 | 
			
		||||
        } while (gtk_tree_model_iter_next (model, &iter));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gtk_list_store_append (GTK_LIST_STORE(model),
 | 
			
		||||
                           &iter);
 | 
			
		||||
    gtk_list_store_set (GTK_LIST_STORE(model),
 | 
			
		||||
                        &iter,
 | 
			
		||||
                        0, id,
 | 
			
		||||
                        1, longname,
 | 
			
		||||
                        -1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
add_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    gint retval = gtk_dialog_run (GTK_DIALOG(dialog->new_keyboard_dialog));
 | 
			
		||||
    if (retval == GTK_RESPONSE_OK) {
 | 
			
		||||
        GtkTreeSelection *selection;
 | 
			
		||||
        GtkTreeModel *model;
 | 
			
		||||
        GList *rows, *p;
 | 
			
		||||
 | 
			
		||||
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->available_keyboards_treeview));
 | 
			
		||||
        rows = gtk_tree_selection_get_selected_rows (selection, &model);
 | 
			
		||||
        for (p = rows; p; p = p->next) {
 | 
			
		||||
            GtkTreeIter iter;
 | 
			
		||||
            if (gtk_tree_model_get_iter (model, &iter, p->data)) {
 | 
			
		||||
                gchar *id, *longname;
 | 
			
		||||
                gtk_tree_model_get (model, &iter, 0, &id, 1, &longname, -1);
 | 
			
		||||
                add_keyboard_to_treeview (GTK_TREE_VIEW(dialog->selected_keyboards_treeview),
 | 
			
		||||
                                          id,
 | 
			
		||||
                                          longname);
 | 
			
		||||
                g_free (id);
 | 
			
		||||
                g_free (longname);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    gtk_widget_hide (dialog->new_keyboard_dialog);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
remove_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    GtkTreeSelection *selection;
 | 
			
		||||
    GtkTreeModel *model;
 | 
			
		||||
    GList *rows, *p;
 | 
			
		||||
 | 
			
		||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
			
		||||
    rows = gtk_tree_selection_get_selected_rows (selection, &model);
 | 
			
		||||
    for (p = rows; p; p = p->next) {
 | 
			
		||||
        GtkTreeIter iter;
 | 
			
		||||
        if (gtk_tree_model_get_iter (model, &iter, p->data))
 | 
			
		||||
            gtk_list_store_remove (GTK_LIST_STORE(model), &iter);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
up_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    GtkTreeSelection *selection;
 | 
			
		||||
    GtkTreeModel *model;
 | 
			
		||||
    GtkTreeIter iter;
 | 
			
		||||
 | 
			
		||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
			
		||||
    if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 | 
			
		||||
        GtkTreeIter prev = iter;
 | 
			
		||||
        if (gtk_tree_model_iter_previous (model, &prev))
 | 
			
		||||
            gtk_list_store_swap (GTK_LIST_STORE(model), &iter, &prev);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
down_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    GtkTreeSelection *selection;
 | 
			
		||||
    GtkTreeModel *model;
 | 
			
		||||
    GtkTreeIter iter;
 | 
			
		||||
 | 
			
		||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
			
		||||
    if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 | 
			
		||||
        GtkTreeIter next = iter;
 | 
			
		||||
        if (gtk_tree_model_iter_next (model, &next))
 | 
			
		||||
            gtk_list_store_swap (GTK_LIST_STORE(model), &iter, &next);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
selection_changed_cb (GtkTreeSelection *selection, PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    gint count = gtk_tree_selection_count_selected_rows (selection);
 | 
			
		||||
    if (count > 0) {
 | 
			
		||||
        gtk_widget_set_sensitive (dialog->remove_button, TRUE);
 | 
			
		||||
        gtk_widget_set_sensitive (dialog->up_button, TRUE);
 | 
			
		||||
        gtk_widget_set_sensitive (dialog->down_button, TRUE);
 | 
			
		||||
    } else {
 | 
			
		||||
        gtk_widget_set_sensitive (dialog->remove_button, FALSE);
 | 
			
		||||
        gtk_widget_set_sensitive (dialog->up_button, FALSE);
 | 
			
		||||
        gtk_widget_set_sensitive (dialog->down_button, FALSE);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gint
 | 
			
		||||
compare_keyboard_id (const EekXmlKeyboardDesc *desc, const char *id)
 | 
			
		||||
{
 | 
			
		||||
    return g_strcmp0 (desc->id, id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
populate_selected_keyboards (PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    gchar **strv, **p;
 | 
			
		||||
 | 
			
		||||
    strv = g_settings_get_strv (dialog->settings, "keyboards");
 | 
			
		||||
    for (p = strv; *p != NULL; p++) {
 | 
			
		||||
        GList *head = g_list_find_custom (dialog->available_keyboards,
 | 
			
		||||
                                            *p,
 | 
			
		||||
                                            (GCompareFunc) compare_keyboard_id);
 | 
			
		||||
        if (head == NULL) {
 | 
			
		||||
            g_warning ("unknown keyboard %s", *p);
 | 
			
		||||
        } else {
 | 
			
		||||
            EekXmlKeyboardDesc *desc = head->data;
 | 
			
		||||
            add_keyboard_to_treeview (GTK_TREE_VIEW(dialog->selected_keyboards_treeview),
 | 
			
		||||
                                      desc->id,
 | 
			
		||||
                                      desc->longname);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    g_strfreev (strv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
populate_available_keyboards (PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    GList *p;
 | 
			
		||||
 | 
			
		||||
    for (p = dialog->available_keyboards; p; p = p->next) {
 | 
			
		||||
        EekXmlKeyboardDesc *desc = p->data;
 | 
			
		||||
        add_keyboard_to_treeview (GTK_TREE_VIEW(dialog->available_keyboards_treeview),
 | 
			
		||||
                                  desc->id,
 | 
			
		||||
                                  desc->longname);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
save_keyboards (PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    GtkTreeModel *model;
 | 
			
		||||
    GtkTreeIter iter;
 | 
			
		||||
    GList *list = NULL, *head;
 | 
			
		||||
    gchar **strv, **p;
 | 
			
		||||
 | 
			
		||||
    model = gtk_tree_view_get_model (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
			
		||||
    if (gtk_tree_model_get_iter_first (model, &iter)) {
 | 
			
		||||
        do {
 | 
			
		||||
            gchar *id;
 | 
			
		||||
            gtk_tree_model_get (model, &iter, 0, &id, -1);
 | 
			
		||||
            list = g_list_prepend (list, id);
 | 
			
		||||
        } while (gtk_tree_model_iter_next (model, &iter));
 | 
			
		||||
    }
 | 
			
		||||
    list = g_list_reverse (list);
 | 
			
		||||
 | 
			
		||||
    strv = g_new0 (gchar *, g_list_length (list) + 1);
 | 
			
		||||
    for (head = list, p = strv; head; head = head->next, p++) {
 | 
			
		||||
        *p = head->data;
 | 
			
		||||
    }
 | 
			
		||||
    g_settings_set_strv (dialog->settings,
 | 
			
		||||
                         "keyboards",
 | 
			
		||||
                         (const gchar * const *)strv);
 | 
			
		||||
    g_strfreev (strv);
 | 
			
		||||
    g_list_free (list);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PreferencesDialog *
 | 
			
		||||
preferences_dialog_new (void)
 | 
			
		||||
{
 | 
			
		||||
    PreferencesDialog *dialog;
 | 
			
		||||
    gchar *ui_path;
 | 
			
		||||
    GtkBuilder *builder;
 | 
			
		||||
    GObject *object;
 | 
			
		||||
    GError *error;
 | 
			
		||||
    GtkListStore *store;
 | 
			
		||||
    GtkCellRenderer *renderer;
 | 
			
		||||
    GtkTreeViewColumn *column;
 | 
			
		||||
    GtkTreeSelection *selection;
 | 
			
		||||
 | 
			
		||||
    dialog = g_slice_new0 (PreferencesDialog);
 | 
			
		||||
    dialog->settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
			
		||||
 | 
			
		||||
    builder = gtk_builder_new ();
 | 
			
		||||
    gtk_builder_set_translation_domain (builder, "eekboard");
 | 
			
		||||
    ui_path = g_build_filename (PKGDATADIR,
 | 
			
		||||
                                "preferences-dialog.ui",
 | 
			
		||||
                                NULL);
 | 
			
		||||
    error = NULL;
 | 
			
		||||
    if (gtk_builder_add_from_file (builder, ui_path, &error) == 0) {
 | 
			
		||||
        g_warning ("can't load %s: %s", ui_path, error->message);
 | 
			
		||||
        g_error_free (error);
 | 
			
		||||
    }
 | 
			
		||||
    g_free (ui_path);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "dialog");
 | 
			
		||||
    dialog->dialog = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "repeat_toggle");
 | 
			
		||||
    dialog->repeat_toggle = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    g_settings_bind (dialog->settings, "repeat",
 | 
			
		||||
                     dialog->repeat_toggle, "active",
 | 
			
		||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "repeat_delay_scale");
 | 
			
		||||
    dialog->repeat_delay_scale = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    g_settings_bind (dialog->settings, "repeat-delay",
 | 
			
		||||
                     gtk_range_get_adjustment (GTK_RANGE (dialog->repeat_delay_scale)), "value",
 | 
			
		||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "repeat_speed_scale");
 | 
			
		||||
    dialog->repeat_speed_scale = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    g_settings_bind_with_mapping (dialog->settings, "repeat-interval",
 | 
			
		||||
                                  gtk_range_get_adjustment (GTK_RANGE (gtk_builder_get_object (builder, "repeat_speed_scale"))), "value",
 | 
			
		||||
                                  G_SETTINGS_BIND_DEFAULT,
 | 
			
		||||
                                  get_rate, set_rate, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "auto_hide_toggle");
 | 
			
		||||
    dialog->auto_hide_toggle = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    g_settings_bind (dialog->settings, "auto-hide",
 | 
			
		||||
                     dialog->auto_hide_toggle, "active",
 | 
			
		||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "auto_hide_delay_scale");
 | 
			
		||||
    dialog->auto_hide_delay_scale = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    g_settings_bind (dialog->settings, "auto-hide-delay",
 | 
			
		||||
                     gtk_range_get_adjustment (GTK_RANGE (dialog->auto_hide_delay_scale)), "value",
 | 
			
		||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder,
 | 
			
		||||
                                     "selected_keyboards_treeview");
 | 
			
		||||
    dialog->selected_keyboards_treeview = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object));
 | 
			
		||||
    g_signal_connect (G_OBJECT(selection), "changed",
 | 
			
		||||
                      G_CALLBACK(selection_changed_cb), dialog);
 | 
			
		||||
 | 
			
		||||
    renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new ());
 | 
			
		||||
    column = gtk_tree_view_column_new_with_attributes ("Keyboard",
 | 
			
		||||
                                                       renderer,
 | 
			
		||||
                                                       "text",
 | 
			
		||||
                                                       1,
 | 
			
		||||
                                                       NULL);
 | 
			
		||||
    gtk_tree_view_append_column (GTK_TREE_VIEW (object), column);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "up_button");
 | 
			
		||||
    dialog->up_button = GTK_WIDGET(object);
 | 
			
		||||
    g_signal_connect (object, "clicked",
 | 
			
		||||
                      G_CALLBACK(up_keyboard), dialog);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "down_button");
 | 
			
		||||
    dialog->down_button = GTK_WIDGET(object);
 | 
			
		||||
    g_signal_connect (object, "clicked",
 | 
			
		||||
                      G_CALLBACK(down_keyboard), dialog);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "add_button");
 | 
			
		||||
    dialog->add_button = GTK_WIDGET(object);
 | 
			
		||||
    g_signal_connect (object, "clicked",
 | 
			
		||||
                      G_CALLBACK(add_keyboard), dialog);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "remove_button");
 | 
			
		||||
    dialog->remove_button = GTK_WIDGET(object);
 | 
			
		||||
    g_signal_connect (object, "clicked",
 | 
			
		||||
                      G_CALLBACK(remove_keyboard), dialog);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder, "new_keyboard_dialog");
 | 
			
		||||
    dialog->new_keyboard_dialog = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder,
 | 
			
		||||
                                     "available_keyboards_treeview");
 | 
			
		||||
    dialog->available_keyboards_treeview = GTK_WIDGET(object);
 | 
			
		||||
 | 
			
		||||
    renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new ());
 | 
			
		||||
    column = gtk_tree_view_column_new_with_attributes ("Keyboard",
 | 
			
		||||
                                                       renderer,
 | 
			
		||||
                                                       "text",
 | 
			
		||||
                                                       1,
 | 
			
		||||
                                                       NULL);
 | 
			
		||||
    gtk_tree_view_append_column (GTK_TREE_VIEW (object), column);
 | 
			
		||||
 | 
			
		||||
    object = gtk_builder_get_object (builder,
 | 
			
		||||
                                     "available_keyboards_liststore");
 | 
			
		||||
    store = GTK_LIST_STORE(object);
 | 
			
		||||
 | 
			
		||||
    gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(store),
 | 
			
		||||
                                          1,
 | 
			
		||||
                                          GTK_SORT_ASCENDING);
 | 
			
		||||
 | 
			
		||||
    dialog->available_keyboards = eek_xml_list_keyboards ();
 | 
			
		||||
 | 
			
		||||
    populate_selected_keyboards (dialog);
 | 
			
		||||
    populate_available_keyboards (dialog);
 | 
			
		||||
 | 
			
		||||
    g_object_unref (builder);
 | 
			
		||||
 | 
			
		||||
    return dialog;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
preferences_dialog_run (PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    gtk_window_present (GTK_WINDOW(dialog->dialog));
 | 
			
		||||
    gtk_dialog_run (GTK_DIALOG(dialog->dialog));
 | 
			
		||||
    save_keyboards (dialog);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
preferences_dialog_free (PreferencesDialog *dialog)
 | 
			
		||||
{
 | 
			
		||||
    gtk_widget_destroy (dialog->dialog);
 | 
			
		||||
    // gtk_widget_destroy (dialog->new_keyboard_dialog);
 | 
			
		||||
 | 
			
		||||
    g_object_unref (dialog->settings);
 | 
			
		||||
    g_list_free_full (dialog->available_keyboards,
 | 
			
		||||
                      (GDestroyNotify) eek_xml_keyboard_desc_free);
 | 
			
		||||
 | 
			
		||||
    g_slice_free (PreferencesDialog, dialog);
 | 
			
		||||
}
 | 
			
		||||
@ -1,32 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef PREFERENCES_DIALOG_H
 | 
			
		||||
#define PREFERENCES_DIALOG_H 1
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
typedef struct _PreferencesDialog PreferencesDialog;
 | 
			
		||||
 | 
			
		||||
PreferencesDialog *preferences_dialog_new  (void);
 | 
			
		||||
void               preferences_dialog_run  (PreferencesDialog *dialog);
 | 
			
		||||
void               preferences_dialog_free (PreferencesDialog *dialog);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif  /* PREFERENCES_DIALOG_H */
 | 
			
		||||
@ -1,729 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<interface>
 | 
			
		||||
  <!-- interface-requires gtk+ 3.0 -->
 | 
			
		||||
  <object class="GtkAction" id="action1">
 | 
			
		||||
    <property name="stock_id">gtk-close</property>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkAction" id="action2">
 | 
			
		||||
    <property name="stock_id">gtk-cancel</property>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkAction" id="action3">
 | 
			
		||||
    <property name="label" translatable="yes">Select</property>
 | 
			
		||||
    <property name="stock_id">gtk-ok</property>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkAdjustment" id="auto_hide_delay_adjustment">
 | 
			
		||||
    <property name="lower">100</property>
 | 
			
		||||
    <property name="upper">2000</property>
 | 
			
		||||
    <property name="value">500</property>
 | 
			
		||||
    <property name="step_increment">10</property>
 | 
			
		||||
    <property name="page_increment">10</property>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkListStore" id="available_keyboards_liststore">
 | 
			
		||||
    <columns>
 | 
			
		||||
      <!-- column-name id -->
 | 
			
		||||
      <column type="gchararray"/>
 | 
			
		||||
      <!-- column-name gchararray1 -->
 | 
			
		||||
      <column type="gchararray"/>
 | 
			
		||||
    </columns>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkDialog" id="dialog">
 | 
			
		||||
    <property name="can_focus">False</property>
 | 
			
		||||
    <property name="border_width">5</property>
 | 
			
		||||
    <property name="title" translatable="yes">Keyboard</property>
 | 
			
		||||
    <property name="modal">True</property>
 | 
			
		||||
    <property name="type_hint">dialog</property>
 | 
			
		||||
    <child internal-child="vbox">
 | 
			
		||||
      <object class="GtkBox" id="dialog-vbox4">
 | 
			
		||||
        <property name="visible">True</property>
 | 
			
		||||
        <property name="can_focus">False</property>
 | 
			
		||||
        <property name="orientation">vertical</property>
 | 
			
		||||
        <property name="spacing">2</property>
 | 
			
		||||
        <child internal-child="action_area">
 | 
			
		||||
          <object class="GtkButtonBox" id="dialog-action_area5">
 | 
			
		||||
            <property name="visible">True</property>
 | 
			
		||||
            <property name="can_focus">False</property>
 | 
			
		||||
            <property name="layout_style">end</property>
 | 
			
		||||
            <child>
 | 
			
		||||
              <placeholder/>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child>
 | 
			
		||||
              <placeholder/>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child>
 | 
			
		||||
              <placeholder/>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child>
 | 
			
		||||
              <object class="GtkButton" id="button1">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">True</property>
 | 
			
		||||
                <property name="receives_default">True</property>
 | 
			
		||||
                <property name="related_action">action1</property>
 | 
			
		||||
              </object>
 | 
			
		||||
              <packing>
 | 
			
		||||
                <property name="expand">False</property>
 | 
			
		||||
                <property name="fill">True</property>
 | 
			
		||||
                <property name="position">3</property>
 | 
			
		||||
              </packing>
 | 
			
		||||
            </child>
 | 
			
		||||
          </object>
 | 
			
		||||
          <packing>
 | 
			
		||||
            <property name="expand">False</property>
 | 
			
		||||
            <property name="fill">True</property>
 | 
			
		||||
            <property name="pack_type">end</property>
 | 
			
		||||
            <property name="position">0</property>
 | 
			
		||||
          </packing>
 | 
			
		||||
        </child>
 | 
			
		||||
        <child>
 | 
			
		||||
          <object class="GtkNotebook" id="keyboard_notebook">
 | 
			
		||||
            <property name="visible">True</property>
 | 
			
		||||
            <property name="can_focus">True</property>
 | 
			
		||||
            <property name="border_width">10</property>
 | 
			
		||||
            <child>
 | 
			
		||||
              <object class="GtkVBox" id="general_page">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">False</property>
 | 
			
		||||
                <property name="border_width">12</property>
 | 
			
		||||
                <property name="spacing">18</property>
 | 
			
		||||
                <child>
 | 
			
		||||
                  <object class="GtkVBox" id="vbox22">
 | 
			
		||||
                    <property name="visible">True</property>
 | 
			
		||||
                    <property name="can_focus">False</property>
 | 
			
		||||
                    <property name="spacing">6</property>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkLabel" id="label300">
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="can_focus">False</property>
 | 
			
		||||
                        <property name="xalign">0</property>
 | 
			
		||||
                        <property name="label" translatable="yes">Repeat Keys</property>
 | 
			
		||||
                        <attributes>
 | 
			
		||||
                          <attribute name="weight" value="bold"/>
 | 
			
		||||
                        </attributes>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">False</property>
 | 
			
		||||
                        <property name="position">0</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkHBox" id="hbox19">
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="can_focus">False</property>
 | 
			
		||||
                        <child>
 | 
			
		||||
                          <object class="GtkLabel" id="label43">
 | 
			
		||||
                            <property name="visible">True</property>
 | 
			
		||||
                            <property name="can_focus">False</property>
 | 
			
		||||
                            <property name="label">    </property>
 | 
			
		||||
                          </object>
 | 
			
		||||
                          <packing>
 | 
			
		||||
                            <property name="expand">False</property>
 | 
			
		||||
                            <property name="fill">False</property>
 | 
			
		||||
                            <property name="position">0</property>
 | 
			
		||||
                          </packing>
 | 
			
		||||
                        </child>
 | 
			
		||||
                        <child>
 | 
			
		||||
                          <object class="GtkVBox" id="vbox100">
 | 
			
		||||
                            <property name="visible">True</property>
 | 
			
		||||
                            <property name="can_focus">False</property>
 | 
			
		||||
                            <property name="spacing">6</property>
 | 
			
		||||
                            <child>
 | 
			
		||||
                              <object class="GtkCheckButton" id="repeat_toggle">
 | 
			
		||||
                                <property name="label" translatable="yes">Key presses _repeat when key is held down</property>
 | 
			
		||||
                                <property name="visible">True</property>
 | 
			
		||||
                                <property name="can_focus">True</property>
 | 
			
		||||
                                <property name="receives_default">False</property>
 | 
			
		||||
                                <property name="use_action_appearance">False</property>
 | 
			
		||||
                                <property name="use_underline">True</property>
 | 
			
		||||
                                <property name="xalign">0</property>
 | 
			
		||||
                                <property name="draw_indicator">True</property>
 | 
			
		||||
                              </object>
 | 
			
		||||
                              <packing>
 | 
			
		||||
                                <property name="expand">False</property>
 | 
			
		||||
                                <property name="fill">False</property>
 | 
			
		||||
                                <property name="position">0</property>
 | 
			
		||||
                              </packing>
 | 
			
		||||
                            </child>
 | 
			
		||||
                            <child>
 | 
			
		||||
                              <object class="GtkTable" id="repeat_table">
 | 
			
		||||
                                <property name="visible">True</property>
 | 
			
		||||
                                <property name="can_focus">False</property>
 | 
			
		||||
                                <property name="n_rows">2</property>
 | 
			
		||||
                                <property name="n_columns">4</property>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="repeat_speed_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">0</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">_Speed:</property>
 | 
			
		||||
                                    <property name="use_underline">True</property>
 | 
			
		||||
                                    <property name="justify">center</property>
 | 
			
		||||
                                    <property name="mnemonic_widget">repeat_speed_scale</property>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="top_attach">1</property>
 | 
			
		||||
                                    <property name="bottom_attach">2</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="delay_short_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">1</property>
 | 
			
		||||
                                    <property name="xpad">10</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">Short</property>
 | 
			
		||||
                                    <attributes>
 | 
			
		||||
                                      <attribute name="style" value="italic"/>
 | 
			
		||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
			
		||||
                                    </attributes>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">1</property>
 | 
			
		||||
                                    <property name="right_attach">2</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="repeat_slow_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">1</property>
 | 
			
		||||
                                    <property name="xpad">10</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">Slow</property>
 | 
			
		||||
                                    <attributes>
 | 
			
		||||
                                      <attribute name="style" value="italic"/>
 | 
			
		||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
			
		||||
                                    </attributes>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">1</property>
 | 
			
		||||
                                    <property name="right_attach">2</property>
 | 
			
		||||
                                    <property name="top_attach">1</property>
 | 
			
		||||
                                    <property name="bottom_attach">2</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkHScale" id="repeat_delay_scale">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">True</property>
 | 
			
		||||
                                    <property name="adjustment">repeat_delay_adjustment</property>
 | 
			
		||||
                                    <property name="draw_value">False</property>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">2</property>
 | 
			
		||||
                                    <property name="right_attach">3</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkHScale" id="repeat_speed_scale">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">True</property>
 | 
			
		||||
                                    <property name="adjustment">repeat_speed_adjustment</property>
 | 
			
		||||
                                    <property name="draw_value">False</property>
 | 
			
		||||
                                    <child internal-child="accessible">
 | 
			
		||||
                                      <object class="AtkObject" id="repeat_speed_scale-atkobject">
 | 
			
		||||
                                        <property name="AtkObject::accessible-description" translatable="yes">Repeat keys speed</property>
 | 
			
		||||
                                      </object>
 | 
			
		||||
                                    </child>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">2</property>
 | 
			
		||||
                                    <property name="right_attach">3</property>
 | 
			
		||||
                                    <property name="top_attach">1</property>
 | 
			
		||||
                                    <property name="bottom_attach">2</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="delay_long_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">0</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">Long</property>
 | 
			
		||||
                                    <attributes>
 | 
			
		||||
                                      <attribute name="style" value="italic"/>
 | 
			
		||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
			
		||||
                                    </attributes>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">3</property>
 | 
			
		||||
                                    <property name="right_attach">4</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="repeat_fast_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">0</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">Fast</property>
 | 
			
		||||
                                    <attributes>
 | 
			
		||||
                                      <attribute name="style" value="italic"/>
 | 
			
		||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
			
		||||
                                    </attributes>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">3</property>
 | 
			
		||||
                                    <property name="right_attach">4</property>
 | 
			
		||||
                                    <property name="top_attach">1</property>
 | 
			
		||||
                                    <property name="bottom_attach">2</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="repeat_delay_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">0</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">_Delay:</property>
 | 
			
		||||
                                    <property name="use_underline">True</property>
 | 
			
		||||
                                    <property name="justify">center</property>
 | 
			
		||||
                                    <property name="mnemonic_widget">repeat_delay_scale</property>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                              </object>
 | 
			
		||||
                              <packing>
 | 
			
		||||
                                <property name="expand">False</property>
 | 
			
		||||
                                <property name="fill">False</property>
 | 
			
		||||
                                <property name="position">1</property>
 | 
			
		||||
                              </packing>
 | 
			
		||||
                            </child>
 | 
			
		||||
                          </object>
 | 
			
		||||
                          <packing>
 | 
			
		||||
                            <property name="expand">True</property>
 | 
			
		||||
                            <property name="fill">True</property>
 | 
			
		||||
                            <property name="position">1</property>
 | 
			
		||||
                          </packing>
 | 
			
		||||
                        </child>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">False</property>
 | 
			
		||||
                        <property name="position">1</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                  </object>
 | 
			
		||||
                  <packing>
 | 
			
		||||
                    <property name="expand">False</property>
 | 
			
		||||
                    <property name="fill">False</property>
 | 
			
		||||
                    <property name="position">0</property>
 | 
			
		||||
                  </packing>
 | 
			
		||||
                </child>
 | 
			
		||||
                <child>
 | 
			
		||||
                  <object class="GtkVBox" id="vbox230">
 | 
			
		||||
                    <property name="visible">True</property>
 | 
			
		||||
                    <property name="can_focus">False</property>
 | 
			
		||||
                    <property name="spacing">6</property>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkLabel" id="label5">
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="can_focus">False</property>
 | 
			
		||||
                        <property name="xalign">0</property>
 | 
			
		||||
                        <property name="label" translatable="yes">Focus following</property>
 | 
			
		||||
                        <attributes>
 | 
			
		||||
                          <attribute name="weight" value="bold"/>
 | 
			
		||||
                        </attributes>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">False</property>
 | 
			
		||||
                        <property name="position">0</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkHBox" id="hbox20">
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="can_focus">False</property>
 | 
			
		||||
                        <child>
 | 
			
		||||
                          <object class="GtkLabel" id="label44">
 | 
			
		||||
                            <property name="visible">True</property>
 | 
			
		||||
                            <property name="can_focus">False</property>
 | 
			
		||||
                            <property name="label">    </property>
 | 
			
		||||
                          </object>
 | 
			
		||||
                          <packing>
 | 
			
		||||
                            <property name="expand">False</property>
 | 
			
		||||
                            <property name="fill">False</property>
 | 
			
		||||
                            <property name="position">0</property>
 | 
			
		||||
                          </packing>
 | 
			
		||||
                        </child>
 | 
			
		||||
                        <child>
 | 
			
		||||
                          <object class="GtkVBox" id="appearances_vbox">
 | 
			
		||||
                            <property name="visible">True</property>
 | 
			
		||||
                            <property name="can_focus">False</property>
 | 
			
		||||
                            <property name="spacing">6</property>
 | 
			
		||||
                            <child>
 | 
			
		||||
                              <object class="GtkCheckButton" id="auto_hide_toggle">
 | 
			
		||||
                                <property name="label" translatable="yes">Auto hide window when focus is out</property>
 | 
			
		||||
                                <property name="visible">True</property>
 | 
			
		||||
                                <property name="can_focus">True</property>
 | 
			
		||||
                                <property name="receives_default">False</property>
 | 
			
		||||
                                <property name="use_action_appearance">False</property>
 | 
			
		||||
                                <property name="use_underline">True</property>
 | 
			
		||||
                                <property name="xalign">0</property>
 | 
			
		||||
                                <property name="draw_indicator">True</property>
 | 
			
		||||
                              </object>
 | 
			
		||||
                              <packing>
 | 
			
		||||
                                <property name="expand">False</property>
 | 
			
		||||
                                <property name="fill">False</property>
 | 
			
		||||
                                <property name="position">0</property>
 | 
			
		||||
                              </packing>
 | 
			
		||||
                            </child>
 | 
			
		||||
                            <child>
 | 
			
		||||
                              <object class="GtkTable" id="table1">
 | 
			
		||||
                                <property name="visible">True</property>
 | 
			
		||||
                                <property name="can_focus">False</property>
 | 
			
		||||
                                <property name="n_columns">4</property>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="auto_hide_delay_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">0</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">_Delay:</property>
 | 
			
		||||
                                    <property name="use_underline">True</property>
 | 
			
		||||
                                    <property name="justify">center</property>
 | 
			
		||||
                                    <property name="mnemonic_widget">auto_hide_delay_scale</property>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="auto_hide_delay_short_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">1</property>
 | 
			
		||||
                                    <property name="xpad">10</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">Short</property>
 | 
			
		||||
                                    <attributes>
 | 
			
		||||
                                      <attribute name="style" value="italic"/>
 | 
			
		||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
			
		||||
                                    </attributes>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">1</property>
 | 
			
		||||
                                    <property name="right_attach">2</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkHScale" id="auto_hide_delay_scale">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">True</property>
 | 
			
		||||
                                    <property name="adjustment">auto_hide_delay_adjustment</property>
 | 
			
		||||
                                    <property name="draw_value">False</property>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">2</property>
 | 
			
		||||
                                    <property name="right_attach">3</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                                <child>
 | 
			
		||||
                                  <object class="GtkLabel" id="auto_hide_delay_long_label">
 | 
			
		||||
                                    <property name="visible">True</property>
 | 
			
		||||
                                    <property name="can_focus">False</property>
 | 
			
		||||
                                    <property name="xalign">0</property>
 | 
			
		||||
                                    <property name="label" translatable="yes">Long</property>
 | 
			
		||||
                                    <attributes>
 | 
			
		||||
                                      <attribute name="style" value="italic"/>
 | 
			
		||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
			
		||||
                                    </attributes>
 | 
			
		||||
                                  </object>
 | 
			
		||||
                                  <packing>
 | 
			
		||||
                                    <property name="left_attach">3</property>
 | 
			
		||||
                                    <property name="right_attach">4</property>
 | 
			
		||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
			
		||||
                                    <property name="y_options"></property>
 | 
			
		||||
                                  </packing>
 | 
			
		||||
                                </child>
 | 
			
		||||
                              </object>
 | 
			
		||||
                              <packing>
 | 
			
		||||
                                <property name="expand">False</property>
 | 
			
		||||
                                <property name="fill">False</property>
 | 
			
		||||
                                <property name="position">1</property>
 | 
			
		||||
                              </packing>
 | 
			
		||||
                            </child>
 | 
			
		||||
                          </object>
 | 
			
		||||
                          <packing>
 | 
			
		||||
                            <property name="expand">True</property>
 | 
			
		||||
                            <property name="fill">True</property>
 | 
			
		||||
                            <property name="position">1</property>
 | 
			
		||||
                          </packing>
 | 
			
		||||
                        </child>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">False</property>
 | 
			
		||||
                        <property name="position">1</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                  </object>
 | 
			
		||||
                  <packing>
 | 
			
		||||
                    <property name="expand">False</property>
 | 
			
		||||
                    <property name="fill">False</property>
 | 
			
		||||
                    <property name="position">1</property>
 | 
			
		||||
                  </packing>
 | 
			
		||||
                </child>
 | 
			
		||||
              </object>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child type="tab">
 | 
			
		||||
              <object class="GtkLabel" id="label1">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">False</property>
 | 
			
		||||
                <property name="label" translatable="yes">Typing</property>
 | 
			
		||||
              </object>
 | 
			
		||||
              <packing>
 | 
			
		||||
                <property name="tab_fill">False</property>
 | 
			
		||||
              </packing>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child>
 | 
			
		||||
              <object class="GtkVBox" id="keyboards_page">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">False</property>
 | 
			
		||||
                <property name="border_width">12</property>
 | 
			
		||||
                <property name="spacing">18</property>
 | 
			
		||||
                <child>
 | 
			
		||||
                  <object class="GtkTreeView" id="selected_keyboards_treeview">
 | 
			
		||||
                    <property name="visible">True</property>
 | 
			
		||||
                    <property name="can_focus">True</property>
 | 
			
		||||
                    <property name="model">selected_keyboards_liststore</property>
 | 
			
		||||
                    <property name="headers_visible">False</property>
 | 
			
		||||
                    <property name="headers_clickable">False</property>
 | 
			
		||||
                    <child internal-child="selection">
 | 
			
		||||
                      <object class="GtkTreeSelection" id="treeview-selection2"/>
 | 
			
		||||
                    </child>
 | 
			
		||||
                  </object>
 | 
			
		||||
                  <packing>
 | 
			
		||||
                    <property name="expand">True</property>
 | 
			
		||||
                    <property name="fill">True</property>
 | 
			
		||||
                    <property name="position">0</property>
 | 
			
		||||
                  </packing>
 | 
			
		||||
                </child>
 | 
			
		||||
                <child>
 | 
			
		||||
                  <object class="GtkButtonBox" id="buttonbox1">
 | 
			
		||||
                    <property name="visible">True</property>
 | 
			
		||||
                    <property name="can_focus">False</property>
 | 
			
		||||
                    <property name="spacing">2</property>
 | 
			
		||||
                    <property name="layout_style">end</property>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkButton" id="up_button">
 | 
			
		||||
                        <property name="label">gtk-go-up</property>
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="sensitive">False</property>
 | 
			
		||||
                        <property name="can_focus">True</property>
 | 
			
		||||
                        <property name="receives_default">True</property>
 | 
			
		||||
                        <property name="use_action_appearance">False</property>
 | 
			
		||||
                        <property name="use_stock">True</property>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">True</property>
 | 
			
		||||
                        <property name="position">0</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkButton" id="down_button">
 | 
			
		||||
                        <property name="label">gtk-go-down</property>
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="sensitive">False</property>
 | 
			
		||||
                        <property name="can_focus">True</property>
 | 
			
		||||
                        <property name="receives_default">True</property>
 | 
			
		||||
                        <property name="use_action_appearance">False</property>
 | 
			
		||||
                        <property name="use_stock">True</property>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">True</property>
 | 
			
		||||
                        <property name="position">1</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkButton" id="add_button">
 | 
			
		||||
                        <property name="label">gtk-add</property>
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="can_focus">True</property>
 | 
			
		||||
                        <property name="receives_default">True</property>
 | 
			
		||||
                        <property name="use_action_appearance">False</property>
 | 
			
		||||
                        <property name="use_stock">True</property>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">True</property>
 | 
			
		||||
                        <property name="position">2</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                    <child>
 | 
			
		||||
                      <object class="GtkButton" id="remove_button">
 | 
			
		||||
                        <property name="label">gtk-remove</property>
 | 
			
		||||
                        <property name="visible">True</property>
 | 
			
		||||
                        <property name="sensitive">False</property>
 | 
			
		||||
                        <property name="can_focus">True</property>
 | 
			
		||||
                        <property name="receives_default">True</property>
 | 
			
		||||
                        <property name="use_action_appearance">False</property>
 | 
			
		||||
                        <property name="use_stock">True</property>
 | 
			
		||||
                      </object>
 | 
			
		||||
                      <packing>
 | 
			
		||||
                        <property name="expand">False</property>
 | 
			
		||||
                        <property name="fill">True</property>
 | 
			
		||||
                        <property name="position">3</property>
 | 
			
		||||
                      </packing>
 | 
			
		||||
                    </child>
 | 
			
		||||
                  </object>
 | 
			
		||||
                  <packing>
 | 
			
		||||
                    <property name="expand">False</property>
 | 
			
		||||
                    <property name="fill">False</property>
 | 
			
		||||
                    <property name="position">1</property>
 | 
			
		||||
                  </packing>
 | 
			
		||||
                </child>
 | 
			
		||||
              </object>
 | 
			
		||||
              <packing>
 | 
			
		||||
                <property name="position">1</property>
 | 
			
		||||
              </packing>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child type="tab">
 | 
			
		||||
              <object class="GtkLabel" id="label2">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">False</property>
 | 
			
		||||
                <property name="label" translatable="yes">Keyboards</property>
 | 
			
		||||
              </object>
 | 
			
		||||
              <packing>
 | 
			
		||||
                <property name="position">1</property>
 | 
			
		||||
                <property name="tab_fill">False</property>
 | 
			
		||||
              </packing>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child>
 | 
			
		||||
              <placeholder/>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child type="tab">
 | 
			
		||||
              <placeholder/>
 | 
			
		||||
            </child>
 | 
			
		||||
          </object>
 | 
			
		||||
          <packing>
 | 
			
		||||
            <property name="expand">True</property>
 | 
			
		||||
            <property name="fill">True</property>
 | 
			
		||||
            <property name="position">1</property>
 | 
			
		||||
          </packing>
 | 
			
		||||
        </child>
 | 
			
		||||
      </object>
 | 
			
		||||
    </child>
 | 
			
		||||
    <action-widgets>
 | 
			
		||||
      <action-widget response="0">button1</action-widget>
 | 
			
		||||
    </action-widgets>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkDialog" id="new_keyboard_dialog">
 | 
			
		||||
    <property name="can_focus">False</property>
 | 
			
		||||
    <property name="border_width">5</property>
 | 
			
		||||
    <property name="default_height">430</property>
 | 
			
		||||
    <property name="destroy_with_parent">True</property>
 | 
			
		||||
    <property name="type_hint">dialog</property>
 | 
			
		||||
    <property name="transient_for">dialog</property>
 | 
			
		||||
    <child internal-child="vbox">
 | 
			
		||||
      <object class="GtkBox" id="dialog-vbox2">
 | 
			
		||||
        <property name="can_focus">False</property>
 | 
			
		||||
        <property name="orientation">vertical</property>
 | 
			
		||||
        <property name="spacing">2</property>
 | 
			
		||||
        <child internal-child="action_area">
 | 
			
		||||
          <object class="GtkButtonBox" id="dialog-action_area2">
 | 
			
		||||
            <property name="can_focus">False</property>
 | 
			
		||||
            <property name="layout_style">end</property>
 | 
			
		||||
            <child>
 | 
			
		||||
              <object class="GtkButton" id="button2">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">True</property>
 | 
			
		||||
                <property name="receives_default">True</property>
 | 
			
		||||
                <property name="related_action">action2</property>
 | 
			
		||||
              </object>
 | 
			
		||||
              <packing>
 | 
			
		||||
                <property name="expand">False</property>
 | 
			
		||||
                <property name="fill">True</property>
 | 
			
		||||
                <property name="position">0</property>
 | 
			
		||||
              </packing>
 | 
			
		||||
            </child>
 | 
			
		||||
            <child>
 | 
			
		||||
              <object class="GtkButton" id="button3">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">True</property>
 | 
			
		||||
                <property name="receives_default">True</property>
 | 
			
		||||
                <property name="related_action">action3</property>
 | 
			
		||||
              </object>
 | 
			
		||||
              <packing>
 | 
			
		||||
                <property name="expand">False</property>
 | 
			
		||||
                <property name="fill">True</property>
 | 
			
		||||
                <property name="position">1</property>
 | 
			
		||||
              </packing>
 | 
			
		||||
            </child>
 | 
			
		||||
          </object>
 | 
			
		||||
          <packing>
 | 
			
		||||
            <property name="expand">False</property>
 | 
			
		||||
            <property name="fill">True</property>
 | 
			
		||||
            <property name="pack_type">end</property>
 | 
			
		||||
            <property name="position">0</property>
 | 
			
		||||
          </packing>
 | 
			
		||||
        </child>
 | 
			
		||||
        <child>
 | 
			
		||||
          <object class="GtkScrolledWindow" id="scrolledwindow1">
 | 
			
		||||
            <property name="visible">True</property>
 | 
			
		||||
            <property name="can_focus">True</property>
 | 
			
		||||
            <property name="shadow_type">in</property>
 | 
			
		||||
            <child>
 | 
			
		||||
              <object class="GtkTreeView" id="available_keyboards_treeview">
 | 
			
		||||
                <property name="visible">True</property>
 | 
			
		||||
                <property name="can_focus">True</property>
 | 
			
		||||
                <property name="model">available_keyboards_liststore</property>
 | 
			
		||||
                <property name="headers_visible">False</property>
 | 
			
		||||
                <property name="headers_clickable">False</property>
 | 
			
		||||
                <child internal-child="selection">
 | 
			
		||||
                  <object class="GtkTreeSelection" id="treeview-selection3"/>
 | 
			
		||||
                </child>
 | 
			
		||||
              </object>
 | 
			
		||||
            </child>
 | 
			
		||||
          </object>
 | 
			
		||||
          <packing>
 | 
			
		||||
            <property name="expand">True</property>
 | 
			
		||||
            <property name="fill">True</property>
 | 
			
		||||
            <property name="position">1</property>
 | 
			
		||||
          </packing>
 | 
			
		||||
        </child>
 | 
			
		||||
      </object>
 | 
			
		||||
    </child>
 | 
			
		||||
    <action-widgets>
 | 
			
		||||
      <action-widget response="0">button2</action-widget>
 | 
			
		||||
      <action-widget response="-5">button3</action-widget>
 | 
			
		||||
    </action-widgets>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkAdjustment" id="repeat_delay_adjustment">
 | 
			
		||||
    <property name="lower">100</property>
 | 
			
		||||
    <property name="upper">2000</property>
 | 
			
		||||
    <property name="value">500</property>
 | 
			
		||||
    <property name="step_increment">10</property>
 | 
			
		||||
    <property name="page_increment">10</property>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkAdjustment" id="repeat_speed_adjustment">
 | 
			
		||||
    <property name="lower">0.5</property>
 | 
			
		||||
    <property name="upper">50</property>
 | 
			
		||||
    <property name="value">33.299999999999997</property>
 | 
			
		||||
    <property name="step_increment">1</property>
 | 
			
		||||
    <property name="page_increment">1</property>
 | 
			
		||||
  </object>
 | 
			
		||||
  <object class="GtkListStore" id="selected_keyboards_liststore">
 | 
			
		||||
    <columns>
 | 
			
		||||
      <!-- column-name id -->
 | 
			
		||||
      <column type="gchararray"/>
 | 
			
		||||
      <!-- column-name gchararray1 -->
 | 
			
		||||
      <column type="gchararray"/>
 | 
			
		||||
    </columns>
 | 
			
		||||
  </object>
 | 
			
		||||
</interface>
 | 
			
		||||
@ -1,41 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2012 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2012 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#include <config.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include "preferences-dialog.h"
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    PreferencesDialog *dialog;
 | 
			
		||||
 | 
			
		||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
			
		||||
        g_printerr ("Can't init GTK\n");
 | 
			
		||||
        return EXIT_FAILURE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dialog = preferences_dialog_new ();
 | 
			
		||||
    preferences_dialog_run (dialog);
 | 
			
		||||
    preferences_dialog_free (dialog);
 | 
			
		||||
 | 
			
		||||
    return EXIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user