[Spice-devel] [PATCH spice-gtk] spicy: remove connect dialog

marcandre.lureau at redhat.com marcandre.lureau at redhat.com
Wed Aug 9 20:49:51 UTC 2017


From: Marc-André Lureau <marcandre.lureau at redhat.com>

The connect dialog isn't working properly when recent entries are for
spice+unix://. We could improve the recent dialog, but spicy isn't
meant to be a fully-feature spice client.

It makes user believe that it is a end-user application. It is not, it
is only meant to do testing. So if you need to lookup recent
connections, you can use the shell history instead.

Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
---
 doc/reference/Makefile.am |   1 -
 tools/Makefile.am         |   2 -
 tools/spicy-connect.c     | 248 ----------------------------------------------
 tools/spicy-connect.h     |  26 -----
 tools/spicy.c             | 115 +++------------------
 5 files changed, 15 insertions(+), 377 deletions(-)
 delete mode 100644 tools/spicy-connect.c
 delete mode 100644 tools/spicy-connect.h

diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am
index 9fda456..cc7abe7 100644
--- a/doc/reference/Makefile.am
+++ b/doc/reference/Makefile.am
@@ -50,7 +50,6 @@ IGNORE_HFILES=					\
 	spice-uri-priv.h			\
 	spice-util-priv.h			\
 	spice-widget-priv.h			\
-	spicy-connect.h				\
 	usb-acl-helper.h			\
 	usb-device-manager-priv.h		\
 	usbdk_api.h				\
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 52523e1..5b7c4de 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -19,8 +19,6 @@ endif
 
 spicy_SOURCES =				\
 	spicy.c				\
-	spicy-connect.h 		\
-	spicy-connect.c 		\
 	spice-cmdline.h			\
 	spice-cmdline.c			\
 	$(NULL)
