1 /*
2  * Copyright (c) Tony Bybell 1999-2017.
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 #include "globals.h"
11 
12 /* example-start menu menufactory.h */
13 
14 #ifndef __MENUFACTORY_H__
15 #define __MENUFACTORY_H__
16 
17 #include <gtk/gtk.h>
18 #include <stdio.h>
19 
20 #ifndef _MSC_VER
21 	#include <strings.h>
22 #endif
23 
24 #include <errno.h>
25 #include "currenttime.h"
26 #include "fgetdynamic.h"
27 #include "strace.h"
28 #include "debug.h"
29 #include "symbol.h"
30 #include "main.h"
31 
32 void do_popup_menu (GtkWidget *my_widget, GdkEventButton *event);
33 void do_sst_popup_menu (GtkWidget *my_widget, GdkEventButton *event);
34 void get_main_menu (GtkWidget *, GtkWidget **menubar);
35 void menu_set_sensitive(void);
36 int file_quit_cmd_callback (GtkWidget *widget, gpointer data);
37 int set_wave_menu_accelerator(char *str);
38 int execute_script(char *name, int dealloc_name);
39 
40 void kill_main_menu_accelerators(void); /* for conflicts with twinwave */
41 
42 struct stringchain_t
43 {
44 struct stringchain_t *next;
45 char *name;
46 };
47 
48 #ifdef MAC_INTEGRATION
49 #define WAVE_USE_MLIST_T
50 #endif
51 
52 #ifdef WAVE_USE_MLIST_T
53 typedef void    (*gtkwave_mlist_callback)  ();
54 
55 struct gtkwave_mlist_t
56 {
57   gchar *path;
58   gchar *accelerator;
59 
60   gtkwave_mlist_callback callback;
61   guint                  callback_action;
62 
63   /* possible values:
64    * "<Item>"           -> create a simple item
65    * "<ToggleItem>"     -> create a toggle item
66    * "<Separator>"      -> create a separator
67    */
68   gchar          *item_type;
69 
70   /* Extra data for some item types:
71    *  ImageItem  -> pointer to inlined pixbuf stream
72    *  StockItem  -> name of stock item
73    */
74   gconstpointer extra_data;
75 };
76 
77 typedef struct gtkwave_mlist_t gtkwave_mlist_t;
78 
79 GtkWidget *alt_menu_top(GtkWidget *window);
80 GtkWidget *alt_menu(gtkwave_mlist_t *mi, int nmenu_items, GtkWidget **wlist, GtkAccelGroup *accel, gboolean is_menubar);
81 
82 #else
83 #define gtkwave_mlist_t GtkItemFactoryEntry
84 #endif
85 
86 enum WV_MenuItems {
87 WV_MENU_FONV,
88 WV_MENU_FONVT,
89 WV_MENU_FRW,
90 WV_MENU_WRVCD,
91 WV_MENU_WRLXT,
92 WV_MENU_WRTIM,
93 WV_MENU_WCLOSE,
94 WV_MENU_SEP2VCD,
95 WV_MENU_FPTF,
96 #if GTK_CHECK_VERSION(2,14,0)
97 WV_MENU_SGRAB,
98 #endif
99 WV_MENU_SEP1,
100 WV_MENU_FRSF,
101 WV_MENU_FWSF,
102 WV_MENU_FWSFAS,
103 WV_MENU_SEP2,
104 WV_MENU_FRLF,
105 WV_MENU_SEP2LF,
106 #if !defined _MSC_VER
107 WV_MENU_FRSTMF,
108 WV_MENU_SEP2STMF,
109 #endif
110 #if defined(HAVE_LIBTCL)
111 WV_MENU_TCLSCR,
112 WV_MENU_TCLSEP,
113 #endif
114 WV_MENU_FQY,
115 WV_MENU_ESTMH,
116 WV_MENU_ETH,
117 WV_MENU_SEP3,
118 WV_MENU_EIB,
119 WV_MENU_EIC,
120 WV_MENU_EIA,
121 WV_MENU_EC,
122 WV_MENU_ECY,
123 WV_MENU_EP,
124 WV_MENU_DEL,
125 WV_MENU_SEP3A,
126 WV_MENU_EAHT,
127 WV_MENU_ERHA,
128 WV_MENU_SEP4,
129 WV_MENU_EE,
130 WV_MENU_ECD,
131 WV_MENU_ECU,
132 WV_MENU_SEP5,
133 WV_MENU_EDFH,
134 WV_MENU_EDFD,
135 WV_MENU_EDFSD,
136 WV_MENU_EDFB,
137 WV_MENU_EDFO,
138 WV_MENU_EDFA,
139 WV_MENU_TIME,
140 WV_MENU_ENUM,
141 WV_MENU_EDRL,
142 WV_MENU_EDR2BON,
143 WV_MENU_EDR2BOFF,
144 WV_MENU_EDFRJON,
145 WV_MENU_EDFRJOFF,
146 WV_MENU_EDFION,
147 WV_MENU_EDFIOFF,
148 WV_MENU_EDFRON,
149 WV_MENU_EDFROFF,
150 WV_MENU_XLF_0,
151 WV_MENU_XLF_1,
152 WV_MENU_XLP_0,
153 WV_MENU_XLP_1,
154 WV_MENU_TTXLP_0,
155 WV_MENU_TTXLP_1,
156 WV_MENU_EDFAOFF,
157 WV_MENU_EDFASTEP,
158 WV_MENU_EDFAINTERPOL,
159 WV_MENU_EDFAINTERPOL2,
160 WV_MENU_EDFARSD,
161 WV_MENU_EDFARAD,
162 WV_MENU_RFILL0,
163 WV_MENU_RFILL1,
164 WV_MENU_RFILLOFF,
165 WV_MENU_B2G,
166 WV_MENU_G2B,
167 WV_MENU_GBNONE,
168 WV_MENU_POPON,
169 WV_MENU_POPOFF,
170 WV_MENU_FFOON,
171 WV_MENU_FFOOFF,
172 WV_MENU_FPSHIFTON,
173 WV_MENU_FPSHIFTOFF,
174 WV_MENU_FPSHIFTVAL,
175 WV_MENU_CLRFMT0,
176 WV_MENU_CLRFMT1,
177 WV_MENU_CLRFMT2,
178 WV_MENU_CLRFMT3,
179 WV_MENU_CLRFMT4,
180 WV_MENU_CLRFMT5,
181 WV_MENU_CLRFMT6,
182 WV_MENU_CLRFMT7,
183 WV_MENU_CLRFMTC,
184 WV_MENU_SEP5A,
185 WV_MENU_KEEPXZ,
186 WV_MENU_ESCAH,
187 WV_MENU_ESCFH,
188 WV_MENU_SEP6,
189 WV_MENU_WARP,
190 WV_MENU_UNWARP,
191 WV_MENU_UNWARPA,
192 WV_MENU_SEP7A,
193 WV_MENU_EEX,
194 WV_MENU_ESH,
195 WV_MENU_SEP6A,
196 /* WV_MENU_EXA, */
197 /* WV_MENU_CPA, */
198 WV_MENU_TG,
199 WV_MENU_AG,
200 WV_MENU_SEP6A1,
201 WV_MENU_EHR,
202 WV_MENU_EUHR,
203 WV_MENU_EHA,
204 WV_MENU_EUHA,
205 WV_MENU_SEP6B,
206 WV_MENU_ALPHA,
207 WV_MENU_ALPHA2,
208 WV_MENU_LEX,
209 WV_MENU_RVS,
210 WV_MENU_SPS,
211 #ifdef WAVE_USE_GTK2
212 WV_MENU_SPS2,
213 #endif
214 WV_MENU_SEP7B,
215 WV_MENU_SSR,
216 WV_MENU_SSH,
217 WV_MENU_SST,
218 WV_MENU_SEP7,
219 #if !defined __MINGW32__ && !defined _MSC_VER
220 WV_MENU_OPENHS,
221 WV_MENU_OPENIHS,
222 #endif
223 WV_MENU_OPENH,
224 WV_MENU_SEP7D,
225 WV_MENU_ACOL,
226 WV_MENU_ACOLR,
227 WV_MENU_ABON,
228 WV_MENU_HTGP,
229 WV_MENU_SEP7C,
230 WV_MENU_STRSE,
231 WV_MENU_TMTT,
232 WV_MENU_TZZA,
233 WV_MENU_TZZB,
234 WV_MENU_TZZI,
235 WV_MENU_TZZO,
236 WV_MENU_TZZBFL,
237 WV_MENU_TZZBF,
238 WV_MENU_TZZTS,
239 WV_MENU_TZZTE,
240 WV_MENU_TZUZ,
241 WV_MENU_TFFS,
242 WV_MENU_TFFR,
243 WV_MENU_TFFL,
244 WV_MENU_TDDR,
245 WV_MENU_TDDL,
246 WV_MENU_TSSR,
247 WV_MENU_TSSL,
248 WV_MENU_TPPR,
249 WV_MENU_TPPL,
250 WV_MENU_MSCMD,
251 WV_MENU_MDNM,
252 WV_MENU_MCNM,
253 WV_MENU_MCANM,
254 WV_MENU_MCAB,
255 WV_MENU_MDPM,
256 WV_MENU_SEP8,
257 WV_MENU_SLE,
258 WV_MENU_SRE,
259 WV_MENU_SEP8B,
260 WV_MENU_HSWM,
261 WV_MENU_MWSON,
262 WV_MENU_MLKLT,
263 WV_MENU_MLKRT,
264 WV_MENU_MLKOFF,
265 WV_MENU_VSG,
266 WV_MENU_SEP9,
267 WV_MENU_SHW,
268 WV_MENU_FILL1,
269 WV_MENU_SEP9B,
270 WV_MENU_VSMO,
271 #ifdef WAVE_USE_GTK2
272 WV_MENU_VSMC,
273 #endif
274 WV_MENU_SEP9A,
275 WV_MENU_VSBS,
276 WV_MENU_SEP10,
277 WV_MENU_ESTS,
278 WV_MENU_SEP10A,
279 WV_MENU_VDR,
280 WV_MENU_SEP11,
281 WV_MENU_VCZ,
282 WV_MENU_SEP12,
283 WV_MENU_VTDF,
284 WV_MENU_VTMM,
285 WV_MENU_SEP13,
286 WV_MENU_VCMU,
287 WV_MENU_SEP14,
288 WV_MENU_VDRV,
289 WV_MENU_SEP15,
290 WV_MENU_VLJS,
291 WV_MENU_VRJS,
292 WV_MENU_SEP16,
293 WV_MENU_VZPS,
294 WV_MENU_VZDYN,
295 WV_MENU_VZDYNE,
296 WV_MENU_VFTP,
297 WV_MENU_SEP17,
298 WV_MENU_RULER,
299 WV_MENU_RMRKS,
300 WV_MENU_SEP17A,
301 WV_MENU_USECOLOR,
302 WV_MENU_USEBW,
303 WV_MENU_SEP18,
304 WV_MENU_LXTCC2Z,
305 WV_MENU_SEP19,
306 WV_MENU_TDSCALEX,
307 WV_MENU_TDSCALES,
308 WV_MENU_TDSCALEM,
309 WV_MENU_TDSCALEU,
310 WV_MENU_TDSCALEN,
311 WV_MENU_TDSCALEP,
312 WV_MENU_TDSCALEF,
313 WV_MENU_HWH,
314 #ifdef MAC_INTEGRATION
315 WV_MENU_HWM,
316 #endif
317 WV_MENU_HWV,
318 WV_MENU_NUMITEMS
319 };
320 
321 enum WV_RecurseType {
322 WV_RECURSE_APPEND,
323 WV_RECURSE_INSERT,
324 WV_RECURSE_REPLACE,
325 };
326 
327 void menu_new_viewer(gpointer null_data, guint callback_action, GtkWidget *widget);
328 void menu_write_vcd_file(gpointer null_data, guint callback_action, GtkWidget *widget);
329 void menu_write_lxt_file(gpointer null_data, guint callback_action, GtkWidget *widget);
330 void menu_print(gpointer null_data, guint callback_action, GtkWidget *widget);
331 void menu_read_save_file(gpointer null_data, guint callback_action, GtkWidget *widget);
332 void menu_write_save_file(gpointer null_data, guint callback_action, GtkWidget *widget);
333 void menu_write_save_file_as(gpointer null_data, guint callback_action, GtkWidget *widget);
334 void menu_read_log_file(gpointer null_data, guint callback_action, GtkWidget *widget);
335 void menu_read_stems_file(gpointer null_data, guint callback_action, GtkWidget *widget);
336 void menu_quit(gpointer null_data, guint callback_action, GtkWidget *widget);
337 void menu_set_max_hier(gpointer null_data, guint callback_action, GtkWidget *widget);
338 void menu_insert_blank_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
339 void menu_insert_comment_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
340 void menu_insert_analog_height_extension(gpointer null_data, guint callback_action, GtkWidget *widget);
341 void menu_alias(gpointer null_data, guint callback_action, GtkWidget *widget);
342 void menu_remove_aliases(gpointer null_data, guint callback_action, GtkWidget *widget);
343 void menu_cut_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
344 void menu_copy_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
345 void menu_paste_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
346 void menu_combine_down(gpointer null_data, guint callback_action, GtkWidget *widget);
347 void menu_combine_up(gpointer null_data, guint callback_action, GtkWidget *widget);
348 void menu_dataformat_hex(gpointer null_data, guint callback_action, GtkWidget *widget);
349 void menu_dataformat_dec(gpointer null_data, guint callback_action, GtkWidget *widget);
350 void menu_dataformat_signed(gpointer null_data, guint callback_action, GtkWidget *widget);
351 void menu_dataformat_bin(gpointer null_data, guint callback_action, GtkWidget *widget);
352 void menu_dataformat_oct(gpointer null_data, guint callback_action, GtkWidget *widget);
353 void menu_dataformat_ascii(gpointer null_data, guint callback_action, GtkWidget *widget);
354 void menu_dataformat_real(gpointer null_data, guint callback_action, GtkWidget *widget);
355 void menu_dataformat_rjustify_on(gpointer null_data, guint callback_action, GtkWidget *widget);
356 void menu_dataformat_rjustify_off(gpointer null_data, guint callback_action, GtkWidget *widget);
357 void menu_dataformat_invert_on(gpointer null_data, guint callback_action, GtkWidget *widget);
358 void menu_dataformat_invert_off(gpointer null_data, guint callback_action, GtkWidget *widget);
359 void menu_dataformat_reverse_on(gpointer null_data, guint callback_action, GtkWidget *widget);
360 void menu_dataformat_reverse_off(gpointer null_data, guint callback_action, GtkWidget *widget);
361 void menu_dataformat_xlate_file_0(gpointer null_data, guint callback_action, GtkWidget *widget);
362 void menu_dataformat_xlate_file_1(gpointer null_data, guint callback_action, GtkWidget *widget);
363 void menu_dataformat_xlate_proc_0(gpointer null_data, guint callback_action, GtkWidget *widget);
364 void menu_dataformat_xlate_proc_1(gpointer null_data, guint callback_action, GtkWidget *widget);
365 void menu_dataformat_analog_off(gpointer null_data, guint callback_action, GtkWidget *widget);
366 void menu_dataformat_analog_step(gpointer null_data, guint callback_action, GtkWidget *widget);
367 void menu_dataformat_analog_interpol(gpointer null_data, guint callback_action, GtkWidget *widget);
368 void menu_showchangeall(gpointer null_data, guint callback_action, GtkWidget *widget);
369 void menu_showchange(gpointer null_data, guint callback_action, GtkWidget *widget);
370 void menu_warp_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
371 void menu_unwarp_traces(gpointer null_data, guint callback_action, GtkWidget *widget);
372 void menu_unwarp_traces_all(gpointer null_data, guint callback_action, GtkWidget *widget);
373 
374 void menu_dataformat_exclude_on(gpointer null_data, guint callback_action, GtkWidget *widget);
375 void menu_dataformat_exclude_off(gpointer null_data, guint callback_action, GtkWidget *widget);
376 void menu_regexp_highlight(gpointer null_data, guint callback_action, GtkWidget *widget);
377 void menu_regexp_unhighlight(gpointer null_data, guint callback_action, GtkWidget *widget);
378 void menu_dataformat_highlight_all(gpointer null_data, guint callback_action, GtkWidget *widget);
379 void menu_dataformat_unhighlight_all(gpointer null_data, guint callback_action, GtkWidget *widget);
380 void menu_alphabetize(gpointer null_data, guint callback_action, GtkWidget *widget);
381 void menu_alphabetize2(gpointer null_data, guint callback_action, GtkWidget *widget);
382 void menu_lexize(gpointer null_data, guint callback_action, GtkWidget *widget);
383 void menu_reverse(gpointer null_data, guint callback_action, GtkWidget *widget);
384 void menu_tracesearchbox(gpointer null_data, guint callback_action, GtkWidget *widget);
385 void menu_signalsearch(gpointer null_data, guint callback_action, GtkWidget *widget);
386 void menu_hiersearch(gpointer null_data, guint callback_action, GtkWidget *widget);
387 void menu_treesearch(gpointer null_data, guint callback_action, GtkWidget *widget);
388 void menu_autocoalesce(gpointer null_data, guint callback_action, GtkWidget *widget);
389 void menu_autocoalesce_reversal(gpointer null_data, guint callback_action, GtkWidget *widget);
390 void menu_autoname_bundles_on(gpointer null_data, guint callback_action, GtkWidget *widget);
391 void menu_hgrouping(gpointer null_data, guint callback_action, GtkWidget *widget);
392 void menu_movetotime(gpointer null_data, guint callback_action, GtkWidget *widget);
393 void menu_zoomsize(gpointer null_data, guint callback_action, GtkWidget *widget);
394 void menu_zoombase(gpointer null_data, guint callback_action, GtkWidget *widget);
395 void menu_fetchsize(gpointer null_data, guint callback_action, GtkWidget *widget);
396 void menu_markerbox(gpointer null_data, guint callback_action, GtkWidget *widget);
397 
398 void drop_named_marker(gpointer null_data, guint callback_action, GtkWidget *widget);
399 void collect_named_marker(gpointer null_data, guint callback_action, GtkWidget *widget);
400 void collect_all_named_markers(gpointer null_data, guint callback_action, GtkWidget *widget);
401 void delete_unnamed_marker(gpointer null_data, guint callback_action, GtkWidget *widget);
402 void wave_scrolling_on(gpointer null_data, guint callback_action, GtkWidget *widget);
403 void menu_show_grid(gpointer null_data, guint callback_action, GtkWidget *widget);
404 void menu_show_mouseover(gpointer null_data, guint callback_action, GtkWidget *widget);
405 void menu_show_base(gpointer null_data, guint callback_action, GtkWidget *widget);
406 void menu_enable_dynamic_resize(gpointer null_data, guint callback_action, GtkWidget *widget);
407 void menu_center_zooms(gpointer null_data, guint callback_action, GtkWidget *widget);
408 void menu_toggle_delta_or_frequency(gpointer null_data, guint callback_action, GtkWidget *widget);
409 void menu_toggle_max_or_marker(gpointer null_data, guint callback_action, GtkWidget *widget);
410 void menu_enable_constant_marker_update(gpointer null_data, guint callback_action, GtkWidget *widget);
411 void menu_use_roundcaps(gpointer null_data, guint callback_action, GtkWidget *widget);
412 void menu_left_justify(gpointer null_data, guint callback_action, GtkWidget *widget);
413 void menu_right_justify(gpointer null_data, guint callback_action, GtkWidget *widget);
414 void menu_zoom10_snap(gpointer null_data, guint callback_action, GtkWidget *widget);
415 void menu_use_full_precision(gpointer null_data, guint callback_action, GtkWidget *widget);
416 void menu_remove_marked(gpointer null_data, guint callback_action, GtkWidget *widget);
417 void menu_lxt_clk_compress(gpointer null_data, guint callback_action, GtkWidget *widget);
418 void menu_help(gpointer null_data, guint callback_action, GtkWidget *widget);
419 void menu_version(gpointer null_data, guint callback_action, GtkWidget *widget);
420 void menu_toggle_group(gpointer null_data, guint callback_action, GtkWidget *widget);
421 
422 gtkwave_mlist_t *retrieve_menu_items_array(int *num_items);
423 
424 void menu_read_stems_cleanup(GtkWidget *widget, gpointer data);
425 void menu_new_viewer_tab_cleanup(GtkWidget *widget, gpointer data);
426 int menu_new_viewer_tab_cleanup_2(char *fname, int optimize_vcd);
427 
428 void movetotime_cleanup(GtkWidget *widget, gpointer data);
429 void zoomsize_cleanup(GtkWidget *widget, gpointer data);
430 
431 
432 void set_scale_to_time_dimension_toggles(void);
433 
434 void SetTraceScrollbarRowValue(int row, unsigned center);
435 
436 bvptr combine_traces(int direction, Trptr single_trace_only);
437 unsigned create_group (char* name, Trptr t_composite);
438 
439 /* currently only for OSX to disable OSX menus when grabbed */
440 void wave_gtk_grab_add(GtkWidget *w);
441 void wave_gtk_grab_remove(GtkWidget *w);
442 #ifdef MAC_INTEGRATION
443 void osx_menu_sensitivity(gboolean tr);
444 #endif
445 
446 #endif
447