2 Simple DirectMedia Layer
3 Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
4 Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
6 This software is provided 'as-is', without any express or implied
7 warranty. In no event will the authors be held liable for any damages
8 arising from the use of this software.
10 Permission is granted to anyone to use this software for any purpose,
11 including commercial applications, and to alter it and redistribute it
12 freely, subject to the following restrictions:
14 1. The origin of this software must not be misrepresented; you must not
15 claim that you wrote the original software. If you use this software
16 in a product, an acknowledgment in the product documentation would be
17 appreciated but is not required.
18 2. Altered source versions must be plainly marked as such, and must not be
19 misrepresented as being the original software.
20 3. This notice may not be removed or altered from any source distribution.
23 #include "../../SDL_internal.h"
25 #if SDL_VIDEO_DRIVER_TIZEN
27 #include "../SDL_sysvideo.h"
28 #include "../../events/SDL_windowevents_c.h"
29 #include "../SDL_egl_c.h"
30 #include "SDL_tizenwindow.h"
31 #include "SDL_tizenvideo.h"
32 #include "SDL_tizentouch.h"
33 #include "SDL_tizenkeyboard.h"
35 #include "SDL_tizenmouse.h"
36 #include "SDL_tizenevents_c.h"
38 #include "SDL_hints.h"
39 #include "../../events/SDL_mouse_c.h"
40 #include "../../joystick/tizen/SDL_sysjoystick_c.h"
41 #include <wayland-egl.h>
44 Tizen_GetWindowWMInfo(_THIS, SDL_Window *window, SDL_SysWMinfo *info)
46 SDL_WindowData *wmdata = (SDL_WindowData *)window->driverdata;
47 info->info.tizen.egl_display = NULL;
48 info->info.tizen.egl_surface = NULL;
49 #if SDL_VIDEO_OPENGL_EGL
52 info->info.tizen.egl_display = (void*)_this->egl_data->egl_display;
54 info->info.tizen.egl_surface = (void*)wmdata->egl_surface;
56 info->subsystem = SDL_SYSWM_TIZEN;
61 Tizen_SetWindowHitTest(SDL_Window *window, SDL_bool enabled)
63 return 0; /* just succeed, the real work is done elsewhere. */
67 Tizen_ShowWindow(_THIS, SDL_Window *window)
69 SDL_WindowData *wind = window->driverdata;
70 ecore_wl_window_show(wind->window);
74 Tizen_SetWindowFullscreen(_THIS, SDL_Window *window,
75 SDL_VideoDisplay *_display, SDL_bool fullscreen)
81 _tizen_window_orientaiton_hint_callback(void *userdata, const char *name, const char *oldValue, const char *newValue)
84 char orientation_type[4][20] = {"Portrait","LandscapeLeft","PortraitUpsideDown","LandscapeRight"};
85 int checked[4] = {0,};
88 SDL_WindowData *wind = (SDL_WindowData*)userdata;
89 Ecore_Wl_Window *window = wind->window;
91 if (wind->rotation_supported == 0)
96 SDL_assert(SDL_strncmp(name, SDL_HINT_ORIENTATIONS, SDL_strlen(SDL_HINT_ORIENTATIONS)) == 0);
98 if ((oldValue == NULL) && (newValue == NULL)) {
103 p_str = SDL_strstr(newValue, orientation_type[i]);
105 if (p_str == newValue) {
108 else if (i == 1) rot = 90;
109 else if (i == 2) rot = 180;
110 else if (i == 3) rot = 270;
111 wind->rotation = rot;
116 SDL_Log("SDL %s: avaiable rotation: 0", __FUNCTION__);
120 SDL_Log("SDL %s: avaiable rotation: 90", __FUNCTION__);
124 SDL_Log("SDL %s: avaiable rotation: 180", __FUNCTION__);
128 SDL_Log("SDL %s: avaiable rotation: 270", __FUNCTION__);
136 ecore_wl_window_rotation_preferred_rotation_set(window,wind->rotation);
138 ecore_wl_window_rotation_available_rotations_set(window, (const int*)checked, j);
143 _tizen_window_orientation_add_hint(void *data)
145 SDL_WindowData *wind = (SDL_WindowData*)data;
146 if (wind->rotation_supported == 0) {
150 SDL_AddHintCallback(SDL_HINT_ORIENTATIONS, _tizen_window_orientaiton_hint_callback, data);
154 Tizen_CreateWindow(_THIS, SDL_Window *window)
156 SDL_VideoData *data = _this->driverdata;
157 SDL_WindowData *wind;
158 Ecore_Wl_Global *global;
159 Eina_Inlist *globals;
161 wind = calloc(1, sizeof * wind);
163 return SDL_OutOfMemory();
166 window->driverdata = wind;
168 #if SDL_VIDEO_OPENGL_EGL
169 if (window->flags & SDL_WINDOW_OPENGL) {
170 SDL_GL_LoadLibrary(NULL);
174 if (window->x == SDL_WINDOWPOS_UNDEFINED) {
177 if (window->y == SDL_WINDOWPOS_UNDEFINED) {
181 if (!(globals = ecore_wl_globals_get()))
183 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to get wayland globals");
187 wind->window = ecore_wl_window_new(NULL,
188 window->x, window->y, window->w, window->h,
189 ECORE_WL_WINDOW_BUFFER_TYPE_SHM);
190 wind->surface = ecore_wl_window_surface_create(wind->window);
192 wind->rotation_supported = 0;
193 wind->received_rotation = 0;
194 ecore_wl_window_opaque_region_set(wind->window, window->x, window->y, window->w, window->h);
196 #if SDL_VIDEO_OPENGL_EGL
197 if (window->flags & SDL_WINDOW_OPENGL) {
198 wind->egl_window = wl_egl_window_create(ecore_wl_window_surface_get(wind->window), window->w, window->h);
200 /* Create the GLES window surface */
201 wind->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) wind->egl_window);
202 if (wind->egl_surface == EGL_NO_SURFACE) {
203 SDL_SetError("failed to create a window surface");
209 wind->id = ecore_wl_window_id_get(wind->window);
210 eina_hash_add(data->windows, &wind->id, window);
212 Tizen_InitKeyboard(_this);
214 SDL_SetMouseFocus(window);
216 if (window->flags & 0x00008000) {
217 SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "---------------------------------------");
218 SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "[SDL] touch bypass setting is done!\n");
219 SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "---------------------------------------");
220 ecore_wl_window_input_region_set(wind->window, -1, -1, 1, 1);
221 ecore_wl_window_focus_skip_set(wind->window, EINA_TRUE);
224 EINA_INLIST_FOREACH(globals, global) {
225 if (!strcmp(global->interface, "tizen_policy_ext")) {
226 wind->rotation_supported = 1;
227 SDL_Log("SDL can support rotation in this device!!!!!!!!!!!");
231 // Add orientaiton hint cb
232 _tizen_window_orientation_add_hint((void*)wind);
237 _tizen_setwindowsize(SDL_Window *window, int update_egl)
239 SDL_WindowData *wind = window->driverdata;
245 // TODO : consider to rotation status.
246 #if SDL_VIDEO_OPENGL_EGL
247 if ((window->flags & SDL_WINDOW_OPENGL) && (update_egl == 1)) {
248 int aw, ah, dx = 0, dy = 0;
250 if ((wind->rotation == 90) || (wind->rotation == 270))
251 wl_egl_window_get_attached_size(wind->egl_window, &ah, &aw);
253 wl_egl_window_get_attached_size(wind->egl_window, &aw, &ah);
255 SDL_Log("SDL %s:wl_egl_window_get_attached_size:rot(%i)%ix%i",__FUNCTION__,wind->rotation,aw,ah);
257 // TODO : if window size is not FULL, we need the code about Non FullSize Window.
258 wl_egl_window_resize(wind->egl_window, window->w, window->h, dx, dy);
261 ecore_wl_window_update_size(wind->window, window->w, window->h);
265 Tizen_SetWindowSize(_THIS, SDL_Window *window)
267 _tizen_setwindowsize(window, 1);
271 Tizen_GetWindowSize(_THIS, SDL_Window *window, int *w, int *h)
273 SDL_WindowData *wind = window->driverdata;
281 if (wind->rotation == 90 || wind->rotation == 270) {
296 Tizen_SetWindowPosition(_THIS, SDL_Window * window)
298 SDL_WindowData *wind = window->driverdata;
303 // TODO : consider to rotation status.
304 ecore_wl_window_position_set(wind->window, window->x, window->y);
308 Tizen_DestroyWindow(_THIS, SDL_Window *window)
310 SDL_VideoData *data = _this->driverdata;
311 SDL_WindowData *wind = window->driverdata;
314 eina_hash_del(data->windows, &wind->id, window);
315 #if SDL_VIDEO_OPENGL_EGL
316 if (window->flags & SDL_WINDOW_OPENGL) {
317 SDL_EGL_DestroySurface(_this, wind->egl_surface);
318 wl_egl_window_destroy(wind->egl_window);
321 ecore_wl_window_free(wind->window);
325 window->driverdata = NULL;
329 Tizen_FindWindow(_THIS, Ecore_Wl_Window *ewin)
331 SDL_VideoData *data = _this->driverdata;
334 id = ecore_wl_window_id_get(ewin);
335 return (SDL_Window*)eina_hash_find(data->windows, &id);
339 _tizen_cb_event_window_visibility_change(void *data, int type, void *event)
342 Ecore_Wl_Event_Window_Visibility_Change *ev;
347 ew = ecore_wl_window_find(ev->win);
348 window = Tizen_FindWindow(_this, ew);
350 SDL_Log( "visibility window: %p, ecore_wl_window: %p\n", window, ew);
352 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SHOWN, 0, 0);
353 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0);
354 return ECORE_CALLBACK_PASS_ON;
358 _tizen_cb_window_configure(void *data, int type EINA_UNUSED, void *event)
363 SDL_WindowData *wind;
364 Ecore_Wl_Event_Window_Configure *ev;
365 int nx = 0, ny = 0, nw = 0, nh = 0;
367 ew = ecore_wl_window_find(ev->win);
368 window = Tizen_FindWindow(_this, ew);
369 wind = window->driverdata;
371 if (wind->rotation_supported == 0){
372 return ECORE_CALLBACK_PASS_ON;
375 SDL_Log( "configure notify window: %p, ecore_wl_window: %p\n", window, ew);
377 ecore_wl_window_geometry_get(ew, &nx, &ny, &nw, &nh);
381 if ((window->x != nx) || (window->y != ny))
382 ecore_wl_window_position_set(ew, nx, ny);
384 if ((window->w != nw) || (window->h != nh)) {
388 _tizen_setwindowsize(window, 0);
390 return ECORE_CALLBACK_PASS_ON;
394 _tizen_cb_event_window_rotate(void *data, int type EINA_UNUSED, void *event)
397 Ecore_Wl_Event_Window_Rotate *ev;
400 SDL_WindowData *wind;
404 return ECORE_CALLBACK_PASS_ON;
407 ew = ecore_wl_window_find(ev->win);
408 window = Tizen_FindWindow(_this, ew);
409 wind = window->driverdata;
411 if (wind->rotation != ev->angle) {
412 /* set ecore_wayland window rotation */
413 wind->rotation = ev->angle;
414 ecore_wl_window_rotation_set(ew, ev->angle);
415 _tizen_setwindowsize(window, 1);
416 if (wind->rotation == 0 || wind->rotation == 180)
417 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->w, window->h);
418 else if (wind->rotation == 90 || wind->rotation == 270)
419 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_SIZE_CHANGED, window->h, window->w);
421 wind->received_rotation = 1;
423 const char* hint = SDL_GetHint(SDL_HINT_ORIENTATIONS);
428 SDL_IndicatorProcessEvent(_this->current_glwin, wind->rotation);
432 return ECORE_CALLBACK_PASS_ON;
436 Tizen_InitWindow(_THIS)
438 SDL_VideoData *data = _this->driverdata;
440 data->windows = eina_hash_int32_new(NULL);
442 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE,
443 _tizen_cb_event_window_visibility_change,_this);
444 ecore_event_handler_add(ECORE_EVENT_KEY_UP,
445 _tizen_cb_event_keyup_change,_this);
446 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
447 _tizen_cb_event_keydown_change,_this);
448 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
449 _tizen_cb_event_mousedown_change,_this);
450 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
451 _tizen_cb_event_mouseup_change,_this);
452 ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
453 _tizen_cb_event_mousemove_change,_this);
454 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_ROTATE,
455 _tizen_cb_event_window_rotate,_this);
456 ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_CONFIGURE,
457 _tizen_cb_window_configure,_this);
458 ecore_event_handler_add(ECORE_EVENT_JOYSTICK,
459 _tizen_cb_event_joystick_change,_this);
460 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_IN,
461 _tizen_cb_event_focus_in,_this);
462 ecore_event_handler_add(ECORE_WL_EVENT_FOCUS_OUT,
463 _tizen_cb_event_focus_out,_this);
464 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_IN,
465 _tizen_cb_event_mouse_in,_this);
466 ecore_event_handler_add(ECORE_WL_EVENT_MOUSE_OUT,
467 _tizen_cb_event_mouse_out,_this);
473 Tizen_DeinitWindow(_THIS)
475 SDL_VideoData *data = _this->driverdata;
477 eina_hash_free(data->windows);
479 #endif /* SDL_VIDEO_DRIVER_TIZEN */
481 /* vi: set ts=4 sw=4 expandtab: */