5 #include <IIPCChannel.hpp>
8 #include <serialisation.hpp>
9 #include <ipc_proto.hpp>
10 #include <CCompositor.hpp>
18 CCompositor* gpCompositor;
19 ::std::list<IIPCChannel*> channels;
21 void Initialise(const CConfigIPC& config, CCompositor* compositor)
23 gpCompositor = compositor;
24 //for( auto channel : config.m_channels )
26 // channels.push_back( );
30 int FillSelect(fd_set& rfds)
33 for( auto channel : channels )
35 ret = ::std::max(ret, channel->FillSelect(rfds));
40 void HandleSelect(fd_set& rfds)
45 void RegisterClient(IIPCChannel& channel, CClient& client)
52 typedef void MessageHandler_op_t(CClient& client, CDeserialiser& message);
53 MessageHandler_op_t HandleMessage_Ping;
54 MessageHandler_op_t HandleMessage_GetWindowAttr;
55 MessageHandler_op_t HandleMessage_Reply;
56 MessageHandler_op_t HandleMessage_CreateWindow;
57 MessageHandler_op_t HandleMessage_CloseWindow;
58 MessageHandler_op_t HandleMessage_SetWindowAttr;
59 MessageHandler_op_t HandleMessage_AddRegion;
60 MessageHandler_op_t HandleMessage_DelRegion;
61 MessageHandler_op_t HandleMessage_SetRegionAttr;
62 MessageHandler_op_t HandleMessage_PushData;
63 MessageHandler_op_t HandleMessage_SendIPC;
65 MessageHandler_op_t *message_handlers[] = {
66 [IPCMSG_PING] = &HandleMessage_Ping,
67 [IPCMSG_REPLY] = &HandleMessage_Reply,
69 [IPCMSG_CREATEWIN] = &HandleMessage_CreateWindow,
70 [IPCMSG_CLOSEWIN] = &HandleMessage_CloseWindow,
71 [IPCMSG_SETWINATTR] = &HandleMessage_SetWindowAttr,
72 [IPCMSG_GETWINATTR] = &HandleMessage_GetWindowAttr,
74 [IPCMSG_RGNADD] = &HandleMessage_AddRegion,
75 [IPCMSG_RGNDEL] = &HandleMessage_DelRegion,
76 [IPCMSG_RGNSETATTR] = &HandleMessage_SetRegionAttr,
77 [IPCMSG_RGNPUSHDATA]= &HandleMessage_PushData, // to a region
78 [IPCMSG_SENDIPC] = &HandleMessage_SendIPC, // Use the GUI server for low-bandwith inter-process messaging
81 void HandleMessage(CClient& client, CDeserialiser& message)
83 unsigned int command = message.ReadU8();
84 if( command >= sizeof(message_handlers)/sizeof(IPC::MessageHandler_op_t*) ) {
85 // Drop, invalid command
89 (message_handlers[command])(client, message);
92 void HandleMessage_Reply(CClient& client, CDeserialiser& message)
94 // Reply to a sent message
95 // - Not many messages need server-bound replies
96 int orig_command = message.ReadU8();
100 // Ping reply, mark client as still responding
108 void HandleMessage_Ping(CClient& client, CDeserialiser& message)
110 // A client has asked for a ping, we pong them back
112 reply.WriteU8(IPCMSG_REPLY);
113 reply.WriteU8(IPCMSG_PING);
114 client.SendMessage(reply);
117 void HandleMessage_CreateWindow(CClient& client, CDeserialiser& message)
119 uint16_t parent_id = message.ReadU16();
120 uint16_t new_id = message.ReadU16();
121 CWindow* parent = client.GetWindow( parent_id );
123 client.SetWindow( new_id, gpCompositor->CreateWindow(client) );
126 void HandleMessage_CloseWindow(CClient& client, CDeserialiser& message)
131 void HandleMessage_SetWindowAttr(CClient& client, CDeserialiser& message)
136 void HandleMessage_GetWindowAttr(CClient& client, CDeserialiser& message)
141 void HandleMessage_AddRegion(CClient& client, CDeserialiser& message)
146 void HandleMessage_DelRegion(CClient& client, CDeserialiser& message)
151 void HandleMessage_SetRegionAttr(CClient& client, CDeserialiser& message)
156 void HandleMessage_PushData(CClient& client, CDeserialiser& message)
161 void HandleMessage_SendIPC(CClient& client, CDeserialiser& message)
167 }; // namespace AxWin