X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin4_src%2FServer%2Fipc.cpp;h=5f59ae193c841fe1640ffb014c5910dbe787c57d;hb=6fbf6b93bec9b8b5bd6d7c683eefb0ebed8dff77;hp=58cda2b813bc4a637e3d12b6a4324817dc1d54ad;hpb=6d84ebb571de34f19f674b8fc48c82bf3ce9edf6;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin4_src/Server/ipc.cpp b/Usermode/Applications/axwin4_src/Server/ipc.cpp index 58cda2b8..5f59ae19 100644 --- a/Usermode/Applications/axwin4_src/Server/ipc.cpp +++ b/Usermode/Applications/axwin4_src/Server/ipc.cpp @@ -25,7 +25,8 @@ namespace IPC { CCompositor* gpCompositor; ::std::list glChannels; -//::std::map glClients; +::std::map glClients; +uint16_t giNextClient = 1; void Initialise(const CConfigIPC& config, CCompositor& compositor) { @@ -64,20 +65,72 @@ void HandleSelect(const fd_set& rfds) void RegisterClient(CClient& client) { + _SysDebug("RegisterClient(&client=%p)", &client); // allocate a client ID, and save - //client.m_id = 123; - //glClients[client.m_id] = &client; + for( int i = 0; i < 100; i ++ ) + { + uint16_t id = giNextClient++; + if(giNextClient == 0) giNextClient = 1; + auto r = glClients.insert( ::std::pair(id, &client) ); + if( r.second == true ) + { + client.set_id(id); + return; + } + } + // Wut? 100 attempts and fail! + assert(!"Todo - Better way of handling client ID reuse"); +} + +CClient* GetClientByID(uint16_t id) +{ + auto it = glClients.find(id); + if(it == glClients.end()) { + //_SysDebug("Client %i not registered", id); + return nullptr; + } + else { + //_SysDebug("Client %i %i = %p", id, it->first, it->second); + return it->second; + } } void DeregisterClient(CClient& client) { - //glClients.erase( client.m_id ); + glClients.erase( client.id() ); } -void SendMessage_NotifyDims(CClient& client, unsigned int NewW, unsigned int NewH) +void SendMessage_NotifyDims(CClient& client, unsigned int WinID, unsigned int NewW, unsigned int NewH) +{ + _SysDebug("TODO: IPC::SendMessage_NotifyDims"); +} +void SendMessage_MouseButton(CClient& client, unsigned int WinID, unsigned int X, unsigned int Y, uint8_t Button, bool Pressed) +{ + CSerialiser msg; + msg.WriteU8(IPCMSG_INPUTEVENT); + msg.WriteU8(IPC_INEV_MOUSEBTN); + msg.WriteU16(WinID); + msg.WriteU16(X); + msg.WriteU16(Y); + msg.WriteU8(Button); + msg.WriteU8(Pressed ? 0 : 1); + client.SendMessage(msg); +} +void SendMessage_MouseMove(CClient& client, unsigned int WinID, unsigned int X, unsigned int Y) +{ + _SysDebug("TODO: IPC::SendMessage_MouseButton"); +} +void SendMessage_KeyEvent(CClient& client, unsigned int WinID, uint32_t KeySym, bool Pressed, const char *Translated) { - _SysDebug("TODO: CClient::SendNotify_Dims"); + CSerialiser msg; + msg.WriteU8(IPCMSG_INPUTEVENT); + msg.WriteU8(IPC_INEV_KEYBOARD); + msg.WriteU16(WinID); + msg.WriteU16(KeySym); + msg.WriteU8(Pressed ? 0 : 1); + msg.WriteString(Translated); + client.SendMessage(msg); } @@ -163,7 +216,7 @@ void HandleMessage_CreateWindow(CClient& client, CDeserialiser& message) ::std::string name = message.ReadString(); ::_SysDebug("_CreateWindow: (%i, '%s')", new_id, name.c_str()); - client.SetWindow( new_id, gpCompositor->CreateWindow(client, name) ); + client.SetWindow( new_id, new CWindow(*gpCompositor, client, name, new_id) ); } void HandleMessage_DestroyWindow(CClient& client, CDeserialiser& message)