AcesNative+Usermode - libacessnative "works" (for some definitions)
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / main.c
1 /*
2  * Acess2 GUI (AxWin) Version 3
3  * - By John Hodge (thePowersGang)
4  *
5  * main.c
6  * - Entrypoint
7  */
8 #include <common.h>
9 #include <acess/sys.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <axwin3/keysyms.h>
13
14 // === IMPORTS ===
15 extern void     Video_Setup(void);
16 extern void     WM_Initialise(void);
17 extern int      Renderer_Menu_Init(void);
18 extern int      Renderer_Widget_Init(void);
19 extern int      Renderer_Background_Init(void);
20 extern int      Renderer_Framebuffer_Init(void);
21 extern int      Renderer_RichText_Init(void);
22 extern void     WM_Update(void);
23 extern void     WM_Hotkey_Register(int nKeys, uint32_t *Keys, const char *ActionName);
24
25 // === PROTOTYPES ===
26 void    ParseCommandline(int argc, char **argv);
27
28 // === GLOBALS ===
29 const char      *gsTerminalDevice = NULL;
30 const char      *gsMouseDevice = NULL;
31
32  int    giScreenWidth = 640;
33  int    giScreenHeight = 480;
34
35  int    giTerminalFD = -1;
36  int    giTerminalFD_Input = 0;
37  int    giMouseFD = -1;
38
39 #define __INSTALL_ROOT  "/Acess/Apps/AxWin/3.0"
40
41 const char      *gsInstallRoot = __INSTALL_ROOT;
42 const char      *gsInterfaceApp = __INSTALL_ROOT"/AxWinUI";
43  int    gbNoSpawnUI = 0;
44
45 // === CODE ===
46 /**
47  * \brief Program Entrypoint
48  */
49 int main(int argc, char *argv[])
50 {
51         ParseCommandline(argc, argv);
52         
53         if( gsTerminalDevice == NULL ) {
54                 gsTerminalDevice = "/Devices/VTerm/6";
55         }
56         if( gsMouseDevice == NULL ) {
57                 gsMouseDevice = "/Devices/Mouse/system";
58         }
59         
60         Video_Setup();
61         IPC_Init();
62         Input_Init();
63         
64         Renderer_Menu_Init();
65         Renderer_Widget_Init();
66         Renderer_Background_Init();
67         Renderer_Framebuffer_Init();
68         Renderer_RichText_Init();
69         WM_Initialise();
70
71         // TODO: Move these to config
72         uint32_t        keys[4];
73         keys[0] = KEYSYM_LEFTGUI;       keys[1] = KEYSYM_r;
74         WM_Hotkey_Register(2, keys, "Interface>Run");
75         keys[0] = KEYSYM_LEFTGUI;       keys[1] = KEYSYM_t;
76         WM_Hotkey_Register(2, keys, "Interface>Terminal");
77         keys[0] = KEYSYM_LEFTGUI;       keys[1] = KEYSYM_e;
78         WM_Hotkey_Register(2, keys, "Interface>TextEdit");
79         
80         // Spawn interface root
81         if( !gbNoSpawnUI )
82         {
83                 int     server_tid = gettid();
84                 _SysDebug("server_tid = %i", server_tid);
85                 char    server_info[] = "AXWIN3_SERVER=00000";
86                 const char      *envp[] = {server_info, NULL};
87                 const char      *argv[] = {gsInterfaceApp, NULL};
88                 _SysDebug("server_tid = %i, &server_tid = %p", server_tid, &server_tid);
89                 sprintf(server_info, "AXWIN3_SERVER=%i", server_tid);
90                 // TODO: Does the client need FDs?
91                  int    rv = _SysSpawn(gsInterfaceApp, argv, envp, 0, NULL, NULL);
92                 if( rv < 0 ) {
93                         _SysDebug("_SysSpawn chucked a sad, rv=%i, errno=%i", rv, _errno);
94                 }
95         }
96
97         // Main Loop
98         for(;;)
99         {
100                 fd_set  fds;
101                  int    nfds = 0;
102                 FD_ZERO(&fds);
103         
104                 WM_Update();
105
106                 Input_FillSelect(&nfds, &fds);
107                 IPC_FillSelect(&nfds, &fds);
108                 
109                 nfds ++;
110                 if( _SysSelect(nfds, &fds, NULL, NULL, NULL, THREAD_EVENT_IPCMSG) == -1 ) {
111                         _SysDebug("ERROR: select() returned -1");
112                         return -1;
113                 }
114
115                 Input_HandleSelect(&fds);
116                 IPC_HandleSelect(&fds);
117         }
118         return 0;
119 }
120
121 void PrintUsage(void)
122 {
123         fprintf(stderr, "Arguments:\n");
124         fprintf(stderr, "  --no-ui  : Don't spawn the UI process\n");
125 }
126
127 void ParseCommandline(int argc, char **argv)
128 {
129         for( int i = 1; i < argc; i ++ )
130         {
131                 if( argv[i][0] != '-' ) {
132                         // Error?
133                         PrintUsage();
134                         exit(-1);
135                 }
136                 else if( argv[i][1] != '-' ) {
137                         // Short
138                         PrintUsage();
139                         exit(-1);
140                 }
141                 else {
142                         // Long
143                         if( strcmp(argv[i], "--no-ui") == 0 ) {
144                                 gbNoSpawnUI = 1;
145                         }
146                         else {
147                                 // Error.
148                                 PrintUsage();
149                                 exit(-1);
150                         }
151                 }
152         }
153 }
154

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