]> Pileus Git - wmpus/blob - wayland.c
Add home grown wayland protocol
[wmpus] / wayland.c
1 #define WL_DEFINE_TABLES
2
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include "wayland.h"
6
7 int warn(char *msg);
8
9 /* Test */
10 typedef int (*callback_t)(void *obj, uint16_t op, void *data);
11
12 typedef struct
13 {
14         uint32_t       max;
15         wl_header_t    head;
16         wl_request_t   req;
17         wl_event_t     evt;
18         void          *data;
19 } msg_t;
20
21 typedef struct
22 {
23         uint32_t       id;
24         callback_t     func;
25         wl_interface_t iface;
26 } obj_t;
27
28 int step(int fd, msg_t *msg)
29 {
30         obj_t *obj = NULL;
31
32         // Read header
33         int hlen = sizeof(msg->head);
34         if (read(fd, &msg->head, hlen) < hlen)
35                 warn("short head read");
36
37         // Read header info
38         int id  = msg->head.id;
39         int len = msg->head.len;
40         int op  = msg->head.op;
41
42         // Allocate data
43         if (len > msg->max) {
44                 msg->max  = len;
45                 msg->data = realloc(msg->data, len);
46                 if (!msg->data)
47                         warn("no memory");
48         }
49
50         // Read body
51         if (read(fd, msg->data, len) < len)
52                 warn("short data read");
53
54         // Find Object
55         (void)id;
56         (void)obj;
57         int        iface = obj->iface;
58         callback_t func  = obj->func;
59
60         // No parsing needed
61         if (!wl_rarray[iface] || !wl_rarray[iface][op])
62                 return func(obj, op, msg->data);
63
64         // Parse body
65         const char *info = wl_rarray[iface][op];
66         uint32_t *sptr = (uint32_t*) msg->data;
67         uint32_t *dptr = (uint32_t*)&msg->req;
68         for (int i = 0; info[i]; i++) {
69                 switch (info[i]) {
70                         case WL_ARRAY_NONE:
71                                 *dptr++       = *sptr++;  // data
72                                 break;
73                         case WL_ARRAY_STRING:
74                                 *dptr++       = *sptr++;  // length
75                                 *(void**)dptr =  sptr;    // pointer
76                                 dptr += (((len/4)+1)/4);
77                                 sptr += (sizeof(void*)/4);
78                                 break;
79                         case WL_ARRAY_ARRAY:
80                                 *dptr++       = *sptr++;  // length
81                                 *(void**)dptr =  sptr;    // pointer
82                                 dptr += ((((len-1)/4)+1)/4);
83                                 sptr += (sizeof(void*)/4);
84                                 break;
85                         case WL_ARRAY_FD:
86                                 // todo
87                                 break;
88                 }
89         }
90         return func(obj, op, &msg->req);
91 }
92
93 int main(int argc, char **argv)
94 {
95         int    fd  = 0;
96         msg_t  msg = {};
97
98         while (1) {
99                 // Find file descriptor
100                 //if (!select(fd))
101                 //      warn("error in select");;
102
103                 // Process request
104                 if (!step(fd, &msg))
105                         warn("error stepping");
106         }
107 }
108
109 int main()
110 {
111         wl_init();
112         while ((msg = wl_run())) {
113                 switch msg(
114         }
115 }