1 /*
2 fsm
3 */
4 #include <cstdlib>
5 #include <iostream>
6 #ifdef _MSC_VER
7 # include "vcl_msvc_warnings.h"
8 #endif
9
10 #include "vgui/vgui.h"
11 #include "vgui/vgui_window.h"
12 #include "vgui/vgui_adaptor.h"
13 #include "vgui/vgui_menu.h"
14 #include "vgui/vgui_tableau.h"
15 #include "vgui/vgui_command.h"
16
17 // example of a tableau which has an associated menu :
18 struct joe_tab : public vgui_tableau
19 {
20 std::string msg;
21 vgui_menu the_menu;
22
joe_tabjoe_tab23 joe_tab(const std::string & m)
24 : msg(m)
25 {
26 the_menu.add("joe(0)", joe_callback, nullptr /*data*/);
27 the_menu.add("joe(this)", joe_callback, this /*data*/);
28 the_menu.add("toggle1", new vgui_command_toggle(false));
29 the_menu.add("toggle2", new vgui_command_toggle(true));
30 }
~joe_tabjoe_tab31 ~joe_tab() {}
32
33 static void
joe_callbackjoe_tab34 joe_callback(void const * data)
35 {
36 std::cerr << "this is joe_tab::joe_callback(" << data << ")\n";
37 if (data)
38 std::cerr << " msg=\"" << static_cast<const joe_tab *>(data)->msg << "\"\n";
39 }
40 void
add_popupjoe_tab41 add_popup(vgui_menu & m)
42 {
43 m.include(the_menu);
44 }
45 bool
handlejoe_tab46 handle(const vgui_event &)
47 {
48 return true;
49 }
50 std::string
type_namejoe_tab51 type_name() const
52 {
53 return "joe_tab";
54 }
55 };
56
57 //--------------------------------------------------------------------------------
58
59 static void
SEGV()60 SEGV()
61 {
62 ++*(int *)nullptr;
63 }
64
65 static void
BUS()66 BUS()
67 {
68 double x = 2.718281828;
69 x = *(double *)(1 + (char *)&x);
70 }
71
72 static void
FPE()73 FPE()
74 {
75 int one = 1;
76 int zero = 0;
77 int bad = one / zero;
78 (void)bad; // quell compiler warning.
79 }
80
81 static void
ABRT()82 ABRT()
83 {
84 std::abort();
85 }
86
87 vgui_menu
get_fault_menu()88 get_fault_menu()
89 {
90 vgui_menu menu;
91 menu.add("SEGV", SEGV);
92 menu.add("BUS", BUS);
93 menu.add("FPE", FPE);
94 menu.add("ABRT", ABRT);
95 return menu;
96 }
97
98 //--------------------------------------------------------------------------------
99
100 static void
Quit()101 Quit()
102 {
103 std::exit(0);
104 }
105
106 static void
Load()107 Load()
108 {
109 std::cerr << "Load\n";
110 }
111
112 static void
Save()113 Save()
114 {
115 std::cerr << "Load\n";
116 }
117
118 vgui_menu
get_file_menu()119 get_file_menu()
120 {
121 vgui_menu menu;
122 menu.add("Quit", Quit);
123 menu.add("LoadImage", Load, vgui_key('l'));
124 menu.add("SaveImage", Save, vgui_key('s'));
125 return menu;
126 }
127
128 //--------------------------------------------------------------------------------
129
130 int
main(int argc,char ** argv)131 main(int argc, char ** argv)
132 {
133 vgui::init(argc, argv);
134
135 // window 1
136 vgui_window * win1 = vgui::adapt(new joe_tab("Joe1"), 256, 256, get_fault_menu(), "Joe1");
137 win1->get_adaptor()->bind_popups(vgui_CTRL, vgui_RIGHT);
138 win1->show();
139 std::cerr << "Joe1 : ctrl+right for popup\n";
140
141 // window 2
142 vgui_window * win2 = vgui::adapt(new joe_tab("Joe2"), 256, 256, get_file_menu(), "Joe2");
143 win2->get_adaptor()->bind_popups(vgui_SHIFT, vgui_LEFT);
144 win2->show();
145 std::cerr << "Joe2 : shift+left for popup\n";
146
147 return vgui::run();
148 }
149