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