39 #include <gdk/gdkkeysyms.h> 47 #define REMMINA_PLUGIN_ST_FEATURE_GTKSOCKET 1 57 #define REMMINA_PLUGIN_DEBUG(fmt, ...) remmina_plugin_service->_remmina_debug(__func__, fmt, ##__VA_ARGS__) 71 REMMINA_PLUGIN_DEBUG(
"[%s] Plugin plug added on socket %d", PLUGIN_NAME, gpdata->
socket_id);
79 REMMINA_PLUGIN_DEBUG(
"[%s] Plugin plug removed", PLUGIN_NAME);
86 REMMINA_PLUGIN_DEBUG(
"[%s] Plugin init", PLUGIN_NAME);
90 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", gpdata, g_free);
92 gpdata->
socket = gtk_socket_new();
94 gtk_widget_show(gpdata->
socket);
97 gtk_container_add(GTK_CONTAINER(gp), gpdata->
socket);
102 TRACE_CALL(__func__);
103 REMMINA_PLUGIN_DEBUG(
"[%s] Plugin open connection", PLUGIN_NAME);
104 #define ADD_ARGUMENT(name, value) \ 106 argv[argc] = g_strdup(name); \ 107 argv_debug[argc] = g_strdup(name); \ 111 argv[argc] = value; \ 112 argv_debug[argc++] = g_strdup(g_strcmp0(name, "-p") != 0 ? value : "XXXXX"); \ 117 GError *error = NULL;
119 gchar *argv_debug[50];
122 const gchar *wflag = NULL;
123 const gchar *command;
124 gboolean isterm = FALSE;
131 if (!remmina_plugin_service->
file_get_int(remminafile,
"detached", FALSE)) {
134 gtk_widget_set_size_request(GTK_WIDGET(gp), 640, 480);
138 term = remmina_plugin_service->
file_get_string(remminafile,
"terminal");
140 if (g_strcmp0(term,
"st") == 0) {
142 if (!g_find_program_in_path(term))
146 }
else if (g_strcmp0(term,
"urxvt") == 0) {
149 }
else if (g_strcmp0(term,
"xterm") == 0) {
150 wflag =
"-xrm 'XTerm*allowSendEvents: true' -into";
152 }
else if (g_strcmp0(term,
"vim") == 0) {
153 wflag =
"-g --socketid";
155 }
else if (g_strcmp0(term,
"emacs") == 0) {
156 wflag =
"--parent-id";
159 if (!g_find_program_in_path(term)) {
166 ADD_ARGUMENT(g_strdup_printf(
"%s", term), NULL);
169 ADD_ARGUMENT(g_strdup(wflag), g_strdup_printf(
"%i", gpdata->
socket_id));
172 if(command && isterm)
173 ADD_ARGUMENT(
"-e", g_strdup_printf(
"%s", command));
174 if(command && !isterm)
175 ADD_ARGUMENT(
"", g_strdup_printf(
"%s", command));
177 ADD_ARGUMENT(NULL, NULL);
179 command_line = g_strjoinv(g_strdup(
" "), (gchar **)&argv_debug[0]);
180 REMMINA_PLUGIN_DEBUG(
"[%s] starting %s", PLUGIN_NAME, command_line);
182 g_spawn_command_line_async(command_line, &error);
183 g_free(command_line);
186 for (i = 0; i < argc; i++)
188 g_free(argv_debug[i]);
198 if (!remmina_plugin_service->
file_get_int(remminafile,
"detached", FALSE)) {
199 REMMINA_PLUGIN_DEBUG(
"[%s] attached window to socket %d",
211 TRACE_CALL(__func__);
212 REMMINA_PLUGIN_DEBUG(
"[%s] Plugin close connection", PLUGIN_NAME);
219 "st",
"Suckless Simple Terminal",
220 "urxvt",
"rxvt-unicode",
222 "emacs",
"GNU Emacs",
223 "vim",
"Vim Text Editor",
293 TRACE_CALL(__func__);
294 remmina_plugin_service = service;
296 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
297 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
static void remmina_plugin_st_init(RemminaProtocolWidget *gp)
void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
static const RemminaProtocolSetting remmina_plugin_st_advanced_settings[]
static gboolean remmina_st_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
void(* protocol_plugin_set_width)(RemminaProtocolWidget *gp, gint width)
static void remmina_plugin_st_on_plug_removed(GtkSocket *socket, RemminaProtocolWidget *gp)
static gboolean remmina_plugin_st_open_connection(RemminaProtocolWidget *gp)
void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
void(* protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp)
static const RemminaProtocolFeature remmina_st_features[]
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
gboolean(* register_plugin)(RemminaPlugin *plugin)
static RemminaPluginService * remmina_plugin_service
static gpointer term_list[]
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
static void remmina_plugin_st_on_plug_added(GtkSocket *socket, RemminaProtocolWidget *gp)
static RemminaProtocolPlugin remmina_plugin
void(* protocol_plugin_register_hostkey)(RemminaProtocolWidget *gp, GtkWidget *widget)
static gboolean remmina_plugin_st_close_connection(RemminaProtocolWidget *gp)
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
static const RemminaProtocolSetting remmina_plugin_st_basic_settings[]
N_("Unable to connect to VNC server")
struct _RemminaPluginData RemminaPluginData