1 /*
2  * Copyright (c) Tony Bybell 1999.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  */
9 
10 /* This file extracted from the GTK tutorial. */
11 
12 /* radiobuttons.c */
13 
14 #include "globals.h"
15 #include <config.h>
16 #include <gtk/gtk.h>
17 #include "analyzer.h"
18 #include "symbol.h"
19 #include "debug.h"
20 
21 
toggle_generic(GtkWidget * widget,TraceFlagsType msk)22 static void toggle_generic(GtkWidget *widget, TraceFlagsType msk)
23 {
24 if(GTK_TOGGLE_BUTTON(widget)->active)
25 	{
26 	GLOBALS->flags_showchange_c_1|=msk;
27 	}
28 	else
29 	{
30 	GLOBALS->flags_showchange_c_1&=(~msk);
31 	}
32 }
33 
toggle1_callback(GtkWidget * widget,GtkWidget * nothing)34 static void toggle1_callback(GtkWidget *widget, GtkWidget *nothing)
35 {
36 (void)nothing;
37 
38 toggle_generic(widget, TR_RJUSTIFY);
39 }
toggle2_callback(GtkWidget * widget,GtkWidget * nothing)40 static void toggle2_callback(GtkWidget *widget, GtkWidget *nothing)
41 {
42 (void)nothing;
43 
44 toggle_generic(widget, TR_INVERT);
45 }
toggle3_callback(GtkWidget * widget,GtkWidget * nothing)46 static void toggle3_callback(GtkWidget *widget, GtkWidget *nothing)
47 {
48 (void)nothing;
49 
50 toggle_generic(widget, TR_REVERSE);
51 }
toggle4_callback(GtkWidget * widget,GtkWidget * nothing)52 static void toggle4_callback(GtkWidget *widget, GtkWidget *nothing)
53 {
54 (void)nothing;
55 
56 toggle_generic(widget, TR_EXCLUDE);
57 }
toggle5_callback(GtkWidget * widget,GtkWidget * nothing)58 static void toggle5_callback(GtkWidget *widget, GtkWidget *nothing)
59 {
60 (void)nothing;
61 
62 toggle_generic(widget, TR_POPCNT);
63 }
toggle6_callback(GtkWidget * widget,GtkWidget * nothing)64 static void toggle6_callback(GtkWidget *widget, GtkWidget *nothing)
65 {
66 (void)nothing;
67 
68 toggle_generic(widget, TR_FFO);
69 }
70 
enter_callback(GtkWidget * widget,GtkWidget * nothing)71 static void enter_callback(GtkWidget *widget, GtkWidget *nothing)
72 {
73 (void)widget;
74 (void)nothing;
75 
76   GLOBALS->flags_showchange_c_1=GLOBALS->flags_showchange_c_1&(~(TR_HIGHLIGHT|TR_NUMMASK));
77 
78   if(GTK_TOGGLE_BUTTON(GLOBALS->button1_showchange_c_1)->active)
79 	{
80 	GLOBALS->flags_showchange_c_1|=TR_HEX;
81 	}
82   else
83   if(GTK_TOGGLE_BUTTON(GLOBALS->button2_showchange_c_1)->active)
84 	{
85 	GLOBALS->flags_showchange_c_1|=TR_DEC;
86 	}
87   else
88   if(GTK_TOGGLE_BUTTON(GLOBALS->button3_showchange_c_1)->active)
89 	{
90 	GLOBALS->flags_showchange_c_1|=TR_BIN;
91 	}
92   else
93   if(GTK_TOGGLE_BUTTON(GLOBALS->button4_showchange_c_1)->active)
94 	{
95 	GLOBALS->flags_showchange_c_1|=TR_OCT;
96 	}
97   else
98   if(GTK_TOGGLE_BUTTON(GLOBALS->button5_showchange_c_1)->active)
99 	{
100 	GLOBALS->flags_showchange_c_1|=TR_SIGNED;
101 	}
102   else
103   if(GTK_TOGGLE_BUTTON(GLOBALS->button6_showchange_c_1)->active)
104 	{
105 	GLOBALS->flags_showchange_c_1|=TR_ASCII;
106 	}
107   else
108   if(GTK_TOGGLE_BUTTON(GLOBALS->button7_showchange_c_1)->active)
109 	{
110 	GLOBALS->flags_showchange_c_1|=TR_REAL;
111 	}
112   else
113   if(GTK_TOGGLE_BUTTON(GLOBALS->button8_showchange_c_1)->active)
114 	{
115 	GLOBALS->flags_showchange_c_1|=(TR_TIME|TR_DEC);
116 	}
117   else
118   if(GTK_TOGGLE_BUTTON(GLOBALS->button9_showchange_c_1)->active)
119 	{
120 	GLOBALS->flags_showchange_c_1|=(TR_ENUM|TR_BIN);
121 	}
122 
123   GLOBALS->tcache_showchange_c_1->flags=GLOBALS->flags_showchange_c_1;
124   GLOBALS->tcache_showchange_c_1->minmax_valid = 0; /* force analog traces to regenerate if necessary */
125 
126   wave_gtk_grab_remove(GLOBALS->window_showchange_c_8);
127   gtk_widget_destroy(GLOBALS->window_showchange_c_8);
128   GLOBALS->window_showchange_c_8 = NULL;
129 
130   GLOBALS->cleanup_showchange_c_6();
131 }
132 
133 
destroy_callback(GtkWidget * widget,GtkWidget * nothing)134 static void destroy_callback(GtkWidget *widget, GtkWidget *nothing)
135 {
136 (void)widget;
137 (void)nothing;
138 
139   wave_gtk_grab_remove(GLOBALS->window_showchange_c_8);
140   gtk_widget_destroy(GLOBALS->window_showchange_c_8);
141   GLOBALS->window_showchange_c_8 = NULL;
142 }
143 
144 
showchange(char * title,Trptr t,GtkSignalFunc func)145 void showchange(char *title, Trptr t, GtkSignalFunc func)
146 {
147   GtkWidget *main_vbox;
148   GtkWidget *ok_hbox;
149   GtkWidget *hbox;
150   GtkWidget *box1;
151   GtkWidget *box2;
152   GtkWidget *label;
153   GtkWidget *button;
154   GtkWidget *separator;
155   GSList *group;
156   GtkWidget *frame1, *frame2;
157 
158   GLOBALS->cleanup_showchange_c_6=func;
159   GLOBALS->tcache_showchange_c_1=t;
160   GLOBALS->flags_showchange_c_1=t->flags;
161 
162   /* fix problem where ungrab doesn't occur if button pressed + simultaneous accelerator key occurs */
163   if(GLOBALS->in_button_press_wavewindow_c_1) { gdk_pointer_ungrab(GDK_CURRENT_TIME); }
164 
165   GLOBALS->window_showchange_c_8 = gtk_window_new (GLOBALS->disable_window_manager ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL);
166   install_focus_cb(GLOBALS->window_showchange_c_8, ((char *)&GLOBALS->window_showchange_c_8) - ((char *)GLOBALS));
167 
168   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->window_showchange_c_8), "delete_event",GTK_SIGNAL_FUNC(destroy_callback),NULL);
169 
170   gtk_window_set_title (GTK_WINDOW (GLOBALS->window_showchange_c_8), title);
171   gtk_container_border_width (GTK_CONTAINER (GLOBALS->window_showchange_c_8), 0);
172 
173 
174   main_vbox = gtk_vbox_new (FALSE, 1);
175   gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
176   gtk_widget_show (main_vbox);
177 
178   label=gtk_label_new(t->name);
179   gtk_box_pack_start (GTK_BOX (main_vbox), label, FALSE, TRUE, 0);
180   gtk_widget_show (label);
181 
182   separator = gtk_hseparator_new ();
183   gtk_box_pack_start (GTK_BOX (main_vbox), separator, FALSE, TRUE, 0);
184   gtk_widget_show (separator);
185 
186 
187   hbox = gtk_hbutton_box_new ();
188   gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
189   gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 5);
190   gtk_widget_show (hbox);
191 
192   box2 = gtk_vbox_new (FALSE, 5);
193   gtk_container_border_width (GTK_CONTAINER (box2), 5);
194   gtk_widget_show (box2);
195 
196   GLOBALS->button1_showchange_c_1 = gtk_radio_button_new_with_label (NULL, "Hex");
197   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button1_showchange_c_1, TRUE, TRUE, 0);
198   if(GLOBALS->flags_showchange_c_1&TR_HEX) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button1_showchange_c_1), TRUE);
199   gtk_widget_show (GLOBALS->button1_showchange_c_1);
200   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button1_showchange_c_1));
201 
202   GLOBALS->button2_showchange_c_1 = gtk_radio_button_new_with_label(group, "Decimal");
203   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button2_showchange_c_1, TRUE, TRUE, 0);
204   if((GLOBALS->flags_showchange_c_1&TR_DEC) && (!(GLOBALS->flags_showchange_c_1&TR_TIME))) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button2_showchange_c_1), TRUE);
205   gtk_widget_show (GLOBALS->button2_showchange_c_1);
206   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button2_showchange_c_1));
207 
208   GLOBALS->button5_showchange_c_1 = gtk_radio_button_new_with_label(group, "Signed Decimal");
209   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button5_showchange_c_1, TRUE, TRUE, 0);
210   if(GLOBALS->flags_showchange_c_1&TR_SIGNED) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button5_showchange_c_1), TRUE);
211   gtk_widget_show (GLOBALS->button5_showchange_c_1);
212   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button5_showchange_c_1));
213 
214   GLOBALS->button3_showchange_c_1 = gtk_radio_button_new_with_label(group, "Binary");
215   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button3_showchange_c_1, TRUE, TRUE, 0);
216   if((GLOBALS->flags_showchange_c_1&TR_BIN) && (!(GLOBALS->flags_showchange_c_1&TR_ENUM))) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button3_showchange_c_1), TRUE);
217   gtk_widget_show (GLOBALS->button3_showchange_c_1);
218   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button3_showchange_c_1));
219 
220   GLOBALS->button4_showchange_c_1 = gtk_radio_button_new_with_label(group, "Octal");
221   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button4_showchange_c_1, TRUE, TRUE, 0);
222   if(GLOBALS->flags_showchange_c_1&TR_OCT) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button4_showchange_c_1), TRUE);
223   gtk_widget_show (GLOBALS->button4_showchange_c_1);
224   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button4_showchange_c_1));
225 
226   GLOBALS->button6_showchange_c_1 = gtk_radio_button_new_with_label(group, "ASCII");
227   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button6_showchange_c_1, TRUE, TRUE, 0);
228   if(GLOBALS->flags_showchange_c_1&TR_ASCII) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button6_showchange_c_1), TRUE);
229   gtk_widget_show (GLOBALS->button6_showchange_c_1);
230   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button6_showchange_c_1));
231 
232   GLOBALS->button7_showchange_c_1 = gtk_radio_button_new_with_label(group, "Real");
233   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button7_showchange_c_1, TRUE, TRUE, 0);
234   if(GLOBALS->flags_showchange_c_1&TR_ASCII) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button7_showchange_c_1), TRUE);
235   gtk_widget_show (GLOBALS->button7_showchange_c_1);
236   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button7_showchange_c_1));
237 
238   GLOBALS->button8_showchange_c_1 = gtk_radio_button_new_with_label(group, "Time");
239   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button8_showchange_c_1, TRUE, TRUE, 0);
240   if(GLOBALS->flags_showchange_c_1&TR_ASCII) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button8_showchange_c_1), TRUE);
241   gtk_widget_show (GLOBALS->button8_showchange_c_1);
242   group = gtk_radio_button_group (GTK_RADIO_BUTTON (GLOBALS->button8_showchange_c_1));
243 
244   GLOBALS->button9_showchange_c_1 = gtk_radio_button_new_with_label(group, "Enum");
245   gtk_box_pack_start (GTK_BOX (box2), GLOBALS->button9_showchange_c_1, TRUE, TRUE, 0);
246   if(GLOBALS->flags_showchange_c_1&TR_ASCII) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (GLOBALS->button9_showchange_c_1), TRUE);
247   gtk_widget_show (GLOBALS->button9_showchange_c_1);
248 
249   frame2 = gtk_frame_new ("Base");
250   gtk_container_border_width (GTK_CONTAINER (frame2), 3);
251   gtk_container_add (GTK_CONTAINER (frame2), box2);
252   gtk_widget_show (frame2);
253   gtk_box_pack_start(GTK_BOX (hbox), frame2, TRUE, TRUE, 0);
254 
255 /****************************************************************************************************/
256 
257   box1 = gtk_vbox_new (FALSE, 5);
258   gtk_container_border_width (GTK_CONTAINER (box1), 5);
259   gtk_widget_show (box1);
260 
261 
262   frame1 = gtk_frame_new ("Attributes");
263   gtk_container_border_width (GTK_CONTAINER (frame1), 3);
264   gtk_container_add (GTK_CONTAINER (frame1), box1);
265   gtk_box_pack_start(GTK_BOX (hbox), frame1, TRUE, TRUE, 0);
266   gtk_widget_show (frame1);
267 
268   GLOBALS->toggle1_showchange_c_1=gtk_check_button_new_with_label("Right Justify");
269   gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle1_showchange_c_1, TRUE, TRUE, 0);
270   if(GLOBALS->flags_showchange_c_1&TR_RJUSTIFY)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle1_showchange_c_1), TRUE);
271   gtk_widget_show (GLOBALS->toggle1_showchange_c_1);
272   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle1_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle1_callback), NULL);
273 
274   GLOBALS->toggle2_showchange_c_1=gtk_check_button_new_with_label("Invert");
275   gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle2_showchange_c_1, TRUE, TRUE, 0);
276   if(GLOBALS->flags_showchange_c_1&TR_INVERT)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle2_showchange_c_1), TRUE);
277   gtk_widget_show (GLOBALS->toggle2_showchange_c_1);
278   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle2_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle2_callback), NULL);
279 
280   GLOBALS->toggle3_showchange_c_1=gtk_check_button_new_with_label("Reverse");
281   gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle3_showchange_c_1, TRUE, TRUE, 0);
282   if(GLOBALS->flags_showchange_c_1&TR_REVERSE)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle3_showchange_c_1), TRUE);
283   gtk_widget_show (GLOBALS->toggle3_showchange_c_1);
284   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle3_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle3_callback), NULL);
285 
286   GLOBALS->toggle4_showchange_c_1=gtk_check_button_new_with_label("Exclude");
287   gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle4_showchange_c_1, TRUE, TRUE, 0);
288   if(GLOBALS->flags_showchange_c_1&TR_EXCLUDE)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle4_showchange_c_1), TRUE);
289   gtk_widget_show (GLOBALS->toggle4_showchange_c_1);
290   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle4_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle4_callback), NULL);
291 
292   GLOBALS->toggle5_showchange_c_1=gtk_check_button_new_with_label("Popcnt");
293   gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle5_showchange_c_1, TRUE, TRUE, 0);
294   if(GLOBALS->flags_showchange_c_1&TR_POPCNT)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle5_showchange_c_1), TRUE);
295   gtk_widget_show (GLOBALS->toggle5_showchange_c_1);
296   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle5_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle5_callback), NULL);
297 
298   GLOBALS->toggle6_showchange_c_1=gtk_check_button_new_with_label("Find First One");
299   gtk_box_pack_start (GTK_BOX (box1), GLOBALS->toggle6_showchange_c_1, TRUE, TRUE, 0);
300   if(GLOBALS->flags_showchange_c_1&TR_FFO)gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(GLOBALS->toggle6_showchange_c_1), TRUE);
301   gtk_widget_show (GLOBALS->toggle6_showchange_c_1);
302   gtkwave_signal_connect (GTK_OBJECT (GLOBALS->toggle6_showchange_c_1), "toggled", GTK_SIGNAL_FUNC(toggle6_callback), NULL);
303 
304   gtk_container_add (GTK_CONTAINER (main_vbox), hbox);
305 
306   separator = gtk_hseparator_new ();
307   gtk_box_pack_start (GTK_BOX (main_vbox), separator, FALSE, TRUE, 0);
308   gtk_widget_show (separator);
309 
310 /****************************************************************************************************/
311 
312   ok_hbox = gtk_hbox_new (FALSE, 1);
313   gtk_container_border_width (GTK_CONTAINER (ok_hbox), 1);
314   gtk_widget_show (ok_hbox);
315 
316   button = gtk_button_new_with_label ("Cancel");
317   gtkwave_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC(destroy_callback),GTK_OBJECT (GLOBALS->window_showchange_c_8));
318   gtk_box_pack_end (GTK_BOX (ok_hbox), button, TRUE, TRUE, 0);
319   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
320   gtk_widget_show (button);
321 
322   gtk_container_add (GTK_CONTAINER (main_vbox), ok_hbox);
323 
324   button = gtk_button_new_with_label ("  OK  ");
325   gtkwave_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC(enter_callback),GTK_OBJECT (GLOBALS->window_showchange_c_8));
326 
327   gtkwave_signal_connect_object (GTK_OBJECT (button), "realize", (GtkSignalFunc) gtk_widget_grab_default, GTK_OBJECT (button));
328 
329   gtk_box_pack_end (GTK_BOX (ok_hbox), button, TRUE, TRUE, 0);
330   GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
331   gtk_widget_show (button);
332 
333 /****************************************************************************************************/
334 
335   gtk_container_add (GTK_CONTAINER (GLOBALS->window_showchange_c_8), main_vbox);
336   gtk_widget_show (GLOBALS->window_showchange_c_8);
337   wave_gtk_grab_add(GLOBALS->window_showchange_c_8);
338 }
339 
340