diff --git a/tools/spicy-connect.c b/tools/spicy-connect.c
deleted file mode 100644
index 39555a6..0000000
--- a/tools/spicy-connect.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
-   Copyright (C) 2010-2015 Red Hat, Inc.
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include "spice-common.h"
-#include "spicy-connect.h"
-
-typedef struct
-{
-    gboolean connecting;
-    GMainLoop *loop;
-    SpiceSession *session;
-} ConnectionInfo;
-
-static struct {
-    const char *text;
-    const char *prop;
-    GtkWidget *entry;
-} connect_entries[] = {
-    { .text = "Hostname",   .prop = "host"      },
-    { .text = "Port",       .prop = "port"      },
-    { .text = "TLS Port",   .prop = "tls-port"  },
-};
-
-static gboolean can_connect(void)
-{
-    if ((gtk_entry_get_text_length(GTK_ENTRY(connect_entries[0].entry)) > 0) &&
-        ((gtk_entry_get_text_length(GTK_ENTRY(connect_entries[1].entry)) > 0) ||
-         (gtk_entry_get_text_length(GTK_ENTRY(connect_entries[2].entry)) > 0)))
-        return TRUE;
-
-    return FALSE;
-}
-
-static void set_connection_info(SpiceSession *session)
-{
-    const gchar *txt;
-    int i;
-
-    for (i = 0; i < SPICE_N_ELEMENTS(connect_entries); i++) {
-        txt = gtk_entry_get_text(GTK_ENTRY(connect_entries[i].entry));
-        g_object_set(session, connect_entries[i].prop, txt, NULL);
-    }
-}
-
-static gboolean close_cb(gpointer data)
-{
-    ConnectionInfo *info = data;
-    info->connecting = FALSE;
-    if (g_main_loop_is_running(info->loop))
-        g_main_loop_quit(info->loop);
-
-    return TRUE;
-}
-
-static void entry_changed_cb(GtkEditable* entry, gpointer data)
-{
-    GtkButton *connect_button = data;
-    gtk_widget_set_sensitive(GTK_WIDGET(connect_button), can_connect());
-}
-
-static gboolean entry_focus_in_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
-    GtkRecentChooser *recent = GTK_RECENT_CHOOSER(data);
-    gtk_recent_chooser_unselect_all(recent);
-    return TRUE;
-}
-
-static gboolean key_pressed_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
-    gboolean tst;
-    if (event->type == GDK_KEY_PRESS) {
-        switch (event->key.keyval) {
-            case GDK_KEY_Escape:
-                g_signal_emit_by_name(GTK_WIDGET(data), "delete-event", NULL, &tst);
-                return TRUE;
-            default:
-                return FALSE;
-        }
-    }
-
-    return FALSE;
-}
-
-static void recent_selection_changed_dialog_cb(GtkRecentChooser *chooser, gpointer data)
-{
-    GtkRecentInfo *info;
-    gchar *txt = NULL;
-    const gchar *uri;
-    SpiceSession *session = data;
-    int i;
-
-    info = gtk_recent_chooser_get_current_item(chooser);
-    if (info == NULL)
-        return;
-
-    uri = gtk_recent_info_get_uri(info);
-    g_return_if_fail(uri != NULL);
-
-    g_object_set(session, "uri", uri, NULL);
-
-    for (i = 0; i < SPICE_N_ELEMENTS(connect_entries); i++) {
-        g_object_get(session, connect_entries[i].prop, &txt, NULL);
-        gtk_entry_set_text(GTK_ENTRY(connect_entries[i].entry), txt ? txt : "");
-        g_free(txt);
-    }
-
-    gtk_recent_info_unref(info);
-}
-
-static void connect_cb(gpointer data)
-{
-    ConnectionInfo *info = data;
-    if (can_connect())
-    {
-        info->connecting = TRUE;
-        set_connection_info(info->session);
-        if (g_main_loop_is_running(info->loop))
-            g_main_loop_quit(info->loop);
-    }
-}
-
-gboolean spicy_connect_dialog(SpiceSession *session)
-{
-    GtkWidget *connect_button, *cancel_button, *label;
-    GtkBox *main_box, *recent_box, *button_box;
-    GtkWindow *window;
-    GtkGrid *grid;
-    int i;
-
-    ConnectionInfo info = {
-        FALSE,
-        NULL,
-        session
-    };
-
-    /* Create the widgets */
-    window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
-    gtk_window_set_title(window, "Connect to SPICE");
-    gtk_window_set_resizable(window, FALSE);
-    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
-
-    main_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
-    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(main_box));
-
-    grid = GTK_GRID(gtk_grid_new());
-    gtk_box_pack_start(main_box, GTK_WIDGET(grid), FALSE, TRUE, 0);
-    gtk_container_set_border_width(GTK_CONTAINER(grid), 5);
-    gtk_grid_set_row_spacing(grid, 5);
-    gtk_grid_set_column_spacing(grid, 5);
-
-    for (i = 0; i < SPICE_N_ELEMENTS(connect_entries); i++) {
-        gchar *txt;
-        label = gtk_label_new(connect_entries[i].text);
-        gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-        gtk_grid_attach(grid, label, 0, i, 1, 1);
-        connect_entries[i].entry = GTK_WIDGET(gtk_entry_new());
-        gtk_grid_attach(grid, connect_entries[i].entry, 1, i, 1, 1);
-        g_object_get(session, connect_entries[i].prop, &txt, NULL);
-        SPICE_DEBUG("%s: #%i [%s]: \"%s\"",
-                __FUNCTION__, i, connect_entries[i].prop, txt);
-        if (txt) {
-            gtk_entry_set_text(GTK_ENTRY(connect_entries[i].entry), txt);
-            g_free(txt);
-        }
-    }
-
-    recent_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
-    gtk_box_pack_start(main_box, GTK_WIDGET(recent_box), TRUE, TRUE, 0);
-    gtk_container_set_border_width(GTK_CONTAINER(recent_box), 5);
-
-    label = gtk_label_new("Recent connections:");
-    gtk_box_pack_start(recent_box, label, FALSE, TRUE, 0);
-    gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-
-    button_box = GTK_BOX(gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL));
-    gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_END);
-    gtk_box_set_spacing(button_box, 5);
-    gtk_container_set_border_width(GTK_CONTAINER(button_box), 5);
-    connect_button = gtk_button_new_with_label("Connect");
-    cancel_button = gtk_button_new_with_label("Cancel");
-    gtk_box_pack_start(button_box, cancel_button, FALSE, TRUE, 0);
-    gtk_box_pack_start(button_box, connect_button, FALSE, TRUE, 1);
-
-    gtk_box_pack_start(main_box, GTK_WIDGET(button_box), FALSE, TRUE, 0);
-
-    gtk_widget_set_sensitive(GTK_WIDGET(connect_button), can_connect());
-
-    g_signal_connect(window, "key-press-event",
-                     G_CALLBACK(key_pressed_cb), window);
-    g_signal_connect_swapped(window, "delete-event",
-                             G_CALLBACK(close_cb), &info);
-    g_signal_connect_swapped(connect_button, "clicked",
-                             G_CALLBACK(connect_cb), &info);
-    g_signal_connect_swapped(cancel_button, "clicked",
-                             G_CALLBACK(close_cb), &info);
-
-    GtkRecentFilter *rfilter;
-    GtkWidget *recent;
-
-    recent = GTK_WIDGET(gtk_recent_chooser_widget_new());
-    gtk_recent_chooser_set_show_icons(GTK_RECENT_CHOOSER(recent), FALSE);
-    gtk_box_pack_start(recent_box, recent, TRUE, TRUE, 0);
-
-    rfilter = gtk_recent_filter_new();
-    gtk_recent_filter_add_mime_type(rfilter, "application/x-spice");
-    gtk_recent_chooser_set_filter(GTK_RECENT_CHOOSER(recent), rfilter);
-    gtk_recent_chooser_set_local_only(GTK_RECENT_CHOOSER(recent), FALSE);
-    g_signal_connect(recent, "selection-changed",
-                     G_CALLBACK(recent_selection_changed_dialog_cb), session);
-    g_signal_connect_swapped(recent, "item-activated",
-                             G_CALLBACK(connect_cb), &info);
-
-    for (i = 0; i < SPICE_N_ELEMENTS(connect_entries); i++) {
-        g_signal_connect_swapped(connect_entries[i].entry, "activate",
-                                 G_CALLBACK(connect_cb), &info);
-        g_signal_connect(connect_entries[i].entry, "changed",
-                         G_CALLBACK(entry_changed_cb), connect_button);
-        g_signal_connect(connect_entries[i].entry, "focus-in-event",
-                         G_CALLBACK(entry_focus_in_cb), recent);
-    }
-
-    /* show and wait for response */
-    gtk_widget_show_all(GTK_WIDGET(window));
-
-    info.loop = g_main_loop_new(NULL, FALSE);
-    g_main_loop_run(info.loop);
-
-    gtk_widget_destroy(GTK_WIDGET(window));
-
-    return info.connecting;
-}
diff --git a/tools/spicy-connect.h b/tools/spicy-connect.h
deleted file mode 100644
index 56b2d80..0000000
--- a/tools/spicy-connect.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/*
-   Copyright (C) 2010-2015 Red Hat, Inc.
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef SPICY_CONNECT_H
-#define SPICY_CONNECT_H
-
-#include "spice-widget.h"
-
-gboolean spicy_connect_dialog(SpiceSession *session);
-
-#endif
diff --git a/tools/spicy.c b/tools/spicy.c
index 40cd6b3..5e6a620 100644
--- a/tools/spicy.c
+++ b/tools/spicy.c
@@ -36,7 +36,6 @@
 #include "spice-option.h"
 #include "usb-device-widget.h"
 
-#include "spicy-connect.h"
 #if HAVE_GSTAUDIO || HAVE_GSTVIDEO
 #include <gst/gst.h>
 #endif
@@ -67,7 +66,6 @@ struct _SpiceWindow {
     gint             monitor_id;
     GtkWidget        *toplevel, *spice;
     GtkWidget        *menubar, *toolbar;
-    GtkWidget        *ritem, *rmenu;
     GtkWidget        *statusbar, *status, *st[STATE_MAX];
     GtkActionGroup   *ag;
     GtkUIManager     *ui;
@@ -252,14 +250,6 @@ static void update_edit_menu(struct spice_connection *conn)
     }
 }
 
-static void menu_cb_connect(GtkAction *action, void *data)
-{
-    struct spice_connection *conn;
-
-    conn = connection_new();
-    connection_connect(conn);
-}
-
 static void menu_cb_close(GtkAction *action, void *data)
 {
     SpiceWindow *win = data;
@@ -692,9 +682,6 @@ static const GtkActionEntry entries[] = {
     {
         .name        = "FileMenu",
         .label       = "_File",
-    },{
-        .name        = "FileRecentMenu",
-        .label       = "_Recent",
     },{
         .name        = "EditMenu",
         .label       = "_Edit",
@@ -717,13 +704,6 @@ static const GtkActionEntry entries[] = {
         .name        = "HelpMenu",
         .label       = "_Help",
     },{
-
-        /* File menu */
-        .name        = "Connect",
-        .stock_id    = "_Connect",
-        .label       = "_Connect ...",
-        .callback    = G_CALLBACK(menu_cb_connect),
-    },{
         .name        = "Close",
         .stock_id    = "window-close",
         .label       = "_Close",
@@ -908,9 +888,6 @@ static char ui_xml[] =
 "<ui>\n"
 "  <menubar action='MainMenu'>\n"
 "    <menu action='FileMenu'>\n"
-"      <menuitem action='Connect'/>\n"
-"      <menu action='FileRecentMenu'/>\n"
-"      <separator/>\n"
 "      <menuitem action='Close'/>\n"
 "    </menu>\n"
 "    <menu action='EditMenu'>\n"
@@ -988,23 +965,6 @@ static gboolean is_gtk_session_property(const gchar *property)
     return FALSE;
 }
 
