Usermode/AxWin3 - Fixed scan-build complaints, added more complete debug
[tpg/acess2.git] / Usermode / Applications / axwin3_src / Interface / main.c
1 /*
2  * Acess2 GUI v3 User Interface
3  * - By John Hodge (thePowersGang)
4  *
5  * main.c
6  * - Interface core
7  */
8 #include <acess/sys.h>
9 #include <stdlib.h>
10 #include <axwin3/axwin.h>
11 #include <axwin3/widget.h>
12 #include <axwin3/menu.h>
13
14 #define SIDEBAR_WIDTH   40
15 #define RUN_WIDTH       200
16 #define RUN_HEIGHT      60
17
18 // === PROTOTYPES ===
19 void    create_sidebar(void);
20 void    create_mainmenu(void);
21 void    create_run_dialog(void);
22 void    mainmenu_run_dialog(void *unused);
23 void    mainmenu_app_terminal(void *unused);
24 void    mainmenu_app_textedit(void *unused);
25 void    update_time(void);
26
27 // === GLOBALS ===
28 tHWND   gSidebar;
29 tAxWin3_Widget  *gSidebarRoot;
30 tHWND   gSystemMenu;
31 tHWND   gRunDialog;
32 tAxWin3_Widget  *gRunInput;
33
34 tAxWin3_Widget  *gWindowList;
35 tAxWin3_Widget  *gTimeDisplay;
36  int    giScreenWidth;
37  int    giScreenHeight;
38 char    **gEnvion;
39
40 // === CODE ===
41 int systembutton_fire(tAxWin3_Widget *Widget)
42 {
43         _SysDebug("SystemButton pressed");
44         AxWin3_Menu_ShowAt(gSystemMenu, SIDEBAR_WIDTH, 0);
45         return 0;
46 }
47
48 int main(int argc, char *argv[], char **envp)
49 {
50         gEnvion = envp;
51         // Connect to AxWin3 Server
52         AxWin3_Connect(NULL);
53
54         // TODO: Register to be told when the display layout changes
55         AxWin3_GetDisplayDims(0, NULL, NULL, &giScreenWidth, &giScreenHeight);
56         
57         create_sidebar();
58         create_mainmenu();
59         create_run_dialog();
60         
61         AxWin3_RegisterAction(gSidebar, "Interface>Run", (tAxWin3_HotkeyCallback)mainmenu_run_dialog);
62         AxWin3_RegisterAction(gSidebar, "Interface>Terminal", (tAxWin3_HotkeyCallback)mainmenu_app_terminal);
63         AxWin3_RegisterAction(gSidebar, "Interface>TextEdit", (tAxWin3_HotkeyCallback)mainmenu_app_textedit);
64
65         // Idle loop
66         AxWin3_MainLoop();
67         
68         return 0;
69 }
70
71 void create_sidebar(void)
72 {
73         tAxWin3_Widget  *btn, *txt, *ele;
74
75         // Create sidebar
76         gSidebar = AxWin3_Widget_CreateWindow(NULL, SIDEBAR_WIDTH, giScreenHeight, ELEFLAG_VERTICAL);
77         AxWin3_MoveWindow(gSidebar, 0, 0);
78         gSidebarRoot = AxWin3_Widget_GetRoot(gSidebar); 
79
80         // - Main menu
81         btn = AxWin3_Widget_AddWidget(gSidebarRoot, ELETYPE_BUTTON, ELEFLAG_NOSTRETCH, "SystemButton");
82         AxWin3_Widget_SetSize(btn, SIDEBAR_WIDTH);
83         AxWin3_Widget_SetFireHandler(btn, systembutton_fire);
84         txt = AxWin3_Widget_AddWidget(btn, ELETYPE_IMAGE, 0, "SystemLogo");
85         AxWin3_Widget_SetText(txt, "file:///Acess/Apps/AxWin/3.0/AcessLogoSmall.sif");
86         
87         // - Plain <hr/> style spacer
88         ele = AxWin3_Widget_AddWidget(gSidebarRoot, ELETYPE_SPACER, ELEFLAG_NOSTRETCH, "SideBar Spacer Top");
89         AxWin3_Widget_SetSize(ele, 4);
90
91         // TODO: Program list
92         gWindowList = AxWin3_Widget_AddWidget(gSidebarRoot, ELETYPE_BOX, ELEFLAG_VERTICAL, "ProgramList");
93
94         // - Plain <hr/> style spacer
95         ele = AxWin3_Widget_AddWidget(gSidebarRoot, ELETYPE_SPACER, ELEFLAG_NOSTRETCH, "SideBar Spacer Top");
96         AxWin3_Widget_SetSize(ele, 4);
97
98         // > Version/Time
99         ele = AxWin3_Widget_AddWidget(gSidebarRoot,
100                 ELETYPE_BOX,
101                 ELEFLAG_VERTICAL|ELEFLAG_ALIGN_CENTER|ELEFLAG_NOSTRETCH,
102                 "Version/Time"
103                 );
104         gTimeDisplay = AxWin3_Widget_AddWidget(ele, ELETYPE_TEXT, ELEFLAG_NOSTRETCH, "Time");
105         AxWin3_Widget_SetSize(gTimeDisplay, 20);
106         //AxWin3_Widget_SetText(gTimeDisplay, "--:--");
107         update_time();
108
109         // Turn off decorations
110         AxWin3_DecorateWindow(gSidebar, 0);
111
112         // Show!
113         AxWin3_ShowWindow(gSidebar, 1); 
114         
115 }
116
117 void update_time(void)
118 {
119         char    tmpbuf[2+1+2+1] = "--:--";
120         //strftime(tmpbuf, sizeof(tmpbuf), "%H:%M", NULL);
121         AxWin3_Widget_SetText(gTimeDisplay, tmpbuf);
122 }
123
124 void mainmenu_app_textedit(void *unused)
125 {
126 //      _SysDebug("TODO: Launch text editor");
127         const char      *args[] = {"ate",NULL};
128         _SysSpawn("/Acess/Apps/AxWin/3.0/ate", args, (const char **)gEnvion, 0, NULL, NULL);
129 }
130
131 void mainmenu_app_terminal(void *unused)
132 {
133         _SysDebug("Launch terminal emulator");
134         const char      *args[] = {"terminal",NULL};
135         _SysSpawn("/Acess/Apps/AxWin/3.0/terminal", args, (const char **)gEnvion, 0, NULL, NULL);
136 }
137
138 void mainmenu_run_dialog(void *unused)
139 {
140         AxWin3_ShowWindow(gRunDialog, 1);
141         AxWin3_FocusWindow(gRunDialog);
142 }
143
144 void create_mainmenu(void)
145 {
146         gSystemMenu = AxWin3_Menu_Create(NULL);
147         
148         AxWin3_Menu_AddItem(gSystemMenu, "Text &Editor\tWin+E", mainmenu_app_textedit, NULL, 0, NULL);
149         AxWin3_Menu_AddItem(gSystemMenu, "&Terminal Emulator\tWin+T", mainmenu_app_terminal, NULL, 0, NULL);
150         AxWin3_Menu_AddItem(gSystemMenu, NULL, NULL, NULL, 0, NULL);
151         AxWin3_Menu_AddItem(gSystemMenu, "&Run\tWin+R", mainmenu_run_dialog, NULL, 0, NULL);
152 }
153
154 // --------------------------------------------------------------------
155 // "Run" Dialog box
156 // --------------------------------------------------------------------
157 int run_dorun(tAxWin3_Widget *unused)
158 {
159         _SysDebug("DoRun pressed");
160         char *cmd = AxWin3_Widget_GetText(gRunInput);
161         _SysDebug("Command string '%s'", cmd);
162         
163         // TODO: Parse the command string into components
164         // TODO: Call _SysSpawn
165         
166         AxWin3_ShowWindow(gRunDialog, 0);
167         return 0;
168 }
169
170 int run_close(tAxWin3_Widget *unused)
171 {
172         _SysDebug("Run diaglog closed");
173         AxWin3_ShowWindow(gRunDialog, 0);
174         return 0;
175 }
176
177 tAxWin3_Widget *make_textbutton(tAxWin3_Widget *Parent, const char *Label, tAxWin3_Widget_FireCb handler)
178 {
179         tAxWin3_Widget  *ret, *txt;
180         ret = AxWin3_Widget_AddWidget(Parent, ELETYPE_BUTTON, ELEFLAG_ALIGN_CENTER, "_btn");
181         AxWin3_Widget_SetFireHandler(ret, handler);
182         AxWin3_Widget_AddWidget(ret, ELETYPE_NONE, 0, "_spacer1");
183         txt = AxWin3_Widget_AddWidget(ret, ELETYPE_TEXT, ELEFLAG_NOSTRETCH|ELEFLAG_NOEXPAND, "_txt");
184         AxWin3_Widget_SetText(txt, Label);
185         AxWin3_Widget_AddWidget(ret, ELETYPE_NONE, 0, "_spacer2");
186         return ret;
187 }
188
189 void create_run_dialog(void)
190 {
191         tAxWin3_Widget  *root, *box;
192         
193         gRunDialog = AxWin3_Widget_CreateWindow(NULL, RUN_WIDTH, RUN_HEIGHT, ELEFLAG_VERTICAL);
194         AxWin3_SetWindowTitle(gRunDialog, "Run Program...");
195         AxWin3_MoveWindow(gRunDialog, giScreenWidth/2-RUN_WIDTH/2, giScreenHeight/2-RUN_HEIGHT/2);
196
197         root = AxWin3_Widget_GetRoot(gRunDialog);
198
199         gRunInput = AxWin3_Widget_AddWidget(root, ELETYPE_TEXTINPUT, ELEFLAG_NOSTRETCH, "Input");
200         AxWin3_Widget_SetFireHandler(gRunInput, run_dorun);
201         
202         box = AxWin3_Widget_AddWidget(root, ELETYPE_BOX, ELEFLAG_ALIGN_CENTER, "Button Area");
203         make_textbutton(box, "Ok", run_dorun);
204         make_textbutton(box, "Cancel", run_close);
205 }
206

UCC git Repository :: git.ucc.asn.au