diff options
author | Guido Günther <agx@sigxcpu.org> | 2017-11-11 14:21:02 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2017-11-11 14:21:02 +0100 |
commit | 808ce78d212c6b434d24066f1f2d44d3e76224ae (patch) | |
tree | d810e5fb8e698189ebe9af7f76c53aec0fba7e19 /src | |
parent | New upstream version 3.20.0 (diff) | |
download | krb5-auth-dialog-808ce78d212c6b434d24066f1f2d44d3e76224ae.tar.gz krb5-auth-dialog-808ce78d212c6b434d24066f1f2d44d3e76224ae.tar.bz2 krb5-auth-dialog-808ce78d212c6b434d24066f1f2d44d3e76224ae.zip |
New upstream version 3.26.0
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.in | 5 | ||||
-rw-r--r-- | src/ka-applet.c | 20 | ||||
-rw-r--r-- | src/ka-kerberos.c | 64 | ||||
-rw-r--r-- | src/ka-main-window.c | 32 | ||||
-rw-r--r-- | src/ka-pwdialog.c | 76 | ||||
-rw-r--r-- | src/ka-tools.c | 5 | ||||
-rw-r--r-- | src/ka-tools.h | 2 | ||||
-rw-r--r-- | src/krb5-auth-dialog.1.in | 7 | ||||
-rw-r--r-- | src/krb5-auth-dialog.appdata.xml.in | 21 | ||||
-rw-r--r-- | src/resources.c | 288 | ||||
-rw-r--r-- | src/resources/ui/ka-main-window.ui | 18 |
11 files changed, 306 insertions, 232 deletions
diff --git a/src/Makefile.in b/src/Makefile.in index d90d281..44077b0 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -292,6 +292,7 @@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ ITSTOOL = @ITSTOOL@ KA_PLUGINS_DIR = @KA_PLUGINS_DIR@ KRB5_CFLAGS = @KRB5_CFLAGS@ diff --git a/src/ka-applet.c b/src/ka-applet.c index 195f781..50e6b70 100644 --- a/src/ka-applet.c +++ b/src/ka-applet.c @@ -209,7 +209,7 @@ GtkWindow *ka_applet_last_focused_window (KaApplet *self) static void -action_remove_credentails_cache (GSimpleAction *action G_GNUC_UNUSED, +action_remove_credentials_cache (GSimpleAction *action G_GNUC_UNUSED, GVariant *parameter G_GNUC_UNUSED, gpointer userdata) { @@ -255,7 +255,7 @@ action_help (GSimpleAction *action G_GNUC_UNUSED, KaApplet *self = KA_APPLET(userdata); GtkWindow *window = ka_applet_last_focused_window (self); - ka_show_help (gtk_window_get_screen (window), NULL, NULL); + ka_show_help (window, NULL); } static void @@ -360,13 +360,17 @@ static void ka_applet_startup (GApplication *application) { KaApplet *self = KA_APPLET (application); + GtkWindow *main_window; KA_DEBUG ("Primary application"); G_APPLICATION_CLASS (ka_applet_parent_class)->startup (application); self->priv->startup_ccache = ka_kerberos_init (self); - ka_main_window_create (self); + main_window = GTK_WINDOW(ka_main_window_create (self)); + gtk_window_set_transient_for(GTK_WINDOW(self->priv->pwdialog), + main_window); + self->priv->prefs = ka_preferences_new (self); ka_applet_app_menu_create(self); @@ -649,8 +653,8 @@ ka_applet_tooltip_text (int remaining) if (remaining >= 3600) { hours = remaining / 3600; minutes = (remaining % 3600) / 60; - /* Translators: First number is hours, second number is minutes */ tooltip_text = + /* Translators: First number is hours, second number is minutes */ g_strdup_printf (_("Your credentials expire in %.2d:%.2dh"), hours, minutes); } else { @@ -983,7 +987,7 @@ ka_applet_update_status (KaApplet *applet, krb5_timestamp expiry) static GActionEntry trayicon_entries[] = { - { "remove_credentials_cache", action_remove_credentails_cache, NULL, NULL, NULL, {0} }, + { "remove_credentials_cache", action_remove_credentials_cache, NULL, NULL, NULL, {0} }, { "list_tickets", action_list_tickets, NULL, NULL, NULL, {0} }, { "preferences", action_preferences, NULL, NULL, NULL, {0} }, { "about", action_about, NULL, NULL, NULL, {0} }, @@ -1195,8 +1199,10 @@ ka_applet_destroy (KaApplet* self) gtk_widget_destroy (GTK_WIDGET(self->priv->prefs)); self->priv->prefs = NULL; - gtk_widget_destroy (GTK_WIDGET(self->priv->context_menu)); - self->priv->context_menu = NULL; + if (self->priv->context_menu) { + gtk_widget_destroy (GTK_WIDGET(self->priv->context_menu)); + self->priv->context_menu = NULL; + } ka_kerberos_destroy (); } diff --git a/src/ka-kerberos.c b/src/ka-kerberos.c index 14fb03e..6526a72 100644 --- a/src/ka-kerberos.c +++ b/src/ka-kerberos.c @@ -41,11 +41,7 @@ #include "ka-main-window.h" #ifdef ENABLE_NETWORK_MANAGER -#include <nm-client.h> - -#if !defined(NM_CHECK_VERSION) -#define NM_CHECK_VERSION(x,y,z) 0 -#endif +# include <NetworkManager.h> #endif #ifdef HAVE_HX509_ERR_H @@ -222,6 +218,9 @@ credentials_expiring_real (KaApplet *applet) krb5_timestamp now; gboolean retval = FALSE; + if (!kcontext_valid) + return retval; + memset (&my_creds, 0, sizeof (my_creds)); ka_applet_set_tgt_renewable (applet, FALSE); if (!ka_get_tgt_from_ccache (kcontext, &my_creds)) { @@ -318,22 +317,22 @@ ka_get_service_tickets (GtkListStore * tickets, gboolean hide_conf_tickets) g_return_val_if_fail (!ret, FALSE); ret = krb5_cc_start_seq_get (kcontext, ccache, &cursor); - if (ret) { + if (ret == KRB5_FCC_NOFILE) { ka_log_error_message_at_level (G_LOG_LEVEL_INFO, "krb5_cc_start_seq_get", kcontext, ret); - /* if the file doesn't exist, it's not an error if we can't - * parse it */ - if (!g_file_test (ka_ccache_filename (), G_FILE_TEST_EXISTS)) - gtk_list_store_append (tickets, &iter); - gtk_list_store_set (tickets, &iter, - PRINCIPAL_COLUMN, _("Your ticket cache is currently empty"), - FORWARDABLE_COLUMN, FALSE, - RENEWABLE_COLUMN, FALSE, - PROXIABLE_COLUMN, FALSE, -1); - retval = TRUE; + gtk_list_store_append (tickets, &iter); + gtk_list_store_set (tickets, &iter, + PRINCIPAL_COLUMN, _("Your ticket cache is currently empty"), + FORWARDABLE_COLUMN, FALSE, + RENEWABLE_COLUMN, FALSE, + PROXIABLE_COLUMN, FALSE, -1); + retval = TRUE; + goto out; + } else if (ret) { goto out; } + while ((ret = krb5_cc_next_cred (kcontext, ccache, &cursor, &creds)) == 0) { gboolean renewable, proxiable, forwardable; @@ -467,7 +466,7 @@ auth_dialog_prompter (krb5_context ctx G_GNUC_UNUSED, goto cleanup; if (password_len + 1 > prompts[i].reply->length) { g_warning ("Password too long %d/%zd", password_len + 1, - prompts[i].reply->length); + (size_t)prompts[i].reply->length); goto cleanup; } @@ -500,20 +499,14 @@ ka_nm_client_state_changed_cb (NMClient * client, KA_DEBUG ("Network state: %d", state); /* do nothing */ break; -#if NM_CHECK_VERSION(0,8,992) case NM_STATE_DISCONNECTING: -#endif case NM_STATE_DISCONNECTED: KA_DEBUG ("Network disconnected"); *online = FALSE; break; -#if NM_CHECK_VERSION(0,8,992) case NM_STATE_CONNECTED_LOCAL: case NM_STATE_CONNECTED_SITE: case NM_STATE_CONNECTED_GLOBAL: -#else - case NM_STATE_CONNECTED: -#endif KA_DEBUG ("Network connected"); *online = TRUE; break; @@ -529,7 +522,7 @@ credentials_expiring (gpointer *data) KA_DEBUG ("Checking expiry <%ds", ka_applet_get_pw_prompt_secs (applet)); if (credentials_expiring_real (applet) && is_online) { - KA_DEBUG ("Expiry @ %ld", creds_expiry); + KA_DEBUG ("Expiry @ %ld", (long int)creds_expiry); if (!ka_renew_credentials (applet)) KA_DEBUG ("Credentials renewed"); @@ -947,8 +940,8 @@ static gboolean ka_krb5_context_free () { if (kcontext_valid) { - krb5_free_context (kcontext); kcontext_valid = FALSE; + krb5_free_context (kcontext); } return TRUE; } @@ -1093,16 +1086,19 @@ static gboolean ka_nm_init (void) { #ifdef ENABLE_NETWORK_MANAGER - nm_client = nm_client_new (); + GError *error = NULL; + + nm_client = nm_client_new (NULL, &error); if (!nm_client) { - g_warning ("Could not initialize nm-client"); - } else { - g_signal_connect (nm_client, "notify::state", - G_CALLBACK (ka_nm_client_state_changed_cb), - &is_online); - /* Set initial state */ - ka_nm_client_state_changed_cb (nm_client, NULL, &is_online); + g_warning ("Could not initialize nm-client: %s", error->message); + g_error_free (error); + return FALSE; } + g_signal_connect (nm_client, "notify::state", + G_CALLBACK (ka_nm_client_state_changed_cb), + &is_online); + /* Set initial state */ + ka_nm_client_state_changed_cb (nm_client, NULL, &is_online); #endif /* ENABLE_NETWORK_MANAGER */ return TRUE; } @@ -1114,7 +1110,7 @@ ka_kerberos_init (KaApplet *applet) gboolean ret; ka_secmem_init (); - ret = ka_krb5_context_init (applet); + ret = ka_krb5_context_init (); ka_nm_init (); g_timeout_add_seconds (CREDENTIAL_CHECK_INTERVAL, (GSourceFunc) credentials_expiring, applet); diff --git a/src/ka-main-window.c b/src/ka-main-window.c index 21b1dbc..1509b20 100644 --- a/src/ka-main-window.c +++ b/src/ka-main-window.c @@ -30,6 +30,7 @@ #include "ka-preferences.h" static GtkListStore *tickets; +static GtkButton *ticket_btn; static GtkApplicationWindow *main_window; static void @@ -44,6 +45,26 @@ ccache_changed_cb (KaApplet* applet, } +static void +enable_ticket_button_cb (gpointer* applet G_GNUC_UNUSED, + gchar *princ G_GNUC_UNUSED, + guint when G_GNUC_UNUSED, + gpointer user_data) +{ + gboolean enable = GPOINTER_TO_UINT(user_data); + KA_DEBUG ("Sensitive: %u", enable); + gtk_widget_set_sensitive(GTK_WIDGET(ticket_btn), enable); +} + + +static void +ticket_btn_clicked(GtkButton* btn G_GNUC_UNUSED, gpointer user_data) +{ + KaApplet *applet = KA_APPLET(user_data); + ka_grab_credentials (applet); +} + + GtkApplicationWindow * ka_main_window_create (KaApplet *applet) { @@ -117,6 +138,17 @@ ka_main_window_create (KaApplet *applet) G_CALLBACK(ccache_changed_cb), NULL); + ticket_btn = + GTK_BUTTON (gtk_builder_get_object (builder, "get_ticket_btn")); + g_signal_connect(ticket_btn, "clicked", G_CALLBACK(ticket_btn_clicked), applet); + + g_signal_connect (applet, "krb-tgt-acquired", + G_CALLBACK (enable_ticket_button_cb), + GUINT_TO_POINTER(FALSE)); + + g_signal_connect (applet, "krb-tgt-expired", + G_CALLBACK (enable_ticket_button_cb), + GUINT_TO_POINTER(TRUE)); g_object_unref (builder); return main_window; } diff --git a/src/ka-pwdialog.c b/src/ka-pwdialog.c index 0cca259..7d51344 100644 --- a/src/ka-pwdialog.c +++ b/src/ka-pwdialog.c @@ -168,57 +168,24 @@ ka_pwdialog_new (void) return pwdialog; } - -static GdkGrabStatus -for_each_keyboard (GdkWindow *window, GdkEvent *event, - GdkGrabStatus (*func)(GdkDevice*, - GdkWindow*, - GdkEvent*)) -{ - GdkDisplay *display; - GdkDeviceManager *device_manager; - GdkDevice *device; - GList *devices, *dev; - GdkGrabStatus ret = GDK_GRAB_SUCCESS; - - display = gdk_window_get_display (window); - device_manager = gdk_display_get_device_manager (display); - devices = gdk_device_manager_list_devices (device_manager, - GDK_DEVICE_TYPE_MASTER); - - for (dev = devices; dev; dev = dev->next) { - device = dev->data; - if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD) - continue; - ret = (*func)(device, window, event); - } - - g_list_free (devices); - return ret; -} - -static GdkGrabStatus -grab_keyboard_func (GdkDevice *device, GdkWindow *window, GdkEvent *event) -{ - return gdk_device_grab (device, - window, - GDK_OWNERSHIP_WINDOW, - FALSE, - GDK_ALL_EVENTS_MASK, - NULL, - gdk_event_get_time (event)); -} - static gboolean grab_keyboard (GtkWidget *win, GdkEvent * event, gpointer data) { KaPwDialog *pwdialog = KA_PWDIALOG (data); GdkGrabStatus status; + GdkWindow *window = gtk_widget_get_window(win); + gtk_grab_add(win); if (!pwdialog->priv->grabbed) { - status = for_each_keyboard(gtk_widget_get_window (win), - event, - &grab_keyboard_func); + status = gdk_seat_grab (gdk_display_get_default_seat( + gdk_window_get_display (window)), + window, + GDK_SEAT_CAPABILITY_ALL, + TRUE, + NULL, + event, + NULL, + NULL); if (status == GDK_GRAB_SUCCESS) pwdialog->priv->grabbed = TRUE; @@ -228,26 +195,19 @@ grab_keyboard (GtkWidget *win, GdkEvent * event, gpointer data) return FALSE; } -static GdkGrabStatus -ungrab_keyboard_func (GdkDevice *device, - GdkWindow *window G_GNUC_UNUSED, - GdkEvent *event) -{ - gdk_device_ungrab (device, - gdk_event_get_time (event)); - return 0; -} static gboolean -ungrab_keyboard (GtkWidget *win G_GNUC_UNUSED, - GdkEvent * event, gpointer data) +ungrab_keyboard (GtkWidget *win, + GdkEvent *event G_GNUC_UNUSED, gpointer data) { KaPwDialog *pwdialog = KA_PWDIALOG (data); + GdkWindow *window = gtk_widget_get_window(win); if (pwdialog->priv->grabbed) { - for_each_keyboard(gtk_widget_get_window (win), - event, - &ungrab_keyboard_func); + gtk_grab_remove (win); + gdk_seat_ungrab (gdk_display_get_default_seat( + gdk_window_get_display (window))); + pwdialog->priv->grabbed = FALSE; } return FALSE; diff --git a/src/ka-tools.c b/src/ka-tools.c index ae93803..1dbc94a 100644 --- a/src/ka-tools.c +++ b/src/ka-tools.c @@ -21,7 +21,7 @@ #include "ka-tools.h" void -ka_show_help (GdkScreen* screen, const char* chapter, GtkWindow* window) +ka_show_help (GtkWindow* window, const char* chapter) { GError *error = NULL; const char *section = ""; @@ -32,8 +32,7 @@ ka_show_help (GdkScreen* screen, const char* chapter, GtkWindow* window) url = g_strdup_printf("help:krb5-auth-dialog%s", section); - gtk_show_uri (screen, url, gtk_get_current_event_time (), &error); - + gtk_show_uri_on_window (window, url, gtk_get_current_event_time (), &error); if (error) { GtkWidget *message_dialog; diff --git a/src/ka-tools.h b/src/ka-tools.h index 9cbf1ae..3263b8e 100644 --- a/src/ka-tools.h +++ b/src/ka-tools.h @@ -25,7 +25,7 @@ G_BEGIN_DECLS -void ka_show_help (GdkScreen* screen, const char* section, GtkWindow* window); +void ka_show_help (GtkWindow* window, const char* section); void ka_show_about (KaApplet *applet); G_END_DECLS diff --git a/src/krb5-auth-dialog.1.in b/src/krb5-auth-dialog.1.in index 2a9867e..7630fd5 100644 --- a/src/krb5-auth-dialog.1.in +++ b/src/krb5-auth-dialog.1.in @@ -17,8 +17,11 @@ credentials, prompting the user for whatever information is necessary. .TP \fB--auto\fR -If this option is specified, \fBkrb5-auth-dialog\fR will exit if it finds that the -user has no Kerberos credentials. +If this option is specified, \fkrb5-auth-dialog\f will start only if it +finds that the user has Kerberos credentials. This may be used to +ensure that only users who actually use Kerberos see the program. +Note that in some settings, users may authenticate to Kerberos at a +later time even if they do not have Kerberos credentials initially. .SH "SEE ALSO" .BR krb5.conf (5) diff --git a/src/krb5-auth-dialog.appdata.xml.in b/src/krb5-auth-dialog.appdata.xml.in index b3e6ad2..09a53bc 100644 --- a/src/krb5-auth-dialog.appdata.xml.in +++ b/src/krb5-auth-dialog.appdata.xml.in @@ -1,8 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Copyright 2013 Guido Günther <agx@sigxcpu.org> --> -<application> - <id type="desktop">krb5-auth-dialog.desktop</id> - <licence>CC0</licence> +<component type="desktop"> + <id>krb5-auth-dialog.desktop</id> + <metadata_license>CC0-1.0</metadata_license> + <_name>Kerberos Authentication Dialog</_name> + <_summary>Request, renew and view Kerberos tickets</_summary> <description> <_p> Kerberos Authentication allows you to list your current Kerberos tickets, @@ -16,14 +18,21 @@ </_p> </description> <screenshots> - <screenshot type="default" width="330" height="176">http://honk.sigxcpu.org/con/images/krb5-auth-dialog-pkinit.png</screenshot> + <screenshot type="default" height="176" width="330"> + <image>http://honk.sigxcpu.org/con/images/krb5-auth-dialog-pkinit.png</image> + <_caption>Kerberos authentication dialog</_caption> + </screenshot> </screenshots> <url type="homepage">https://honk.sigxcpu.org/piki/projects/krb5-auth-dialog/</url> - <updatecontact>agx_at_sigxcpu.org</updatecontact> + <update_contact>agx_at_sigxcpu.org</update_contact> <kudos> <kudo>AppMenu</kudo> <kudo>HiDpiIcon</kudo> <kudo>ModernToolkit</kudo> <kudo>Notifications</kudo> </kudos> -</application> + <project_license>GPL-2.0+</project_license> + <developer_name>Guido Günther</developer_name> + <url type="bugtracker">https://bugzilla.gnome.org/enter_bug.cgi?product=krb5-auth-dialog</url> + <url type="help">https://honk.sigxcpu.org/piki/projects/krb5-auth-dialog/</url> +</component> diff --git a/src/resources.c b/src/resources.c index 6428ecc..5373ac6 100644 --- a/src/resources.c +++ b/src/resources.c @@ -6,7 +6,7 @@ # define SECTION #endif -static const SECTION union { const guint8 data[31908]; const double alignment; void * const ptr;} krb5_auth_dialog_resource_data = { { +static const SECTION union { const guint8 data[32340]; const double alignment; void * const ptr;} krb5_auth_dialog_resource_data = { { 0x47, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, @@ -33,19 +33,19 @@ static const SECTION union { const guint8 data[31908]; const double alignment; v 0xf8, 0x74, 0x00, 0x00, 0x0c, 0x75, 0x00, 0x00, 0x4b, 0x97, 0x0c, 0x39, 0x04, 0x00, 0x00, 0x00, 0x0c, 0x75, 0x00, 0x00, 0x11, 0x00, 0x76, 0x00, - 0x20, 0x75, 0x00, 0x00, 0xbc, 0x79, 0x00, 0x00, + 0x20, 0x75, 0x00, 0x00, 0x6b, 0x7b, 0x00, 0x00, 0x4b, 0x50, 0x90, 0x0b, 0x00, 0x00, 0x00, 0x00, - 0xbc, 0x79, 0x00, 0x00, 0x04, 0x00, 0x4c, 0x00, - 0xc0, 0x79, 0x00, 0x00, 0xc4, 0x79, 0x00, 0x00, + 0x6b, 0x7b, 0x00, 0x00, 0x04, 0x00, 0x4c, 0x00, + 0x70, 0x7b, 0x00, 0x00, 0x74, 0x7b, 0x00, 0x00, 0x6f, 0x1c, 0x9b, 0x44, 0x09, 0x00, 0x00, 0x00, - 0xc4, 0x79, 0x00, 0x00, 0x11, 0x00, 0x4c, 0x00, - 0xd8, 0x79, 0x00, 0x00, 0xdc, 0x79, 0x00, 0x00, + 0x74, 0x7b, 0x00, 0x00, 0x11, 0x00, 0x4c, 0x00, + 0x88, 0x7b, 0x00, 0x00, 0x8c, 0x7b, 0x00, 0x00, 0xab, 0x84, 0xc8, 0x77, 0x04, 0x00, 0x00, 0x00, - 0xdc, 0x79, 0x00, 0x00, 0x0b, 0x00, 0x76, 0x00, - 0xe8, 0x79, 0x00, 0x00, 0x97, 0x7c, 0x00, 0x00, + 0x8c, 0x7b, 0x00, 0x00, 0x0b, 0x00, 0x76, 0x00, + 0x98, 0x7b, 0x00, 0x00, 0x47, 0x7e, 0x00, 0x00, 0xb0, 0xb7, 0x24, 0x30, 0x06, 0x00, 0x00, 0x00, - 0x97, 0x7c, 0x00, 0x00, 0x06, 0x00, 0x4c, 0x00, - 0xa0, 0x7c, 0x00, 0x00, 0xa4, 0x7c, 0x00, 0x00, + 0x47, 0x7e, 0x00, 0x00, 0x06, 0x00, 0x4c, 0x00, + 0x50, 0x7e, 0x00, 0x00, 0x54, 0x7e, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x74, 0x72, 0x61, 0x79, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2e, 0x75, @@ -3755,7 +3755,7 @@ static const SECTION union { const guint8 data[31908]; const double alignment; v 0x01, 0x00, 0x00, 0x00, 0x6b, 0x61, 0x2d, 0x6d, 0x61, 0x69, 0x6e, 0x2d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x75, 0x69, 0x00, 0x00, 0x00, - 0x8c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3b, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f, @@ -3764,78 +3764,149 @@ static const SECTION union { const guint8 data[31908]; const double alignment; v 0x21, 0x2d, 0x2d, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x6c, 0x61, 0x64, 0x65, - 0x20, 0x33, 0x2e, 0x31, 0x38, 0x2e, 0x33, 0x20, + 0x20, 0x33, 0x2e, 0x32, 0x30, 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x3e, 0x3c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x6c, 0x69, 0x62, 0x3d, 0x22, 0x67, 0x74, 0x6b, 0x2b, 0x22, 0x20, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x33, 0x2e, 0x30, - 0x22, 0x2f, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x41, 0x64, 0x6a, - 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x64, 0x6a, - 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x31, - 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x75, 0x70, 0x70, 0x65, 0x72, 0x22, - 0x3e, 0x31, 0x30, 0x30, 0x3c, 0x2f, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, - 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x31, - 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, + 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x33, 0x2e, 0x31, + 0x34, 0x22, 0x2f, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x41, 0x64, + 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x64, + 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x31, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0x3e, 0x31, 0x30, 0x3c, 0x2f, 0x70, + 0x65, 0x3d, 0x22, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x22, 0x3e, 0x31, 0x30, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, - 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, - 0x47, 0x74, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x22, 0x20, 0x69, 0x64, - 0x3d, 0x22, 0x6b, 0x72, 0x62, 0x35, 0x5f, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, + 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3e, + 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, - 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, - 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, + 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x3e, 0x31, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, - 0x3e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x20, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x47, 0x74, 0x6b, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0x20, 0x69, + 0x64, 0x3d, 0x22, 0x6b, 0x72, 0x62, 0x35, 0x5f, + 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x22, 0x3e, 0x3c, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, + 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, + 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, + 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, + 0x22, 0x3e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x72, 0x3d, 0x22, 0x6b, 0x61, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x5f, 0x68, 0x69, 0x64, 0x65, 0x22, 0x20, + 0x73, 0x77, 0x61, 0x70, 0x70, 0x65, 0x64, 0x3d, + 0x22, 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x3c, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x47, + 0x72, 0x69, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x67, 0x72, 0x69, 0x64, 0x31, 0x22, 0x3e, + 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, + 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, + 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, + 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, + 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, - 0x3d, 0x22, 0x6b, 0x61, 0x5f, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x5f, 0x68, 0x69, 0x64, 0x65, 0x22, 0x20, 0x73, - 0x77, 0x61, 0x70, 0x70, 0x65, 0x64, 0x3d, 0x22, - 0x6e, 0x6f, 0x22, 0x2f, 0x3e, 0x3c, 0x63, 0x68, + 0x65, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, + 0x3e, 0x35, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x47, 0x72, - 0x69, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, - 0x67, 0x72, 0x69, 0x64, 0x31, 0x22, 0x3e, 0x3c, + 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x54, 0x72, + 0x65, 0x65, 0x56, 0x69, 0x65, 0x77, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x6b, 0x72, 0x62, 0x35, + 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x5f, 0x74, 0x72, 0x65, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, + 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, + 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, + 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, + 0x6b, 0x54, 0x72, 0x65, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x69, 0x64, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x2d, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, + 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, + 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, + 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, + 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, + 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, + 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x62, 0x61, 0x72, 0x22, 0x3e, 0x3c, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x61, + 0x72, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, @@ -3848,61 +3919,44 @@ static const SECTION union { const guint8 data[31908]; const double alignment; v 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, - 0x35, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x62, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x22, 0x3e, 0x54, 0x72, 0x75, + 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x54, 0x72, 0x65, - 0x65, 0x56, 0x69, 0x65, 0x77, 0x22, 0x20, 0x69, - 0x64, 0x3d, 0x22, 0x6b, 0x72, 0x62, 0x35, 0x5f, - 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x5f, - 0x74, 0x72, 0x65, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, - 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, - 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75, + 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x69, 0x64, 0x3d, + 0x22, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x62, 0x74, 0x6e, 0x22, + 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, + 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, + 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, - 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2d, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x3d, 0x22, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, - 0x54, 0x72, 0x65, 0x65, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x69, - 0x64, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x2d, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x3e, - 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, - 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, - 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, - 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, + 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, + 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x47, 0x65, + 0x74, 0x20, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, - 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, + 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x3e, 0x0a, 0x00, 0x00, 0x28, 0x75, - 0x75, 0x61, 0x79, 0x29, 0x6f, 0x72, 0x67, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x3e, 0x0a, 0x00, 0x00, 0x28, 0x75, 0x75, + 0x61, 0x79, 0x29, 0x6f, 0x72, 0x67, 0x2f, 0x00, 0x09, 0x00, 0x00, 0x00, 0x6b, 0x72, 0x62, 0x35, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x2d, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2f, 0x00, 0x00, 0x00, diff --git a/src/resources/ui/ka-main-window.ui b/src/resources/ui/ka-main-window.ui index 47d1fbe..8554521 100644 --- a/src/resources/ui/ka-main-window.ui +++ b/src/resources/ui/ka-main-window.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.18.3 --> +<!-- Generated with glade 3.20.0 --> <interface> - <requires lib="gtk+" version="3.0"/> + <requires lib="gtk+" version="3.14"/> <object class="GtkAdjustment" id="adjustment1"> <property name="upper">100</property> <property name="step_increment">1</property> @@ -32,5 +32,19 @@ </child> </object> </child> + <child type="titlebar"> + <object class="GtkHeaderBar" id="header"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="show_close_button">True</property> + <child> + <object class="GtkButton" id="get_ticket_btn"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Get Ticket</property> + </object> + </child> + </object> + </child> </object> </interface> |