From 24fd59289e3fe3f0ecb848c8a1119a7a7cc1e879 Mon Sep 17 00:00:00 2001 From: devilhorns Date: Tue, 15 May 2012 12:01:46 +0000 Subject: [PATCH] Ecore_Evas (wayland): Support for setting shell_surface title & class in wayland compositors. Added alpha support for wayland_egl. Support evas output rotation in wayland_egl. Don't move/resize windows in wayland_egl unless sizes actually change. Included patch from Robert Bradford for vertical/horizontal mouse wheel scrolling. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@71108 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/ecore_evas/ecore_evas_wayland_egl.c | 125 +++++++++++++++++++--------- src/lib/ecore_evas/ecore_evas_wayland_shm.c | 27 ++++-- 2 files changed, 105 insertions(+), 47 deletions(-) diff --git a/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/src/lib/ecore_evas/ecore_evas_wayland_egl.c index f4e5010..bc95754 100644 --- a/src/lib/ecore_evas/ecore_evas_wayland_egl.c +++ b/src/lib/ecore_evas/ecore_evas_wayland_egl.c @@ -2,7 +2,7 @@ # include "config.h" #endif -//#define LOGFNS 1 +#define LOGFNS 1 #ifdef LOGFNS # include @@ -240,7 +240,7 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas))) { einfo->info.display = ecore_wl_display_get(); - einfo->info.destination_alpha = EINA_FALSE; + einfo->info.destination_alpha = ee->alpha; einfo->info.rotation = ee->rotation; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { @@ -269,8 +269,8 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in evas_object_move(ee->engine.wl.frame, 0, 0); } - ecore_evas_input_event_register(ee); _ecore_evas_register(ee); + ecore_evas_input_event_register(ee); ecore_event_window_register(ee->prop.window, ee, ee->evas, (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, @@ -278,7 +278,7 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent, int x, in (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process); - evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL); + /* evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL); */ return ee; } @@ -429,10 +429,14 @@ _ecore_evas_wl_move(Ecore_Evas *ee, int x, int y) if (!ee) return; ee->req.x = x; ee->req.y = y; - ee->x = x; - ee->y = y; - if (ee->engine.wl.win) ecore_wl_window_move(ee->engine.wl.win, x, y); - if (ee->func.fn_move) ee->func.fn_move(ee); + if ((ee->x != x) || (ee->y != y)) + { + ee->x = x; + ee->y = y; + if (ee->engine.wl.win) + ecore_wl_window_update_location(ee->engine.wl.win, x, y); + if (ee->func.fn_move) ee->func.fn_move(ee); + } } static void @@ -443,7 +447,6 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) if (!ee) return; if (w < 1) w = 1; if (h < 1) h = 1; -// if ((ee->w == w) && (ee->h == h)) return; if (ee->prop.min.w > w) w = ee->prop.min.w; else if (w > ee->prop.max.w) w = ee->prop.max.w; @@ -455,25 +458,47 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) // ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); - ee->w = w; - ee->h = h; + if ((ee->w != w) || (ee->h != h)) + { + ee->w = w; + ee->h = h; - /* change evas output & viewport sizes */ - evas_output_size_set(ee->evas, ee->w, ee->h); - evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); - evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); - if (ee->engine.wl.frame) - evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); + if ((ee->rotation == 90) || (ee->rotation == 270)) + { + evas_output_size_set(ee->evas, h, w); + evas_output_viewport_set(ee->evas, 0, 0, h, w); + } + else + { + evas_output_size_set(ee->evas, w, h); + evas_output_viewport_set(ee->evas, 0, 0, w, h); + } + + if (ee->prop.avoid_damage) + { + int pdam = 0; + + pdam = ecore_evas_avoid_damage_get(ee); + ecore_evas_avoid_damage_set(ee, 0); + ecore_evas_avoid_damage_set(ee, pdam); + } - /* set new engine destination */ - /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */ + if (ee->engine.wl.frame) + evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); - /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */ - ecore_wl_flush(); + /* set new engine destination */ + /* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */ - ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h); + /* ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); */ - if (ee->func.fn_resize) ee->func.fn_resize(ee); + // WAS ACTIVE + /* ecore_wl_flush(); */ + + if (ee->engine.wl.win) + ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h); + + if (ee->func.fn_resize) ee->func.fn_resize(ee); + } } static void @@ -488,25 +513,39 @@ _ecore_evas_wl_show(Ecore_Evas *ee) if (ee->engine.wl.win) { ecore_wl_window_show(ee->engine.wl.win); - ecore_wl_flush(); - } - - einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas); - if (!einfo) - { - ERR("Failed to get Evas Engine Info for '%s'", ee->driver); - return; + ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h); + /* ecore_wl_sync(); */ + + if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, + ee->prop.clas); + if ((ee->prop.title) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, + ee->prop.title); } - einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win); - evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); - if (ee->engine.wl.frame) { evas_object_show(ee->engine.wl.frame); evas_object_resize(ee->engine.wl.frame, ee->w, ee->h); } + if (ee->engine.wl.win) + { + einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas); + if (!einfo) + { + ERR("Failed to get Evas Engine Info for '%s'", ee->driver); + return; + } + + einfo->info.surface = ecore_wl_window_surface_get(ee->engine.wl.win); + /* if (einfo->info.surface) */ + evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); + /* else */ + /* printf("Failed to get a Surface from Ecore_Wl\n"); */ + } + /* ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); */ ee->visible = 1; @@ -522,12 +561,6 @@ _ecore_evas_wl_hide(Ecore_Evas *ee) if ((!ee) || (!ee->visible)) return; - if (ee->engine.wl.win) - { - ecore_wl_window_hide(ee->engine.wl.win); - ecore_wl_flush(); - } - einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas); if (einfo) { @@ -535,6 +568,9 @@ _ecore_evas_wl_hide(Ecore_Evas *ee) evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); } + if (ee->engine.wl.win) + ecore_wl_window_hide(ee->engine.wl.win); + ee->visible = 0; ee->should_be_visible = 0; @@ -566,6 +602,10 @@ _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title) if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return; evas_object_text_text_set(sd->text, ee->prop.title); } + + if ((ee->prop.title) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, + ee->prop.title); } static void @@ -580,7 +620,10 @@ _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c) ee->prop.clas = NULL; if (n) ee->prop.name = strdup(n); if (c) ee->prop.clas = strdup(c); - /* FIXME: Forward these changes to Wayland somehow */ + + if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, + ee->prop.clas); } static void diff --git a/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/src/lib/ecore_evas/ecore_evas_wayland_shm.c index a0167be..9f43ff5 100644 --- a/src/lib/ecore_evas/ecore_evas_wayland_shm.c +++ b/src/lib/ecore_evas/ecore_evas_wayland_shm.c @@ -630,6 +630,13 @@ _ecore_evas_wl_show(Ecore_Evas *ee) ecore_wl_window_buffer_attach(ee->engine.wl.win, ee->engine.wl.buffer, 0, 0); ecore_wl_window_update_size(ee->engine.wl.win, ee->w, ee->h); + + if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, + ee->prop.clas); + if ((ee->prop.title) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, + ee->prop.title); } if (ee->engine.wl.frame) @@ -696,6 +703,10 @@ _ecore_evas_wl_title_set(Ecore_Evas *ee, const char *title) if (!(sd = evas_object_smart_data_get(ee->engine.wl.frame))) return; evas_object_text_text_set(sd->text, ee->prop.title); } + + if ((ee->prop.title) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_title(ee->engine.wl.win->shell_surface, + ee->prop.title); } static void @@ -710,7 +721,10 @@ _ecore_evas_wl_name_class_set(Ecore_Evas *ee, const char *n, const char *c) ee->prop.clas = NULL; if (n) ee->prop.name = strdup(n); if (c) ee->prop.clas = strdup(c); - /* FIXME: Forward these changes to Wayland somehow */ + + if ((ee->prop.clas) && (ee->engine.wl.win->shell_surface)) + wl_shell_surface_set_class(ee->engine.wl.win->shell_surface, + ee->prop.clas); } static void @@ -887,14 +901,15 @@ _ecore_evas_wl_render(Ecore_Evas *ee) if ((updates = evas_render_updates(ee->evas))) { - Eina_List *l = NULL; - Eina_Rectangle *r; + /* Eina_List *l = NULL; */ + /* Eina_Rectangle *r; */ LOGFN(__FILE__, __LINE__, __FUNCTION__); - EINA_LIST_FOREACH(updates, l, r) - ecore_wl_window_damage(ee->engine.wl.win, - r->x, r->y, r->w, r->h); + ecore_wl_window_damage(ee->engine.wl.win, 0, 0, ee->w, ee->h); + /* EINA_LIST_FOREACH(updates, l, r) */ + /* ecore_wl_window_damage(ee->engine.wl.win, */ + /* r->x, r->y, r->w, r->h); */ ecore_wl_flush(); -- 2.7.4