1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <stdlib.h>
#include "remmina/types.h"
#include "remmina_public.h"
#include "remmina_external_tools.h"
typedef struct _RemminaExternalTools
{
gchar remminafilename[MAX_PATH_LEN];
gchar scriptfilename[MAX_PATH_LEN];
} RemminaExternalTools;
void view_popup_menu_onDoSomething (GtkWidget *menuitem, gpointer userdata)
{
/* we passed the view as userdata when we connected the signal */
RemminaExternalTools *ret = (RemminaExternalTools *)userdata;
//gchar* filename_remmina = ret->remminafilename;
//gchar* filename_script = ret->scriptfilename;
remmina_external_tools_launcher(ret->remminafilename,ret->scriptfilename);
}
gboolean remmina_external_tools_from_filename(RemminaMain *remminamain,gchar* remminafilename)
{
GtkWidget *menu, *menuitem;
menu = gtk_menu_new();
gchar dirname[MAX_PATH_LEN];
gchar filename[MAX_PATH_LEN];
GDir* dir;
const gchar* name;
GNode* root;
root = g_node_new(NULL);
g_snprintf(dirname, MAX_PATH_LEN, "/usr/share/remmina/external_tools");
dir = g_dir_open(dirname, 0, NULL);
if (dir == NULL)
return FALSE;
while ((name = g_dir_read_name(dir)) != NULL)
{
if (!g_str_has_prefix(name, "remmina_"))
continue;
g_snprintf(filename, MAX_PATH_LEN, "%s/%s", dirname, name);
RemminaExternalTools *ret;
ret = (RemminaExternalTools *)malloc(sizeof(RemminaExternalTools));
strcpy(ret->remminafilename,remminafilename);
strcpy(ret->scriptfilename,filename);
menuitem = gtk_menu_item_new_with_label(strndup(name + 8, strlen(name) -8));
g_signal_connect(menuitem, "activate", (GCallback) view_popup_menu_onDoSomething, ret);
//g_signal_connect(menuitem, "activate",
// (GCallback) view_popup_menu_onDoSomething, treeview);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
}
g_dir_close(dir);
gtk_widget_show_all(menu);
/* Note: event can be NULL here when called from view_onPopupMenu;
* gdk_event_get_time() accepts a NULL argument
*/
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,0,0);
return TRUE;
}
gboolean remmina_external_tools_launcher(const gchar* filename,const gchar* scriptname)
{
RemminaFile *remminafile;
gchar launcher[MAX_PATH_LEN];
g_snprintf(launcher, MAX_PATH_LEN, "/usr/share/remmina/external_tools/launcher.sh");
remminafile = remmina_file_load(filename);
GHashTableIter iter;
const gchar *key, *value;
g_hash_table_iter_init(&iter, remminafile->settings);
while (g_hash_table_iter_next(&iter, (gpointer*) &key, (gpointer*) &value))
{
const char *env_format = "%s=%s";
const size_t len = strlen(key) +strlen(value) + strlen(env_format);
char *env = (char *) malloc(len);
if (env == NULL)
{
return -1;
}
int retval = snprintf(env, len, env_format, key,value);
if (retval < 0 || (size_t) retval >= len)
{
/* Handle error */
}
if (putenv(env) != 0)
{
free(env);
}
}
const size_t cmdlen = strlen(launcher) +strlen(scriptname) + 2;
gchar *cmd = (gchar *)malloc(cmdlen);
g_snprintf(cmd, cmdlen, "%s %s", launcher, scriptname);
system(cmd);
free(cmd);
return TRUE;
}
|