35
#include "common/remmina_plugin.h"
36
#include <spice-client.h>
37
#ifdef SPICE_GTK_CHECK_VERSION
38
# if SPICE_GTK_CHECK_VERSION(0, 31, 0)
39
# include <spice-client-gtk.h>
41
# include <spice-widget.h>
42
# include <usb-device-widget.h>
45
# include <spice-widget.h>
46
# include <usb-device-widget.h>
35
#include "spice_plugin.h"
49
37
#define XSPICE_DEFAULT_PORT 5900
51
#define GET_PLUGIN_DATA(gp) (RemminaPluginSpiceData*) g_object_get_data(G_OBJECT(gp), "plugin-data")
55
41
REMMINA_PLUGIN_SPICE_FEATURE_PREF_VIEWONLY = 1,
60
46
REMMINA_PLUGIN_SPICE_FEATURE_SCALE
63
typedef struct _RemminaPluginSpiceData
66
SpiceDisplay *display;
67
SpiceDisplayChannel *display_channel;
68
SpiceGtkSession *gtk_session;
69
SpiceMainChannel *main_channel;
70
SpiceSession *session;
71
} RemminaPluginSpiceData;
73
49
static RemminaPluginService *remmina_plugin_service = NULL;
75
51
static void remmina_plugin_spice_channel_new_cb(SpiceSession *, SpiceChannel *, RemminaProtocolWidget *);
77
53
static void remmina_plugin_spice_display_ready_cb(GObject *, GParamSpec *, RemminaProtocolWidget *);
78
54
static void remmina_plugin_spice_update_scale(RemminaProtocolWidget *);
56
void remmina_plugin_spice_select_usb_devices(RemminaProtocolWidget *);
80
58
static void remmina_plugin_spice_init(RemminaProtocolWidget *gp)
82
60
TRACE_CALL(__func__);
372
static void remmina_plugin_spice_usb_connect_failed_cb(GObject *object, SpiceUsbDevice *usb_device, GError *error, RemminaProtocolWidget *gp)
374
TRACE_CALL(__func__);
378
if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_CANCELLED)
384
* FIXME: Use the RemminaConnectionWindow as transient parent widget
385
* (and add the GTK_DIALOG_DESTROY_WITH_PARENT flag) if it becomes
386
* accessible from the Remmina plugin API.
388
dialog = gtk_message_dialog_new(NULL,
392
_("USB redirection error"));
393
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
396
gtk_dialog_run(GTK_DIALOG(dialog));
397
gtk_widget_destroy(dialog);
400
static void remmina_plugin_spice_select_usb_devices(RemminaProtocolWidget *gp)
402
TRACE_CALL(__func__);
404
GtkWidget *dialog, *usb_device_widget;
405
RemminaPluginSpiceData *gpdata = GET_PLUGIN_DATA(gp);
408
* FIXME: Use the RemminaConnectionWindow as transient parent widget
409
* (and add the GTK_DIALOG_DESTROY_WITH_PARENT flag) if it becomes
410
* accessible from the Remmina plugin API.
412
dialog = gtk_dialog_new_with_buttons(_("Select USB devices for redirection"),
418
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
420
usb_device_widget = spice_usb_device_widget_new(gpdata->session, NULL);
421
g_signal_connect(usb_device_widget,
423
G_CALLBACK(remmina_plugin_spice_usb_connect_failed_cb),
426
gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
431
gtk_widget_show_all(dialog);
432
gtk_dialog_run(GTK_DIALOG(dialog));
433
gtk_widget_destroy(dialog);
436
350
static gboolean remmina_plugin_spice_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
438
352
TRACE_CALL(__func__);