40 INCLUDE_GET_AVAILABLE_XDISPLAY
42 #define REMMINA_PLUGIN_XDMCP_FEATURE_TOOL_SENDCTRLALTDEL 1 43 #define REMMINA_PLUGIN_XDMCP_FEATURE_GTKSOCKET 1 45 #define GET_PLUGIN_DATA(gp) (RemminaPluginXdmcpData*)g_object_get_data(G_OBJECT(gp), "plugin-data"); 95 gpdata->
display = remmina_get_available_xdisplay();
102 argv[argc++] = g_strdup(
"Xephyr");
104 argv[argc++] = g_strdup_printf(
":%i", gpdata->
display);
106 argv[argc++] = g_strdup(
"-parent");
107 argv[argc++] = g_strdup_printf(
"%i", gpdata->
socket_id);
114 i = remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 8);
116 argv[argc++] = g_strdup(
"-screen");
117 argv[argc++] = g_strdup_printf(
"%ix%ix%i",
123 argv[argc++] = g_strdup(
"-grayscale");
126 if (remmina_plugin_service->
file_get_int(remminafile,
"showcursor", FALSE)) {
127 argv[argc++] = g_strdup(
"-host-cursor");
129 if (remmina_plugin_service->
file_get_int(remminafile,
"once", FALSE)) {
130 argv[argc++] = g_strdup(
"-once");
133 if (remmina_plugin_service->
file_get_int(remminafile,
"listen_on_tcp", FALSE)) {
134 argv[argc++] = g_strdup(
"-listen");
135 argv[argc++] = g_strdup(
"tcp");
138 if (!remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE)) {
142 argv[argc++] = g_strdup(
"-query");
146 argv[argc++] = g_strdup(
"-port");
147 argv[argc++] = g_strdup_printf(
"%i", i);
152 argv[argc++] = g_strdup(
"-nolisten");
153 argv[argc++] = g_strdup(
"tcp");
157 argv[argc++] = g_strdup(
"-ac");
162 ret = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &gpdata->
pid, &error);
163 for (i = 0; i < argc; i++)
177 TRACE_CALL(__func__);
185 while (!gpdata->
ready)
195 "xqproxy -display %i -host %s -port %i -query -manage", remotedisplay, server, port);
201 TRACE_CALL(__func__);
207 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE)) {
226 TRACE_CALL(__func__);
227 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
238 TRACE_CALL(__func__);
242 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", gpdata, g_free);
244 gpdata->
socket = gtk_socket_new();
246 gtk_widget_show(gpdata->
socket);
249 gtk_container_add(GTK_CONTAINER(gp), gpdata->
socket);
257 TRACE_CALL(__func__);
264 _(
"The protocol “%s” is unavailable because GtkSocket only works under X.Org."),
265 remmina_plugin_xdmcp.
name);
275 gtk_widget_set_size_request(GTK_WIDGET(gp), width, height);
279 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE)) {
282 "Could not start pthread. Using non-threaded mode instead…");
296 TRACE_CALL(__func__);
300 pthread_cancel(gpdata->
thread);
305 kill(gpdata->
pid, SIGTERM);
306 g_spawn_close_pid(gpdata->
pid);
318 TRACE_CALL(__func__);
319 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
323 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
328 TRACE_CALL(__func__);
334 TRACE_CALL(__func__);
336 switch (feature->
id) {
337 case REMMINA_PLUGIN_XDMCP_FEATURE_TOOL_SENDCTRLALTDEL:
349 "2",
N_(
"Grayscale"),
350 "8",
N_(
"256 colours"),
351 "16",
N_(
"High colour (16 bit)"),
352 "24",
N_(
"True colour (24 bit)"),
391 N_(
"XDMCP - X Remote Session"),
394 "remmina-xdmcp-symbolic",
395 "remmina-xdmcp-ssh-symbolic",
411 G_MODULE_EXPORT gboolean
414 TRACE_CALL(__func__);
415 remmina_plugin_service = service;
417 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
418 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)
struct _RemminaPluginXdmcpData RemminaPluginXdmcpData
void(* protocol_plugin_set_display)(RemminaProtocolWidget *gp, gint display)
static void remmina_plugin_xdmcp_on_plug_added(GtkSocket *socket, RemminaProtocolWidget *gp)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
void(* protocol_plugin_set_width)(RemminaProtocolWidget *gp, gint width)
static gpointer remmina_plugin_xdmcp_main_thread(gpointer data)
static gpointer colordepth_list[]
static void remmina_plugin_xdmcp_send_ctrlaltdel(RemminaProtocolWidget *gp)
gboolean(* protocol_plugin_ssh_exec)(RemminaProtocolWidget *gp, gboolean wait, const gchar *fmt,...)
static const RemminaProtocolFeature remmina_plugin_xdmcp_features[]
void(* protocol_plugin_send_keys_signals)(GtkWidget *widget, const guint *keyvals, int length, GdkEventType action)
void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_xdmcp_main(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_xdmcp_start_xephyr(RemminaProtocolWidget *gp)
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
static gboolean remmina_plugin_xdmcp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static RemminaProtocolPlugin remmina_plugin_xdmcp
void(* protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp)
static RemminaPluginService * remmina_plugin_service
gboolean(* protocol_plugin_start_xport_tunnel)(RemminaProtocolWidget *gp, RemminaXPortTunnelInitFunc init_func)
gboolean(* register_plugin)(RemminaPlugin *plugin)
gboolean(* gtksocket_available)(void)
static gboolean remmina_plugin_xdmcp_tunnel_init_callback(RemminaProtocolWidget *gp, gint remotedisplay, const gchar *server, gint port)
static void remmina_plugin_xdmcp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static void remmina_plugin_xdmcp_on_plug_removed(GtkSocket *socket, RemminaProtocolWidget *gp)
gint(* get_profile_remote_height)(RemminaProtocolWidget *gp)
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_xdmcp_open_connection(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_xdmcp_close_connection(RemminaProtocolWidget *gp)
static const RemminaProtocolSetting remmina_plugin_xdmcp_basic_settings[]
gint(* get_profile_remote_width)(RemminaProtocolWidget *gp)
void(* protocol_plugin_register_hostkey)(RemminaProtocolWidget *gp, GtkWidget *widget)
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
static void remmina_plugin_xdmcp_init(RemminaProtocolWidget *gp)
N_("Unable to connect to VNC server")
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)