-- _________________________ Ryan Niebur [email protected]
diff -urN gstm-1.2/src/callbacks.c 3.has_restart_callback_and_dock_menu_entry/src/callbacks.c
--- gstm-1.2/src/callbacks.c 2006-08-03 04:39:51.000000000 -0400
+++ 3.has_restart_callback_and_dock_menu_entry/src/callbacks.c 2007-01-29 02:13:38.865578287 -0500
@@ -446,6 +446,31 @@
}
void
+on_dockletmenu_reset_current_connections (GtkMenuItem *menuitem,
+ gpointer user_data) {
+ /* Here we don't care about the menu item or the user data. */
+ /* add tunnels to the menu, based on the maindialog list (it's sorted) */
+ gboolean ret;
+ int v_id;
+ extern GtkWidget *maindialog;
+ extern GtkListStore *tunnellist_store;
+ GtkTreeIter i;
+
+ ret = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(tunnellist_store),&i);
+ while (ret) {
+ gtk_tree_model_get (GTK_TREE_MODEL(tunnellist_store), &i, COL_ID, &v_id, -1);
+ if (gSTMtunnels[v_id]!=NULL) {
+ gboolean active = gSTMtunnels[v_id]->active;
+ if (active) {
+ gstm_ssht_stoptunnel(v_id);
+ gstm_ssht_starttunnel(v_id);
+ }
+ }
+ ret=gtk_tree_model_iter_next(GTK_TREE_MODEL(tunnellist_store),&i);
+ }
+}
+
+void
on_btn_copy_clicked (GtkButton *button,
gpointer user_data)
{
diff -urN gstm-1.2/src/callbacks.h 3.has_restart_callback_and_dock_menu_entry/src/callbacks.h
--- gstm-1.2/src/callbacks.h 2006-08-03 02:31:13.000000000 -0400
+++ 3.has_restart_callback_and_dock_menu_entry/src/callbacks.h 2007-01-29 02:13:39.002073385 -0500
@@ -165,3 +165,7 @@
void
on_btn_copy_clicked (GtkButton *button,
gpointer user_data);
+
+void
+on_dockletmenu_reset_current_connections (GtkMenuItem *menuitem,
+ gpointer user_data);
diff -urN gstm-1.2/src/conffile.h 3.has_restart_callback_and_dock_menu_entry/src/conffile.h
--- gstm-1.2/src/conffile.h 2006-07-20 05:26:51.000000000 -0400
+++ 3.has_restart_callback_and_dock_menu_entry/src/conffile.h 2007-01-29 02:13:38.763963108 -0500
@@ -35,6 +35,7 @@
gboolean active;
int sshpid;
char *fn;
+ GThread* thread;
} stunnel, *sshtunnelPtr;
struct sshtunnel **gSTMtunnels;
diff -urN gstm-1.2/src/fniface.c 3.has_restart_callback_and_dock_menu_entry/src/fniface.c
--- gstm-1.2/src/fniface.c 2006-08-03 03:04:12.000000000 -0400
+++ 3.has_restart_callback_and_dock_menu_entry/src/fniface.c 2007-01-29 02:14:31.720420742 -0500
@@ -481,6 +481,9 @@
GtkWidget *dmenu;
GtkWidget *item_toggle;
GtkWidget *separator1;
+ GtkWidget *item_reset;
+ GtkWidget *image_reset;
+ GtkWidget *separator3;
GtkWidget *image_toggle;
GtkWidget *separator2;
GtkWidget *item_quit;
@@ -511,6 +514,18 @@
gtk_container_add (GTK_CONTAINER (dmenu), separator1);
gtk_widget_set_sensitive (separator1, FALSE);
+ /* Add a reset button to the menu */
+ image_reset = gtk_image_new_from_stock ("gtk-refresh", GTK_ICON_SIZE_MENU);
+ item_reset = gtk_image_menu_item_new_with_mnemonic (_("Restart active connections"));
+ gtk_widget_show(item_reset);
+ gtk_container_add (GTK_CONTAINER (dmenu), item_reset);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item_reset), image_reset);
+
+ separator3 = gtk_separator_menu_item_new ();
+ gtk_widget_show (separator3);
+ gtk_container_add (GTK_CONTAINER (dmenu), separator3);
+ gtk_widget_set_sensitive (separator3, FALSE);
+
/* add tunnels to the menu, based on the maindialog list (it's sorted) */
ret = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(tunnellist_store),&i);
while (ret) {
@@ -537,6 +552,9 @@
g_signal_connect ((gpointer) item_quit, "activate",
G_CALLBACK (on_dockletmenu_quit_activate),
NULL);
+ g_signal_connect ((gpointer) item_reset, "activate",
+ G_CALLBACK(on_dockletmenu_reset_current_connections),
+ NULL);
return dmenu;
}
diff -urN gstm-1.2/src/fnssht.c 3.has_restart_callback_and_dock_menu_entry/src/fnssht.c
--- gstm-1.2/src/fnssht.c 2006-08-03 04:36:35.000000000 -0400
+++ 3.has_restart_callback_and_dock_menu_entry/src/fnssht.c 2007-01-29 02:13:38.194706492 -0500
@@ -179,7 +179,19 @@
int i,k;
GThread *ret;
- if (!gSTMtunnels[id]->active) {
+ if (gSTMtunnels[id]->active) {
+ // if we tried to start an active tunnel, then stop it
+ // and wait on its thread.
+ //hmm, we tried to activate an active tunnel ?
+ //perhaps an error dialog, but for now just ignore this cause it shouldn't happen
+ gstm_ssht_stoptunnel(id);
+ if(gSTMtunnels[id]->thread != NULL) {
+ g_thread_join(gSTMtunnels[id]->thread);
+ }
+ }
+
+ g_assert(!gSTMtunnels[id]->active);
+
hargs = malloc(sizeof(struct Shelperargs));
hargs->tid = id;
hargs->sshargs=NULL;
@@ -219,18 +231,18 @@
hargs->sshargs = gstm_ssht_addssharg(hargs->sshargs, NULL); //end list
// good, now start the helper thread
- ret = g_thread_create((GThreadFunc)gstm_ssht_helperthread,hargs,FALSE,NULL);
+ ret = g_thread_create((GThreadFunc)gstm_ssht_helperthread,hargs,TRUE,NULL);
if (ret!=NULL) {
gSTMtunnels[id]->active = TRUE;
+ gSTMtunnels[id]->thread = ret;
activeCount++;
} else {
gSTMtunnels[id]->active=FALSE;
+ gSTMtunnels[id]->thread=NULL;
gstm_interface_error("g_thread_create error!\n");
+
}
- } else {
- //hmm, we tried to activate an active tunnel ?
- //perhaps an error dialog, but for now just ignore this cause it shouldn't happen
- }
+
}
int gstm_ssht_stoptunnel(int id) {
signature.asc
Description: Digital signature

