* expedite: Massive cleanup.
[framework/uifw/expedite.git] / src / bin / engine_software_xlib.c
1 #include "main.h"
2
3 #include <X11/Xlib.h>
4 #include <X11/Xutil.h>
5 #include <Evas_Engine_Software_X11.h>
6
7 static Display *disp = NULL;
8 static Window win = 0;
9 static int first_expose = 0;
10
11 Eina_Bool
12 engine_software_xlib_args(const char *engine, int width, int height)
13 {
14    XSetWindowAttributes attr;
15    XClassHint chint;
16    XSizeHints szhints;
17    Evas_Engine_Info_Software_X11 *einfo;
18    int i;
19
20    disp = XOpenDisplay(NULL);
21    if (!disp) return EINA_FALSE;
22
23    evas_output_method_set(evas, evas_render_method_lookup("software_x11"));
24    einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas);
25    if (!einfo)
26      {
27         printf("Evas does not support the Software Xlib Engine\n");
28         goto close_display;
29      }
30
31    einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
32    einfo->info.connection = disp;
33    einfo->info.screen = NULL;
34    einfo->info.visual = einfo->func.best_visual_get(0, disp, DefaultScreen(disp));
35    einfo->info.colormap = einfo->func.best_colormap_get(0, disp, DefaultScreen(disp));
36    einfo->info.depth = einfo->func.best_depth_get(0, disp, DefaultScreen(disp));
37    einfo->info.rotation = 0;
38    einfo->info.debug = 0;
39    attr.backing_store = NotUseful;
40    attr.colormap = einfo->info.colormap;
41    attr.border_pixel = 0;
42    attr.background_pixmap = None;
43    attr.event_mask =
44      ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
45      StructureNotifyMask | EnterWindowMask | LeaveWindowMask |
46      KeyPressMask | KeyReleaseMask;
47    attr.bit_gravity = ForgetGravity;
48    win = XCreateWindow(disp, DefaultRootWindow(disp),
49                        0, 0, width, height, 0,
50                        einfo->info.depth, InputOutput,
51                        einfo->info.visual,
52                        CWBackingStore | CWColormap |
53                        CWBackPixmap | CWBorderPixel |
54                        CWBitGravity | CWEventMask,
55                        &attr);
56    if (!win)
57      goto close_display;
58
59    einfo->info.drawable = win;
60    if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo))
61      {
62         printf("Evas can not setup the informations of the Software Xlib Engine\n");
63         goto destroy_window;
64      }
65
66    XStoreName(disp, win, "Expedite - Evas Test Suite");
67    chint.res_name = "expedite";
68    chint.res_class = "Expedite";
69    XSetClassHint(disp, win, &chint);
70    szhints.flags = PMinSize | PMaxSize | PSize | USSize;
71    szhints.min_width = szhints.max_width = width;
72    szhints.min_height = szhints.max_height = height;
73    XSetWMNormalHints(disp, win, &szhints);
74    XMapWindow(disp, win);
75    XSync(disp, False);
76    while (!first_expose)
77      engine_software_xlib_loop();
78    return EINA_TRUE;
79
80  destroy_window:
81    XDestroyWindow(disp, win);
82  close_display:
83    XCloseDisplay(disp);
84
85    return EINA_FALSE;
86 }
87
88 void
89 engine_software_xlib_loop(void)
90 {
91    XEvent ev;
92    KeySym ks;
93    char *kstr;
94
95    again:
96    if (!XCheckMaskEvent(disp,
97                         ExposureMask |
98                         StructureNotifyMask |
99                         KeyPressMask |
100                         KeyReleaseMask |
101                         ButtonPressMask |
102                         ButtonReleaseMask |
103                         PointerMotionMask |
104                         EnterWindowMask |
105                         LeaveWindowMask, &ev))
106      return;
107    switch (ev.type)
108      {
109       case ButtonPress:
110         evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y, 0, NULL);
111         evas_event_feed_mouse_down(evas, ev.xbutton.button, EVAS_BUTTON_NONE, 0, NULL);
112         break;
113       case ButtonRelease:
114         evas_event_feed_mouse_move(evas, ev.xbutton.x, ev.xbutton.y, 0, NULL);
115         evas_event_feed_mouse_up(evas, ev.xbutton.button, EVAS_BUTTON_NONE, 0, NULL);
116         break;
117       case MotionNotify:
118         evas_event_feed_mouse_move(evas, ev.xmotion.x, ev.xmotion.y, 0, NULL);
119         break;
120       case Expose:
121         first_expose = 1;
122         evas_damage_rectangle_add(evas,
123                                   ev.xexpose.x,
124                                   ev.xexpose.y,
125                                   ev.xexpose.width,
126                                   ev.xexpose.height);
127         break;
128       case ConfigureNotify:
129         evas_output_viewport_set(evas, 0, 0,
130                                  ev.xconfigure.width,
131                                  ev.xconfigure.height);
132         evas_output_size_set(evas,
133                              ev.xconfigure.width,
134                              ev.xconfigure.height);
135         win_w = ev.xconfigure.width;
136         win_h = ev.xconfigure.height;
137         break;
138       case EnterNotify:
139         evas_event_feed_mouse_in(evas, 0, NULL);
140         break;
141       case LeaveNotify:
142         evas_event_feed_mouse_out(evas, 0, NULL);
143         break;
144       case KeyPress:
145         ks = XKeycodeToKeysym(ev.xkey.display, ev.xkey.keycode, 0);
146         kstr = XKeysymToString(ks);
147         if (kstr)
148           {
149              if ((!strcmp(kstr, "Shift_L")) ||
150                  (!strcmp(kstr, "Shift_R")))
151                evas_key_modifier_on(evas, "Shift");
152              if ((!strcmp(kstr, "Control_L")) ||
153                  (!strcmp(kstr, "Control_R")))
154                evas_key_modifier_on(evas, "Control");
155              if ((!strcmp(kstr, "Alt_L")) ||
156                  (!strcmp(kstr, "Alt_R")))
157                evas_key_modifier_on(evas, "Alt");
158              if ((!strcmp(kstr, "Super_L")) ||
159                  (!strcmp(kstr, "Super_R")))
160                evas_key_modifier_on(evas, "Super");
161              if (!strcmp(kstr, "Caps_Lock"))
162                {
163                   if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock"))
164                     evas_key_lock_off(evas, "Caps_Lock");
165                   else
166                     evas_key_lock_on(evas, "Caps_Lock");
167                }
168              if (!strcmp(kstr, "Num_Lock"))
169                {
170                   if (evas_key_lock_is_set(evas_key_lock_get(evas), "Num_Lock"))
171                     evas_key_lock_off(evas, "Num_Lock");
172                   else
173                     evas_key_lock_on(evas, "Num_Lock");
174                }
175              if (!strcmp(kstr, "Scroll_Lock"))
176                {
177                   if (evas_key_lock_is_set(evas_key_lock_get(evas), "Scroll_Lock"))
178                     evas_key_lock_off(evas, "Scroll_Lock");
179                   else
180                     evas_key_lock_on(evas, "Scroll_Lock");
181                }
182              if (kstr) evas_event_feed_key_down(evas, kstr, kstr, NULL, NULL, 0, NULL);
183           }
184         break;
185       case KeyRelease:
186         ks = XKeycodeToKeysym(ev.xkey.display, ev.xkey.keycode, 0);
187         kstr = XKeysymToString(ks);
188         if (kstr)
189           {
190              if ((!strcmp(kstr, "Shift_L")) ||
191                  (!strcmp(kstr, "Shift_R")))
192                evas_key_modifier_off(evas, "Shift");
193              if ((!strcmp(kstr, "Control_L")) ||
194                  (!strcmp(kstr, "Control_R")))
195                evas_key_modifier_off(evas, "Control");
196              if ((!strcmp(kstr, "Alt_L")) ||
197                  (!strcmp(kstr, "Alt_R")))
198                evas_key_modifier_off(evas, "Alt");
199              if ((!strcmp(kstr, "Super_L")) ||
200                  (!strcmp(kstr, "Super_R")))
201                evas_key_modifier_off(evas, "Super");
202              evas_event_feed_key_up(evas, kstr, kstr, NULL, NULL, 0, NULL);
203           }
204         break;
205       default:
206         break;
207      }
208    goto again;
209 }
210
211 void
212 engine_software_xlib_shutdown(void)
213 {
214    XDestroyWindow(disp, win);
215    XCloseDisplay(disp);
216 }