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