3 Copyright (C) 2000 Kh. Naba Kumar Singh
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include <libanjuta/resources.h>
32 #include "utilities.h"
35 static GtkWidget
* create_signals_set_dialog (Signals
*s
);
38 signals_update_controls (Signals
* ew
)
42 R
= ianjuta_debugger_get_status (ew
->debugger
, NULL
) == IANJUTA_DEBUGGER_OK
;
43 Pr
= ianjuta_debugger_get_status (ew
->debugger
, NULL
) == IANJUTA_DEBUGGER_PROGRAM_RUNNING
;
44 gtk_widget_set_sensitive (ew
->widgets
.menu_signal
, Pr
);
45 gtk_widget_set_sensitive (ew
->widgets
.menu_modify
, R
);
46 gtk_widget_set_sensitive (ew
->widgets
.menu_update
, R
);
50 signals_update (const GList
* lines
, gpointer data
)
55 gchar sig
[32], stop
[10], print
[10], pass
[10];
58 sg
= (Signals
*) data
;
60 list
= gdb_util_remove_blank_lines (lines
);
61 if (g_list_length (list
) < 2)
66 gtk_clist_freeze (GTK_CLIST(sg
->widgets
.clist
));
71 sscanf ((char *) node
->data
, "%s %s %s %s", sig
, stop
, print
, pass
);
73 node
= g_list_next (node
);
77 /* Do not worry. This is used to avoid the last line */
84 for (j
= 0; j
< 4; j
++)
86 while (isspace (*str
))
88 while (!isspace (*str
))
91 while (isspace (*str
))
94 gtk_clist_append (GTK_CLIST (sg
->widgets
.clist
), row
);
97 gtk_clist_thaw (GTK_CLIST(sg
->widgets
.clist
));
101 on_signals_clist_select_row (GtkCList
*clist
, gint row
,
102 gint column
, GdkEvent
*event
, gpointer user_data
)
104 Signals
*s
= (Signals
*)user_data
;
109 on_signals_delete_event(GtkWidget
* w
, GdkEvent
*event
, gpointer data
)
111 Signals
* cr
= (Signals
*) data
;
117 on_signals_key_press_event(GtkWidget
*widget
, GdkEventKey
*event
,
120 if (event
->keyval
== GDK_Escape
)
122 Signals
* cr
= (Signals
*) data
;
130 on_signals_modify_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
133 Signals
*s
= (Signals
*)user_data
;
135 dialog
= create_signals_set_dialog (s
);
137 gtk_widget_show (dialog
);
141 on_signals_send_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
145 Signals
*s
= (Signals
*)user_data
;
147 if (debugger_program_is_running (s
->debugger
) == FALSE
) return;
150 gtk_clist_get_text(GTK_CLIST (s
->widgets
.clist
), s
->idx
, 0, &sig
);
151 debugger_signal(sig
, TRUE
);
156 on_signals_update_activate (GtkMenuItem
*menuitem
, gpointer user_data
)
158 Signals
*s
= (Signals
*)user_data
;
159 ianjuta_debugger_info_signal (
161 (IAnjutaDebuggerCallback
)signals_update
,
167 on_signals_event (GtkWidget
*widget
, GdkEvent
*event
, gpointer user_data
)
169 GdkEventButton
*bevent
;
170 Signals
*ew
= (Signals
*)user_data
;
172 if (event
->type
!= GDK_BUTTON_PRESS
) return FALSE
;
173 if (((GdkEventButton
*)event
)->button
!= 3) return FALSE
;
175 bevent
= (GdkEventButton
*)event
;
177 signals_update_controls(ew
);
178 gtk_menu_popup (GTK_MENU(ew
->widgets
.menu
), NULL
,
180 bevent
->button
, bevent
->time
);
185 on_signals_togglebutton1_toggled (GtkToggleButton
*togglebutton
,
188 Signals
*sig
= (Signals
*) user_data
;
190 sig
->stop
= gtk_toggle_button_get_active (togglebutton
);
192 gtk_label_set_text (GTK_LABEL(GTK_BIN (togglebutton
)->child
), _("Yes"));
194 gtk_label_set_text (GTK_LABEL(GTK_BIN (togglebutton
)->child
), _("No"));
198 on_signals_togglebutton2_toggled (GtkToggleButton
*togglebutton
,
201 Signals
*sig
= (Signals
*) user_data
;
203 sig
->print
= gtk_toggle_button_get_active(togglebutton
);
205 gtk_label_set_text (GTK_LABEL(GTK_BIN(togglebutton
)->child
), _("Yes"));
207 gtk_label_set_text (GTK_LABEL(GTK_BIN(togglebutton
)->child
), _("No"));
211 on_signals_togglebutton3_toggled (GtkToggleButton
*togglebutton
,
214 Signals
*sig
= (Signals
*) user_data
;
216 sig
->pass
= gtk_toggle_button_get_active (togglebutton
);
218 gtk_label_set_text (GTK_LABEL(GTK_BIN(togglebutton
)->child
), _("Yes"));
220 gtk_label_set_text (GTK_LABEL(GTK_BIN(togglebutton
)->child
), _("No"));
224 on_signals_set_ok_clicked (GtkButton
*button
,
227 Signals
*s
= (Signals
*) user_data
;
231 gtk_clist_set_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
, 1, "Yes");
235 gtk_clist_set_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
, 1, "No");
239 gtk_clist_set_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
, 2, "Yes");
243 gtk_clist_set_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
, 2, "No");
247 gtk_clist_set_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
, 3, "Yes");
251 gtk_clist_set_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
, 3, "No");
253 ianjuta_debugger_handle_signal (s
->debugger
, s
->signal
, s
->stop
, s
->print
, s
->pass
, NULL
);
256 static GnomeUIInfo signals_menu_uiinfo
[] =
259 GNOME_APP_UI_ITEM
, N_("Modify Signal"),
261 on_signals_modify_activate
, NULL
, NULL
,
262 GNOME_APP_PIXMAP_NONE
, NULL
,
266 GNOME_APP_UI_ITEM
, N_("Send to process"),
268 on_signals_send_activate
, NULL
, NULL
,
269 GNOME_APP_PIXMAP_NONE
, NULL
,
273 GNOME_APP_UI_ITEM
, N_("Update"),
275 on_signals_update_activate
, NULL
, NULL
,
276 GNOME_APP_PIXMAP_NONE
, NULL
,
283 create_signals_menu (Signals
*s
)
285 GtkWidget
*signals_menu
;
287 signals_menu
= gtk_menu_new ();
289 signals_menu_uiinfo
[0].user_data
= s
;
290 signals_menu_uiinfo
[1].user_data
= s
;
291 signals_menu_uiinfo
[2].user_data
= s
;
293 gnome_app_fill_menu (GTK_MENU_SHELL (signals_menu
), signals_menu_uiinfo
,
299 create_signals_gui (Signals
*cr
)
302 GtkWidget
*scrolledwindow4
;
304 GtkWidget
*label6
, *label7
, *label8
, *label9
, *label10
;
306 window3
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
307 gtk_widget_set_usize (window3
, 170, -2);
308 gtk_window_set_title (GTK_WINDOW (window3
), _("Kernel signals"));
309 gtk_window_set_wmclass (GTK_WINDOW (window3
), "signals", "Anjuta");
310 gtk_window_set_default_size (GTK_WINDOW (window3
), 240, 230);
311 gnome_window_icon_set_from_default(GTK_WINDOW(window3
));
313 scrolledwindow4
= gtk_scrolled_window_new (NULL
, NULL
);
314 gtk_widget_show (scrolledwindow4
);
315 gtk_container_add (GTK_CONTAINER (window3
), scrolledwindow4
);
316 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4
),
317 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
319 clist4
= gtk_clist_new (5);
320 gtk_widget_show (clist4
);
321 gtk_container_add (GTK_CONTAINER (scrolledwindow4
), clist4
);
322 gtk_clist_set_column_width (GTK_CLIST (clist4
), 0, 100);
323 gtk_clist_set_column_width (GTK_CLIST (clist4
), 1, 50);
324 gtk_clist_set_column_width (GTK_CLIST (clist4
), 2, 50);
325 gtk_clist_set_column_width (GTK_CLIST (clist4
), 3, 50);
326 gtk_clist_set_column_width (GTK_CLIST (clist4
), 4, 80);
327 gtk_clist_set_selection_mode (GTK_CLIST (clist4
), GTK_SELECTION_BROWSE
);
328 gtk_clist_column_titles_show (GTK_CLIST (clist4
));
329 gtk_clist_set_column_auto_resize (GTK_CLIST(clist4
), 4, TRUE
);
331 label6
= gtk_label_new (_("Signal"));
332 gtk_widget_show (label6
);
333 gtk_clist_set_column_widget (GTK_CLIST (clist4
), 0, label6
);
335 label7
= gtk_label_new (_("Stop"));
336 gtk_widget_show (label7
);
337 gtk_clist_set_column_widget (GTK_CLIST (clist4
), 1, label7
);
339 label8
= gtk_label_new (_("Print"));
340 gtk_widget_show (label8
);
341 gtk_clist_set_column_widget (GTK_CLIST (clist4
), 2, label8
);
343 label9
= gtk_label_new (_("Pass"));
344 gtk_widget_show (label9
);
345 gtk_clist_set_column_widget (GTK_CLIST (clist4
), 3, label9
);
347 label10
= gtk_label_new (_("Description"));
348 gtk_widget_show (label10
);
349 gtk_clist_set_column_widget (GTK_CLIST (clist4
), 4, label10
);
351 gtk_signal_connect (GTK_OBJECT (window3
), "delete_event",
352 GTK_SIGNAL_FUNC (on_signals_delete_event
), cr
);
353 gtk_signal_connect (GTK_OBJECT (window3
), "key-press-event",
354 GTK_SIGNAL_FUNC (on_signals_key_press_event
), cr
);
356 gtk_signal_connect (GTK_OBJECT (clist4
), "event",
357 GTK_SIGNAL_FUNC (on_signals_event
),
359 gtk_signal_connect (GTK_OBJECT (clist4
), "select_row",
360 GTK_SIGNAL_FUNC (on_signals_clist_select_row
),
363 cr
->widgets
.window
= window3
;
364 cr
->widgets
.clist
= clist4
;
365 cr
->widgets
.menu
= create_signals_menu (cr
);
366 cr
->widgets
.menu_modify
= signals_menu_uiinfo
[0].widget
;
367 cr
->widgets
.menu_signal
= signals_menu_uiinfo
[1].widget
;
368 cr
->widgets
.menu_update
= signals_menu_uiinfo
[2].widget
;
372 create_signals_set_dialog (Signals
*s
)
375 GtkWidget
*dialog_vbox1
;
382 GtkWidget
*hseparator1
;
388 GtkWidget
*togglebutton1
;
389 GtkWidget
*togglebutton2
;
390 GtkWidget
*togglebutton3
;
391 GtkWidget
*dialog_action_area1
;
400 gtk_clist_get_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
,0, &row
[0]);
401 gtk_clist_get_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
,1, &row
[1]);
402 gtk_clist_get_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
,2, &row
[2]);
403 gtk_clist_get_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
,3, &row
[3]);
404 gtk_clist_get_text(GTK_CLIST(s
->widgets
.clist
), s
->idx
,4, &row
[4]);
407 if(strcasecmp(row
[1], "Yes")==0)
412 if(strcasecmp(row
[2], "Yes")==0)
417 if(strcasecmp(row
[3], "Yes")==0)
422 dialog1
= gnome_dialog_new (_("Set Signal Property"), NULL
);
423 gtk_window_set_transient_for (GTK_WINDOW(dialog1
),
424 GTK_WINDOW(s
->widgets
.window
));
425 GTK_WINDOW (dialog1
)->type
= GTK_WINDOW_TOPLEVEL
;
426 gtk_window_set_position (GTK_WINDOW (dialog1
), GTK_WIN_POS_MOUSE
);
427 gtk_window_set_policy (GTK_WINDOW (dialog1
), FALSE
, FALSE
, FALSE
);
428 gtk_window_set_wmclass (GTK_WINDOW (dialog1
), "set_signal", "Anjuta");
429 gnome_dialog_set_close (GNOME_DIALOG (dialog1
), TRUE
);
431 dialog_vbox1
= GNOME_DIALOG (dialog1
)->vbox
;
432 gtk_widget_show (dialog_vbox1
);
434 hbox1
= gtk_hbox_new (FALSE
, 0);
435 gtk_widget_show (hbox1
);
436 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hbox1
, TRUE
, TRUE
, 0);
438 label1
= gtk_label_new ("Signal: ");
439 gtk_widget_show (label1
);
440 gtk_box_pack_start (GTK_BOX (hbox1
), label1
, FALSE
, FALSE
, 0);
442 label2
= gtk_label_new (row
[0]);
443 gtk_widget_show (label2
);
444 gtk_box_pack_start (GTK_BOX (hbox1
), label2
, FALSE
, FALSE
, 0);
446 hbox2
= gtk_hbox_new (FALSE
, 0);
447 gtk_widget_show (hbox2
);
448 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hbox2
, TRUE
, TRUE
, 0);
450 label3
= gtk_label_new ("Description: ");
451 gtk_widget_show (label3
);
452 gtk_box_pack_start (GTK_BOX (hbox2
), label3
, FALSE
, FALSE
, 0);
454 label4
= gtk_label_new (row
[4]);
455 gtk_widget_show (label4
);
456 gtk_box_pack_start (GTK_BOX (hbox2
), label4
, FALSE
, FALSE
, 0);
458 hseparator1
= gtk_hseparator_new ();
459 gtk_widget_show (hseparator1
);
460 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hseparator1
, TRUE
, TRUE
, 0);
462 hbox4
= gtk_hbox_new (FALSE
, 0);
463 gtk_widget_show (hbox4
);
464 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hbox4
, TRUE
, TRUE
, 0);
466 label5
= gtk_label_new (_(" Stop: "));
467 gtk_widget_show (label5
);
468 gtk_box_pack_start (GTK_BOX (hbox4
), label5
, TRUE
, TRUE
, 0);
470 label6
= gtk_label_new (_(" Print: "));
471 gtk_widget_show (label6
);
472 gtk_box_pack_start (GTK_BOX (hbox4
), label6
, TRUE
, TRUE
, 0);
474 label7
= gtk_label_new (_("Pass:"));
475 gtk_widget_show (label7
);
476 gtk_box_pack_start (GTK_BOX (hbox4
), label7
, TRUE
, TRUE
, 0);
478 hbox3
= gtk_hbox_new (FALSE
, 0);
479 gtk_widget_show (hbox3
);
480 gtk_box_pack_start (GTK_BOX (dialog_vbox1
), hbox3
, TRUE
, TRUE
, 0);
482 togglebutton1
= gtk_toggle_button_new_with_label (row
[1]);
483 gtk_widget_show (togglebutton1
);
484 gtk_box_pack_start (GTK_BOX (hbox3
), togglebutton1
, TRUE
, TRUE
, 0);
485 gtk_container_set_border_width (GTK_CONTAINER (togglebutton1
), 3);
486 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton1
), s
->stop
);
488 togglebutton2
= gtk_toggle_button_new_with_label (row
[2]);
489 gtk_widget_show (togglebutton2
);
490 gtk_box_pack_start (GTK_BOX (hbox3
), togglebutton2
, TRUE
, TRUE
, 0);
491 gtk_container_set_border_width (GTK_CONTAINER (togglebutton2
), 3);
492 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton2
), s
->print
);
494 togglebutton3
= gtk_toggle_button_new_with_label (row
[3]);
495 gtk_widget_show (togglebutton3
);
496 gtk_box_pack_start (GTK_BOX (hbox3
), togglebutton3
, TRUE
, TRUE
, 0);
497 gtk_container_set_border_width (GTK_CONTAINER (togglebutton3
), 3);
498 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton3
), s
->pass
);
500 dialog_action_area1
= GNOME_DIALOG (dialog1
)->action_area
;
501 gtk_widget_show (dialog_action_area1
);
502 gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1
),
503 GTK_BUTTONBOX_SPREAD
);
504 gtk_button_box_set_spacing (GTK_BUTTON_BOX (dialog_action_area1
), 8);
506 gnome_dialog_append_button (GNOME_DIALOG (dialog1
),
507 GNOME_STOCK_BUTTON_HELP
);
508 button1
= g_list_last (GNOME_DIALOG (dialog1
)->buttons
)->data
;
509 gtk_widget_show (button1
);
510 GTK_WIDGET_SET_FLAGS (button1
, GTK_CAN_DEFAULT
);
512 gnome_dialog_append_button (GNOME_DIALOG (dialog1
), GNOME_STOCK_BUTTON_OK
);
513 button2
= g_list_last (GNOME_DIALOG (dialog1
)->buttons
)->data
;
514 gtk_widget_show (button2
);
515 GTK_WIDGET_SET_FLAGS (button2
, GTK_CAN_DEFAULT
);
517 gnome_dialog_append_button (GNOME_DIALOG (dialog1
),
518 GNOME_STOCK_BUTTON_CANCEL
);
519 button3
= g_list_last (GNOME_DIALOG (dialog1
)->buttons
)->data
;
520 gtk_widget_show (button3
);
521 GTK_WIDGET_SET_FLAGS (button3
, GTK_CAN_DEFAULT
);
523 gtk_signal_connect (GTK_OBJECT (togglebutton1
), "toggled",
524 GTK_SIGNAL_FUNC (on_signals_togglebutton1_toggled
),
526 gtk_signal_connect (GTK_OBJECT (togglebutton2
), "toggled",
527 GTK_SIGNAL_FUNC (on_signals_togglebutton2_toggled
),
529 gtk_signal_connect (GTK_OBJECT (togglebutton3
), "toggled",
530 GTK_SIGNAL_FUNC (on_signals_togglebutton3_toggled
),
532 gtk_signal_connect (GTK_OBJECT (button2
), "clicked",
533 GTK_SIGNAL_FUNC (on_signals_set_ok_clicked
),
539 signals_new (IAnjutaDebugger
*debugger
)
542 ew
= g_malloc (sizeof (Signals
));
545 ew
->debugger
= debugger
;
546 g_object_ref (debugger
);
547 ew
->is_showing
= FALSE
;
549 ew
->win_height
= 320;
553 create_signals_gui (ew
);
559 signals_clear (Signals
* sg
)
561 if (GTK_IS_CLIST (sg
->widgets
.clist
))
562 gtk_clist_clear (GTK_CLIST (sg
->widgets
.clist
));
567 signals_show (Signals
* ew
)
573 gdk_window_raise (ew
->widgets
.window
->window
);
577 gtk_widget_set_uposition (ew
->widgets
.window
, ew
->win_pos_x
,
579 gtk_window_set_default_size (GTK_WINDOW (ew
->widgets
.window
),
580 ew
->win_width
, ew
->win_height
);
581 gtk_widget_show (ew
->widgets
.window
);
582 ew
->is_showing
= TRUE
;
583 ianjuta_debugger_info_signal (
585 (IAnjutaDebuggerCallback
)signals_update
,
593 signals_hide (Signals
* ew
)
597 if (ew
->is_showing
== FALSE
)
599 gdk_window_get_root_origin (ew
->widgets
.window
->window
, &ew
->win_pos_x
,
601 gdk_window_get_size (ew
->widgets
.window
->window
, &ew
->win_width
,
603 gtk_widget_hide (ew
->widgets
.window
);
604 ew
->is_showing
= FALSE
;
609 signals_free (Signals
* sg
)
614 g_object_unref (sg
->debugger
);
615 gtk_widget_destroy (sg
->widgets
.window
);
616 gtk_widget_destroy (sg
->widgets
.menu
);