[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