-static void recent_item_activated_cb(GtkRecentChooser *chooser, gpointer data)
-{
-    GtkRecentInfo *info;
-    struct spice_connection *conn;
-    const char *uri;
-
-    info = gtk_recent_chooser_get_current_item(chooser);
-
-    uri = gtk_recent_info_get_uri(info);
-    g_return_if_fail(uri != NULL);
-
-    conn = connection_new();
-    g_object_set(conn->session, "uri", uri, NULL);
-    gtk_recent_info_unref(info);
-    connection_connect(conn);
-}
-
 static void compression_cb(GtkRadioAction *action G_GNUC_UNUSED,
                            GtkRadioAction *current,
                            gpointer user_data)
@@ -1098,22 +1058,6 @@ static SpiceWindow *create_spice_window(spice_connection *conn, SpiceChannel *ch
     win->menubar = gtk_ui_manager_get_widget(win->ui, "/MainMenu");
     win->toolbar = gtk_ui_manager_get_widget(win->ui, "/ToolBar");
 
-    /* recent menu */
-    win->ritem  = gtk_ui_manager_get_widget
-        (win->ui, "/MainMenu/FileMenu/FileRecentMenu");
-
-    GtkRecentFilter  *rfilter;
-
-    win->rmenu = gtk_recent_chooser_menu_new();
-    gtk_recent_chooser_set_show_icons(GTK_RECENT_CHOOSER(win->rmenu), FALSE);
-    rfilter = gtk_recent_filter_new();
-    gtk_recent_filter_add_mime_type(rfilter, "application/x-spice");
-    gtk_recent_chooser_add_filter(GTK_RECENT_CHOOSER(win->rmenu), rfilter);
-    gtk_recent_chooser_set_local_only(GTK_RECENT_CHOOSER(win->rmenu), FALSE);
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(win->ritem), win->rmenu);
-    g_signal_connect(win->rmenu, "item-activated",
-                     G_CALLBACK(recent_item_activated_cb), win);
-
     /* spice display */
     win->spice = GTK_WIDGET(spice_display_new_with_monitor(conn->session, id, monitor_id));
     seq = spice_grab_sequence_new_from_string("Shift_L+F12");
