Usermode/libc - Fix strchr and strrchr behavior
[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 <string.h>
13 #include "include/lowlevel.h"
14
15 // === IMPORTS ===
16 extern void     Video_Setup(void);
17 extern void     WM_Initialise(void);
18 extern void     WM_Update(void);
19
20 // === PROTOTYPES ===
21 void    ParseCommandline(int argc, char **argv);
22
23 // === GLOBALS ===
24 const char      *gsTerminalDevice = NULL;
25 const char      *gsMouseDevice = NULL;
26
27  int    giScreenWidth = 640;
28  int    giScreenHeight = 480;
29
30  int    giTerminalFD = -1;
31  int    giTerminalFD_Input = 0;
32  int    giMouseFD = -1;
33
34 #define __INSTALL_ROOT  "/Acess/Apps/AxWin/3.0"
35
36 const char      *gsInstallRoot = __INSTALL_ROOT;
37 const char      *gsInterfaceApp = __INSTALL_ROOT"/AxWinUI";
38  int    gbNoSpawnUI = 0;
39
40 // === CODE ===
41 /**
42  * \brief Program Entrypoint
43  */
44 int main(int argc, char *argv[])
45 {
46         ParseCommandline(argc, argv);
47         
48         if( gsTerminalDevice == NULL ) {
49                 gsTerminalDevice = "/Devices/VTerm/6";
50         }
51         if( gsMouseDevice == NULL ) {
52                 gsMouseDevice = "/Devices/Mouse/system";
53         }
54         
55         Video_Setup();
56         IPC_Init();
57         Input_Init();
58         
59         WM_Initialise();
60         
61         // Spawn interface root
62         if( !gbNoSpawnUI )
63         {
64                 int     server_tid = gettid();
65                 _SysDebug("server_tid = %i", server_tid);
66                 char    server_info[] = "AXWIN3_SERVER=00000";
67                 const char      *envp[] = {server_info, NULL};
68                 const char      *argv[] = {gsInterfaceApp, NULL};
69                 _SysDebug("server_tid = %i, &server_tid = %p", server_tid, &server_tid);
70                 sprintf(server_info, "AXWIN3_SERVER=%i", server_tid);
71                 // TODO: Does the client need FDs?
72                  int    rv = _SysSpawn(gsInterfaceApp, argv, envp, 0, NULL, NULL);
73                 if( rv < 0 ) {
74                         _SysDebug("_SysSpawn chucked a sad, rv=%i, errno=%i", rv, _errno);
75                 }
76         }
77
78         // Main Loop
79         for(;;)
80         {
81                 fd_set  fds;
82                 fd_set  efds;
83                  int    nfds = 0;
84                 FD_ZERO(&fds);
85                 FD_ZERO(&efds);
86         
87                 WM_Update();
88
89                 Input_FillSelect(&nfds, &fds);
90                 IPC_FillSelect(&nfds, &fds, &efds);
91                 
92                 nfds ++;
93                 if( _SysSelect(nfds, &fds, NULL, &efds, NULL, THREAD_EVENT_IPCMSG) == -1 ) {
94                         _SysDebug("ERROR: select() returned -1");
95                         return -1;
96                 }
97
98                 Input_HandleSelect(&fds);
99                 IPC_HandleSelect(&fds, &efds);
100         }
101         return 0;
102 }
103
104 void PrintUsage(void)
105 {
106         fprintf(stderr, "Arguments:\n");
107         fprintf(stderr, "  --no-ui  : Don't spawn the UI process\n");
108 }
109
110 void ParseCommandline(int argc, char **argv)
111 {
112         for( int i = 1; i < argc; i ++ )
113         {
114                 if( argv[i][0] != '-' ) {
115                         // Error?
116                         PrintUsage();
117                         exit(-1);
118                 }
119                 else if( argv[i][1] != '-' ) {
120                         // Short
121                         PrintUsage();
122                         exit(-1);
123                 }
124                 else {
125                         // Long
126                         if( strcmp(argv[i], "--no-ui") == 0 ) {
127                                 gbNoSpawnUI = 1;
128                         }
129                         else {
130                                 // Error.
131                                 PrintUsage();
132                                 exit(-1);
133                         }
134                 }
135         }
136 }
137

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