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