Hello all-
I've created a patch to allow a user to stop a trace with a SIGINT
(#18 on the wish list). Its not implemented to actually use SIGINT
since gtk registers a handler for that signal that I didn't really want
to override, but instead it registers signal handlers in gtk for
keyboard events and listens for ASCII 0x03 to end the tracing, which
from a look and feel standpoint, is the same thing, and I think a
generally better way to do this. Anywho, the patch is attached,
submitted for the maintainers approval :)
Neil
Index: capture.c
===================================================================
RCS file: /cvsroot/ethereal/capture.c,v
retrieving revision 1.208
diff -u -r1.208 capture.c
--- capture.c 23 Jul 2003 05:01:15 -0000 1.208
+++ capture.c 11 Sep 2003 13:35:39 -0000
@@ -247,6 +247,32 @@
int child_process;
#endif
+
+/*
+ * This needs to be static, so that the SIGUSR1 handler can clear the "go"
+ * flag.
+ */
+static loop_data ld;
+
+/*
+ *This is the ASCII value of a ctrl-c
+ */
+#define CTRL_C 0x03
+static void key_press_win(GtkWidget *widget,
+ GdkEventKey *key,
+ gpointer callback_data )
+{
+ /*
+ *check to see if the key press event
+ *is a ctrl-c. If it is, end the capture
+ */
+ if((char)*(key->string) == CTRL_C)
+ {
+ ld.go = FALSE;
+ }
+}
+
+
/* Add a string pointer to a NULL-terminated array of string pointers. */
static char **
add_arg(char **args, int *argc, char *arg)
@@ -1342,12 +1368,6 @@
}
#endif
-/*
- * This needs to be static, so that the SIGUSR1 handler can clear the "go"
- * flag.
- */
-static loop_data ld;
-
/* Do the low-level work of a capture.
Returns TRUE if it succeeds, FALSE otherwise. */
int
@@ -1696,6 +1716,8 @@
main_vb = gtk_vbox_new(FALSE, 1);
gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
gtk_container_add(GTK_CONTAINER(cap_w), main_vb);
+ gtk_signal_connect(GTK_OBJECT(cap_w), "key_press_event",
+ (GtkSignalFunc) key_press_win, NULL );
gtk_widget_show(main_vb);
counts_fr = gtk_frame_new("Captured Frames");
Index: gtk/main.c
===================================================================
RCS file: /cvsroot/ethereal/gtk/main.c,v
retrieving revision 1.310
diff -u -r1.310 main.c
--- gtk/main.c 10 Sep 2003 05:35:26 -0000 1.310
+++ gtk/main.c 11 Sep 2003 13:35:40 -0000
@@ -1483,6 +1483,24 @@
}
+/*
+ *This is the ASCII value of a ctrl-c
+ */
+#define CTRL_C 0x03
+static void key_press_handler(GtkWidget *widget,
+ GdkEventKey *key,
+ gpointer callback_data )
+{
+ /*
+ *check to see if the key press event
+ *is a ctrl-c. If it is, end the capture
+ */
+ if((char)*(key->string) == CTRL_C)
+ {
+ capture_stop();
+ }
+}
+
/* And now our feature presentation... [ fade to music ] */
int
main(int argc, char *argv[])
@@ -2663,6 +2681,8 @@
/* Main window */
top_level = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect(GTK_OBJECT(top_level), "key_press_event",
+ (GtkSignalFunc) key_press_handler, NULL );
gtk_widget_set_name(top_level, "main window");
SIGNAL_CONNECT(top_level, "delete_event", main_window_delete_event_cb,
NULL);