X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin4_src%2FServer%2Fmain.cpp;h=1b64da4e324ea86a0ca3daf7051d4d7e4af2611e;hb=8b72370eae1a3cfa8916136fd8ffc1460e9291ba;hp=8f0d9e87b2e1cb3be8bddc2f9e495fef0956c79d;hpb=b471bc9adca2cf2126c2b579bf0b33cedd2839a4;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin4_src/Server/main.cpp b/Usermode/Applications/axwin4_src/Server/main.cpp index 8f0d9e87..1b64da4e 100644 --- a/Usermode/Applications/axwin4_src/Server/main.cpp +++ b/Usermode/Applications/axwin4_src/Server/main.cpp @@ -15,6 +15,9 @@ #include #include +#include +#include + extern "C" { #include #include @@ -32,39 +35,107 @@ int main(int argc, char *argv[]) } catch(const std::exception& e) { fprintf(stderr, "Exception: %s\n", e.what()); + _SysDebug("Config threw exception: %s", e.what()); return 1; } - // - Open graphics - CVideo* vid = new CVideo(config.m_video); - // - Initialise compositor structures - CCompositor* compositor = new CCompositor(/*config.m_compositor,*/ *vid); - // - Open input - Input::Initialise(config.m_input); - // > Handles hotkeys? - // - Bind IPC channels - IPC::Initialise(config.m_ipc, compositor); - // - Start root child process (from config) - // TODO: Spin up child process - + + CVideo* vid = 0; + CCompositor* compositor = 0; + CInput* input = 0; + + try { + // - Open graphics + vid = new CVideo(config.m_video); + ::_SysDebug("vid = %p", vid); + // - Initialise compositor structures + compositor = new CCompositor(/*config.m_compositor,*/ *vid); + ::_SysDebug("compositor = %p", compositor); + // - Open input + input = new CInput(config.m_input, *compositor); + ::_SysDebug("input = %p", input); + // > Handles hotkeys? + // - Bind IPC channels + IPC::Initialise(config.m_ipc, *compositor); + ::_SysDebug("IPC up"); + // - Start root child process (from config) + // TODO: Spin up child process + + { + const char *interface_app = "/Acess/Apps/AxWin/4.0/AxWinUI"; + const char *argv[] = {interface_app, NULL}; + int rv = _SysSpawn(interface_app, argv, NULL, 0, NULL, NULL); + if( rv < 0 ) { + _SysDebug("_SysSpawn chucked a sad, rv=%i, errno=%i", rv, _errno); + throw ::std::system_error(errno, ::std::system_category()); + } + } + } + catch(const ::std::exception& e) { + fprintf(stderr, "Startup threw exception: %s\n", e.what()); + _SysDebug("Startup threw exception: %s", e.what()); + delete input; + delete compositor; + delete vid; + return 1; + } + // - Event loop for( ;; ) { int nfd = 0; - fd_set rfds; + fd_set rfds, efds; - nfd = ::std::max(nfd, Input::FillSelect(rfds)); + FD_ZERO(&rfds); + FD_ZERO(&efds); + + nfd = ::std::max(nfd, input->FillSelect(rfds)); nfd = ::std::max(nfd, IPC::FillSelect(rfds)); + for( int i = 0; i < nfd; i ++ ) + if( FD_ISSET(i, &rfds) ) + FD_SET(i, &efds); + + #if 0 + for( int i = 0; i < nfd; i ++ ) { + if( FD_ISSET(i, &rfds) ) { + _SysDebug("FD%i", i); + } + } + #endif + // TODO: Support _SysSendMessage IPC? int64_t timeout = Timing::GetTimeToNextEvent(); - int rv = ::_SysSelect(nfd, &rfds, NULL, &rfds, &timeout, 0); - - Timing::CheckEvents(); + int64_t *timeoutp; + if( timeout >= 0 ) { + ::_SysDebug("Calling select with timeout %lli", timeout); + timeoutp = &timeout; + } + else { + //::_SysDebug("Calling select with no timeout"); + timeoutp = 0; + } + int rv = ::_SysSelect(nfd, &rfds, NULL, NULL/*&efds*/, timeoutp, 0); - Input::HandleSelect(rfds); - IPC::HandleSelect(rfds); + #if 0 + for( int i = 0; i < nfd; i ++ ) { + if( FD_ISSET(i, &rfds) ) { + _SysDebug("FD%i", i); + } + } + #endif + //_SysDebug("rv=%i, timeout=%lli", rv, timeout); - compositor->Redraw(); + try { + Timing::CheckEvents(); + + input->HandleSelect(rfds); + IPC::HandleSelect(rfds); + + compositor->Redraw(); + } + catch(...) { + ::_SysDebug("Exception during select handling"); + } } return 0; }