@@ -1238,35 +1182,6 @@ static void destroy_spice_window(SpiceWindow *win)
     g_object_unref(win);
 }
 
-/* ------------------------------------------------------------------ */
-
-static void recent_add(SpiceSession *session)
-{
-    GtkRecentManager *recent;
-    GtkRecentData meta = {
-        .mime_type    = (char*)"application/x-spice",
-        .app_name     = (char*)"spicy",
-        .app_exec     = (char*)"spicy --uri=%u",
-    };
-    char *uri;
-
-    g_object_get(session, "uri", &uri, NULL);
-    SPICE_DEBUG("%s: %s", __FUNCTION__, uri);
-
-    recent = gtk_recent_manager_get_default();
-    if (g_str_has_prefix(uri, "spice://"))
-        meta.display_name = uri + 8;
-    else if (g_str_has_prefix(uri, "spice+unix://"))
-        meta.display_name = uri + 13;
-    else
-        g_return_if_reached();
-
-    if (!gtk_recent_manager_add_full(recent, uri, &meta))
-        g_warning("Recent item couldn't be added successfully");
-
-    g_free(uri);
-}
-
 static void main_channel_event(SpiceChannel *channel, SpiceChannelEvent event,
                                gpointer data)
 {
@@ -1278,7 +1193,6 @@ static void main_channel_event(SpiceChannel *channel, SpiceChannelEvent event,
     switch (event) {
     case SPICE_CHANNEL_OPENED:
         g_message("main channel: opened");
-        recent_add(conn->session);
         break;
     case SPICE_CHANNEL_SWITCHING:
         g_message("main channel: switching host");
@@ -1300,11 +1214,7 @@ static void main_channel_event(SpiceChannel *channel, SpiceChannelEvent event,
             g_message("channel error: %s", error->message);
         }
 
-        if (spicy_connect_dialog(conn->session)) {
-            connection_connect(conn);
-        } else {
-            connection_disconnect(conn);
-        }
+        connection_disconnect(conn);
         break;
     case SPICE_CHANNEL_ERROR_AUTH:
         g_warning("main channel: auth failure (wrong password?)");
@@ -1980,6 +1890,7 @@ int main(int argc, char *argv[])
     spice_connection *conn;
     gchar *conf_file, *conf;
     char *host = NULL, *port = NULL, *tls_port = NULL, *unix_path = NULL;
+    int ret = 1;
 
     keyfile = g_key_file_new();
 
@@ -2013,13 +1924,13 @@ int main(int argc, char *argv[])
 #endif
     if (!g_option_context_parse (context, &argc, &argv, &error)) {
         g_print("option parsing failed: %s\n", error->message);
-        exit(1);
+        goto end;
     }
-    g_option_context_free(context);
 
     if (version) {
         g_print("spicy " PACKAGE_VERSION "\n");
-        exit(0);
+        ret = 0;
+        goto end;
     }
 
     mainloop = g_main_loop_new(NULL, false);
@@ -2034,12 +1945,12 @@ int main(int argc, char *argv[])
                  "port", &port,
                  "tls-port", &tls_port,
                  NULL);
-    /* If user doesn't provide hostname and port, show the dialog window
-       instead of connecting to server automatically */
+    /* If user doesn't provide hostname and port, exit */
     if ((host == NULL || (port == NULL && tls_port == NULL)) && unix_path == NULL) {
-        if (!spicy_connect_dialog(conn->session)) {
-            exit(0);
-        }
+        char *help = g_option_context_get_help(context, TRUE, NULL);
+        g_print("%s", help);
+        g_free(help);
+        goto end;
     }
     g_free(host);
     g_free(port);
@@ -2065,5 +1976,9 @@ int main(int argc, char *argv[])
     g_free(spicy_title);
 
     setup_terminal(true);
-    return 0;
+    ret = 0;
+
+end:
+    g_option_context_free(context);
+    return ret;
 }
-- 
2.14.0.1.geff633fa0



More information about the Spice-devel mailing list