Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=frugalware-current.git;a=commitdiff;h=44db7148945c874e33fead9e923375b3496f7dc5
commit 44db7148945c874e33fead9e923375b3496f7dc5 Author: crazy <cr...@frugalware.org> Date: Tue Aug 8 17:46:19 2017 +0200 enlightenment-0.21.8-2-x86_64 * rebuild with efl * added an huge backport patch to make it work diff --git a/source/enlightenment-extra/enlightenment/FrugalBuild b/source/enlightenment-extra/enlightenment/FrugalBuild index d668f6f..2ff0b23 100644 --- a/source/enlightenment-extra/enlightenment/FrugalBuild +++ b/source/enlightenment-extra/enlightenment/FrugalBuild @@ -3,11 +3,11 @@ pkgname=enlightenment pkgver=0.21.8 -pkgrel=1 +pkgrel=2 pkgdesc="Enlightenment Foundation Window Manager" url="https://www.enlightenment.org/" _F_archive_grepv="alpha\|beta\|rc" -source=(https://download.enlightenment.org/rel/apps/$pkgname/$pkgname-$pkgver.tar.xz) +source=(https://download.enlightenment.org/rel/apps/$pkgname/$pkgname-$pkgver.tar.xz branch.patch) up2date="Flasttar https://download.enlightenment.org/rel/apps/$pkgname/" groups=('enlightenment-extra' 'e-apps') archs=('x86_64') @@ -19,7 +19,8 @@ depends=('efl>=1.19.1' 'glibc' 'libsystemd' 'libunwind' 'harfbuzz' 'fribidi' 'fo 'libdrm' 'util-linux' 'libsndfile' 'bullet' 'libxcb' 'libasyncns' 'libffi' 'mtdev' 'libevdev' 'libblkid' 'flac' 'libogg' 'libvorbis' \ 'libxau' 'libxdmcp' 'libuuid' 'pam' 'xcb-util-keysyms' 'bluez') makedepends=('x11-protos' 'xorg-server-xwayland') -sha1sums=('ecf1f64d838fd885ffde19626437cf1bfa8235eb') +sha1sums=('ecf1f64d838fd885ffde19626437cf1bfa8235eb' \ + '0f268107c3249d1079bc39840bcabb0213ef86fd') Fconfopts+=" --enable-wayland \ --enable-wayland-egl \ --enable-xwayland \ diff --git a/source/enlightenment-extra/enlightenment/branch.patch b/source/enlightenment-extra/enlightenment/branch.patch new file mode 100644 index 0000000..634908f --- /dev/null +++ b/source/enlightenment-extra/enlightenment/branch.patch @@ -0,0 +1,2141 @@ +diff --git a/src/bin/e_bryce.c b/src/bin/e_bryce.c +index 2042e7ad6..00af04e3d 100644 +--- a/src/bin/e_bryce.c ++++ b/src/bin/e_bryce.c +@@ -208,6 +208,7 @@ _bryce_autosize(Bryce *b) + if (b->size_changed) + elm_object_content_unset(b->scroller); + _bryce_position(b, w, h, &x, &y); ++ evas_object_move(b->bryce, x, y); + if (b->orient == E_GADGET_SITE_ORIENT_HORIZONTAL) + e_efx_resize(b->bryce, E_EFX_EFFECT_SPEED_LINEAR, E_EFX_POINT(x, y), w, b->size * e_scale, 0.1, NULL, NULL); + else if (b->orient == E_GADGET_SITE_ORIENT_VERTICAL) +@@ -261,6 +262,7 @@ _bryce_autosize(Bryce *b) + w = MIN(MAX(lw + sw, b->size * e_scale), maxw), h = b->size * e_scale; + else if (b->orient == E_GADGET_SITE_ORIENT_VERTICAL) + w = b->size * e_scale, h = MIN(MAX(lh + sh, b->size * e_scale), maxh); ++ evas_object_move(b->bryce, x, y); + e_efx_resize(b->bryce, E_EFX_EFFECT_SPEED_LINEAR, E_EFX_POINT(x, y), w, h, 0.1, NULL, NULL); + b->size_changed = 0; + } +diff --git a/src/bin/e_client.c b/src/bin/e_client.c +index b4d2c2576..5fdccebf3 100644 +--- a/src/bin/e_client.c ++++ b/src/bin/e_client.c +@@ -445,8 +445,11 @@ _e_client_free(E_Client *ec) + ec->pixmap = NULL; + } + +- e_comp_object_redirected_set(ec->frame, 0); +- e_comp_object_render_update_del(ec->frame); ++ if (ec->frame) ++ { ++ e_comp_object_redirected_set(ec->frame, 0); ++ e_comp_object_render_update_del(ec->frame); ++ } + + E_OBJECT(ec)->references++; + if (ec->fullscreen) +@@ -778,6 +781,12 @@ _e_client_move_begin(E_Client *ec) + if (!_e_client_action_input_win_new()) return 0; + ec->moving = 1; + ecmove = ec; ++ if (!ec->lock_user_stacking) ++ { ++ if (e_config->border_raise_on_mouse_action) ++ evas_object_raise(ec->frame); ++ } ++ + _e_client_hook_call(E_CLIENT_HOOK_MOVE_BEGIN, ec); + if (!ec->moving) + { +@@ -785,11 +794,7 @@ _e_client_move_begin(E_Client *ec) + _e_client_action_input_win_del(); + return 0; + } +- if (!ec->lock_user_stacking) +- { +- if (e_config->border_raise_on_mouse_action) +- evas_object_raise(ec->frame); +- } ++ E_FREE_FUNC(ec->raise_timer, ecore_timer_del); + return 1; + } + +@@ -916,6 +921,7 @@ _e_client_resize_handle(E_Client *ec) + int tw, th; + Eina_List *skiplist = NULL; + ++ if (e_comp->updating) return; + x = ec->x; + y = ec->y; + w = ec->w; +@@ -1415,7 +1421,7 @@ _e_client_cb_evas_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN + + _e_client_event_simple(ec, E_EVENT_CLIENT_MOVE); + +- _e_client_zone_update(ec); ++ if (!e_client_util_ignored_get(ec)) _e_client_zone_update(ec); + evas_object_geometry_get(ec->frame, &x, &y, NULL, NULL); + if ((e_config->transient.move) && (ec->transients)) + { +@@ -1447,7 +1453,7 @@ _e_client_cb_evas_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ + + _e_client_event_simple(ec, E_EVENT_CLIENT_RESIZE); + +- _e_client_zone_update(ec); ++ if (!e_client_util_ignored_get(ec)) _e_client_zone_update(ec); + evas_object_geometry_get(ec->frame, &x, &y, &w, &h); + if ((e_config->transient.resize) && (ec->transients)) + { +@@ -2804,6 +2810,7 @@ e_client_mouse_move(E_Client *ec, Evas_Point *output) + { + EINA_SAFETY_ON_NULL_RETURN(ec); + if (ec->iconic || e_client_util_ignored_get(ec)) return; ++ if ((ec->mouse.current.mx == output->x) && (ec->mouse.current.my == output->y)) return; + ec->mouse.current.mx = output->x; + ec->mouse.current.my = output->y; + if (ec->moving) +@@ -3969,9 +3976,11 @@ e_client_unmaximize(E_Client *ec, E_Maximize max) + vert = EINA_TRUE; + if ((unmax & E_MAXIMIZE_VERTICAL) == E_MAXIMIZE_VERTICAL) + { ++ if ((ec->maximized & E_MAXIMIZE_LEFT) == E_MAXIMIZE_LEFT) ++ ec->maximized &= ~E_MAXIMIZE_LEFT; ++ if ((ec->maximized & E_MAXIMIZE_RIGHT) == E_MAXIMIZE_RIGHT) ++ ec->maximized &= ~E_MAXIMIZE_RIGHT; + ec->maximized &= ~E_MAXIMIZE_VERTICAL; +- ec->maximized &= ~E_MAXIMIZE_LEFT; +- ec->maximized &= ~E_MAXIMIZE_RIGHT; + } + if ((unmax & E_MAXIMIZE_LEFT) == E_MAXIMIZE_LEFT) + ec->maximized &= ~E_MAXIMIZE_LEFT; +@@ -4776,6 +4785,11 @@ e_client_resize_begin(E_Client *ec) + (ec->fullscreen) || (ec->lock_user_size)) + goto error; + if (!_e_client_action_input_win_new()) goto error; ++ if (!ec->lock_user_stacking) ++ { ++ if (e_config->border_raise_on_mouse_action) ++ evas_object_raise(ec->frame); ++ } + ecresize = ec; + _e_client_hook_call(E_CLIENT_HOOK_RESIZE_BEGIN, ec); + if (!e_client_util_resizing_get(ec)) +@@ -4784,11 +4798,7 @@ e_client_resize_begin(E_Client *ec) + _e_client_action_input_win_del(); + return EINA_FALSE; + } +- if (!ec->lock_user_stacking) +- { +- if (e_config->border_raise_on_mouse_action) +- evas_object_raise(ec->frame); +- } ++ E_FREE_FUNC(ec->raise_timer, ecore_timer_del); + return EINA_TRUE; + error: + ec->resize_mode = E_POINTER_RESIZE_NONE; +diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c +index a94858f1a..85dd68782 100644 +--- a/src/bin/e_comp.c ++++ b/src/bin/e_comp.c +@@ -311,16 +311,19 @@ _e_comp_client_update(E_Client *ec) + { + e_pixmap_image_clear(ec->pixmap, 0); + e_comp_object_render_update_del(ec->frame); //clear update ++ if (ec->changes.visible && (!evas_object_visible_get(ec->frame))) ++ evas_object_show(ec->frame); + } + else if (!e_pixmap_size_get(ec->pixmap, NULL, NULL)) + { + WRN("FAIL %p", ec); + e_comp_object_redirected_set(ec->frame, 0); +- if (e_pixmap_failures_get(ec->pixmap) < 3) ++ if (e_pixmap_failures_get(ec->pixmap) > 3) + e_comp_object_render_update_add(ec->frame); + } + } +- if ((!e_comp->saver) && e_pixmap_size_get(ec->pixmap, &pw, &ph)) ++ if (!(e_comp->saver && ecore_evas_manual_render_get(e_comp->ee)) && ++ e_pixmap_size_get(ec->pixmap, &pw, &ph)) + { + //INF("PX DIRTY: PX(%dx%d) CLI(%dx%d)", pw, ph, ec->client.w, ec->client.h); + e_pixmap_image_refresh(ec->pixmap); +@@ -375,6 +378,7 @@ _e_comp_cb_update(void) + if (e_comp->grab_cb) e_comp->grab_cb(); + e_comp->grabbed = 1; + } ++ e_comp->updating = 1; + l = e_comp->updates; + e_comp->updates = NULL; + EINA_LIST_FREE(l, ec) +@@ -383,6 +387,7 @@ _e_comp_cb_update(void) + e_comp_object_render_update_del(ec->frame); + _e_comp_client_update(ec); + } ++ e_comp->updating = 0; + _e_comp_fps_update(); + if (conf->fps_show) + { +@@ -549,7 +554,7 @@ _e_comp_shape_debug_rect(Eina_Rectangle *rect, E_Color *color) + evas_object_color_set(o, 0, (color->g += COLOR_INCREMENT), 0, 255); + else + evas_object_color_set(o, 0, 0, (color->b += COLOR_INCREMENT), 255); +- evas_object_repeat_events_set(o, 1); ++ evas_object_pass_events_set(o, 1); + evas_object_layer_set(o, E_LAYER_MENU - 1); + evas_object_move(o, rect->x, rect->y); + evas_object_resize(o, rect->w, rect->h); +@@ -1007,7 +1012,6 @@ EINTERN Eina_Bool + e_comp_init(void) + { + _e_comp_log_dom = eina_log_domain_register("e_comp", EINA_COLOR_YELLOW); +- eina_log_domain_level_set("e_comp", EINA_LOG_LEVEL_INFO); + + ecore_frametime = ecore_animator_frametime_get(); + shape_debug = !!getenv("E_SHAPE_DEBUG"); +diff --git a/src/bin/e_comp.h b/src/bin/e_comp.h +index 04865820c..6859a9cd2 100644 +--- a/src/bin/e_comp.h ++++ b/src/bin/e_comp.h +@@ -161,6 +161,7 @@ struct _E_Comp + Eina_Bool shape_queue_blocked : 1; //x11 input shape updates are blocked + + Eina_Bool rendering : 1; // we've received a pre-render callback but no post-render yet. ++ Eina_Bool updating : 1; // running client updates + }; + + +diff --git a/src/bin/e_comp_canvas.c b/src/bin/e_comp_canvas.c +index 0289b4295..9bdd57f71 100644 +--- a/src/bin/e_comp_canvas.c ++++ b/src/bin/e_comp_canvas.c +@@ -244,6 +244,7 @@ _e_comp_cb_screensaver_on() + (e_config->desklock_post_screensaver_time, + _e_comp_cb_timer_post_screensaver_lock, NULL); + } ++ e_pointers_freeze_set(1); + return ECORE_CALLBACK_PASS_ON; + } + +@@ -252,6 +253,7 @@ _e_comp_cb_screensaver_off() + { + E_FREE_FUNC(timer_post_screensaver_lock, ecore_timer_del); + E_FREE_FUNC(timer_post_screensaver_on, ecore_timer_del); ++ e_pointers_freeze_set(0); + return ECORE_CALLBACK_PASS_ON; + } + //////////////////////////////////// +@@ -634,6 +636,7 @@ e_comp_canvas_update(void) + } + e_comp_canvas_zone_update(zone); + } ++ evas_object_resize(e_comp->bg_blank_object, e_comp->w, e_comp->h); + } + + E_API void +diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c +index df2a87839..299943772 100644 +--- a/src/bin/e_comp_object.c ++++ b/src/bin/e_comp_object.c +@@ -48,8 +48,8 @@ + /* enable along with display-specific damage INF calls to enable render tracing + * SLOW! + */ +-static Eina_Bool render_debug_enabled; +-#define RENDER_DEBUG(...) do { if (render_debug_enabled) INF(__VA_ARGS__); } while (0) ++static int render_debug_enabled; ++#define RENDER_DEBUG(...) do { if ((render_debug_enabled == 1) || ((render_debug_enabled == -1) && cw->ec->focused)) INF(__VA_ARGS__); } while (0) + + typedef struct _E_Comp_Object + { +@@ -925,6 +925,19 @@ _e_comp_object_mirror_pixels_get(void *data, Evas_Object *obj) + return; + } + ++ /* This is a big fat hack - ideally we're already on this list ++ * if the parent is visible, but there are some circumstances ++ * where a client receives damage while visible but its own pixels_get ++ * callback doesn't fire (new damage during the start frame of a desk ++ * switch animation). ++ * Thus we can't make this addition conditional on visibility or we can ++ * (under wayland at least) lose a frame callback and stop updating. ++ * ++ * e_comp_client_post_update_add() prevents clients from being ++ * on the list twice, so this is theoretically not harmful. ++ */ ++ e_comp_client_post_update_add(ec); ++ + if (cw->native) return; + + evas_object_image_data_set(obj, e_pixmap_image_data_get(cw->ec->pixmap)); +@@ -1133,6 +1146,8 @@ _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h) + E_Comp_Object *cw = data; + int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y; + ++ ++ if ((w < 1) || (h < 1)) return; + /* if frame_object does not exist, client_inset indicates CSD. + * this means that ec->client matches cw->w/h, the opposite + * of SSD. +@@ -1232,13 +1247,23 @@ _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h) + { + /* client can't be resized if its pixmap isn't usable, try again */ + e_pixmap_dirty(cw->ec->pixmap); +- e_comp_object_render_update_add(obj); +- e_comp_render_queue(); ++ if (e_comp->nocomp) ++ e_pixmap_refresh(cw->ec->pixmap); ++ else ++ { ++ e_comp_object_render_update_add(obj); ++ e_comp_render_queue(); ++ } + } + cw->ec->changes.size = 1; + EC_CHANGED(cw->ec); + return; + } ++ if (e_pixmap_failures_get(cw->ec->pixmap) && (!cw->redirected)) ++ { ++ e_comp_object_redirected_set(obj, 1); ++ return; ++ } + prev_w = cw->w, prev_h = cw->h; + e_comp_object_frame_wh_adjust(obj, 0, 0, &fw, &fh); + /* check shading and clamp to pixmap size for regular clients */ +@@ -1307,7 +1332,6 @@ _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h) + e_win_centered_get(cw->ec->internal_elm_win)) + { + e_comp_object_util_center(obj); +- elm_win_center(cw->ec->internal_elm_win, 0, 0); + } + cw->force_move = 0; + } +@@ -1692,9 +1716,6 @@ _e_comp_intercept_show_helper(E_Comp_Object *cw) + evas_object_show(cw->smart_obj); + return; + } +- /* re-set geometry */ +- if (cw->ec->placed) +- evas_object_move(cw->smart_obj, cw->ec->x, cw->ec->y); + /* ensure that some kind of frame calc has occurred if there's a frame */ + if (e_pixmap_is_x(cw->ec->pixmap) && cw->frame_object && + (cw->ec->h == cw->ec->client.h) && (cw->ec->w == cw->ec->client.w)) +@@ -1708,6 +1729,10 @@ _e_comp_intercept_show_helper(E_Comp_Object *cw) + EC_CHANGED(cw->ec); + return; + } ++ /* re-set geometry */ ++ if (cw->ec->placed) ++ evas_object_move(cw->smart_obj, cw->ec->x, cw->ec->y); ++ + /* if pixmap not available, clear pixmap since we're going to fetch it again */ + if (!e_pixmap_size_get(cw->ec->pixmap, &w, &h)) + e_pixmap_clear(cw->ec->pixmap); +@@ -2309,9 +2334,7 @@ _e_comp_smart_hide(Evas_Object *obj) + { + INTERNAL_ENTRY; + cw->visible = 0; +- cw->deleted = e_object_is_del(E_OBJECT(cw->ec)); +- if (cw->deleted) +- _e_comp_object_layers_remove(cw); ++ cw->deleted |= cw->ec->delete_requested || e_object_is_del(E_OBJECT(cw->ec)); + evas_object_hide(cw->clip); + if (cw->input_obj) evas_object_hide(cw->input_obj); + evas_object_hide(cw->effect_obj); +@@ -2386,6 +2409,15 @@ _e_comp_smart_show(Evas_Object *obj) + } + } + ++static void ++_e_comp_object_client_del(void *d, void *obj EINA_UNUSED) ++{ ++ E_Comp_Object *cw = d; ++ cw->deleted = 1; ++ e_comp_object_render_update_del(cw->smart_obj); ++ _e_comp_object_layers_remove(cw); ++} ++ + static void + _e_comp_smart_del(Evas_Object *obj) + { +@@ -2394,8 +2426,6 @@ _e_comp_smart_del(Evas_Object *obj) + + INTERNAL_ENTRY; + +- if (!cw->deleted) +- e_comp_object_render_update_del(cw->smart_obj); + E_FREE_FUNC(cw->updates, eina_tiler_free); + E_FREE_FUNC(cw->pending_updates, eina_tiler_free); + free(cw->ns); +@@ -2549,9 +2579,14 @@ _e_comp_smart_resize(Evas_Object *obj, int w, int h) + static void + _e_comp_smart_init(void) + { ++ const char *env; + if (_e_comp_smart) return; + +- render_debug_enabled = !!getenv("E_RENDER_DEBUG"); ++ env = getenv("E_RENDER_DEBUG"); ++ if (eina_streq(env, "focus")) ++ render_debug_enabled = -1; ++ else if (env) ++ render_debug_enabled = 1; + { + static const Evas_Smart_Class sc = + { +@@ -2951,6 +2986,7 @@ e_comp_object_client_add(E_Client *ec) + cw->ec = ec; + ec->frame = o; + evas_object_data_set(o, "comp_object", (void*)1); ++ e_object_delfn_add(E_OBJECT(ec), _e_comp_object_client_del, cw); + + _e_comp_object_event_add(o); + +@@ -3252,7 +3288,8 @@ E_API Eina_Bool + e_comp_object_frame_allowed(Evas_Object *obj) + { + API_ENTRY EINA_FALSE; +- return (!cw->ec->mwm.borderless) && (cw->frame_object || (!cw->client_inset.calc)); ++ return (!e_client_util_ignored_get(cw->ec)) && (!cw->ec->mwm.borderless) && ++ (cw->frame_object || (!cw->client_inset.calc)); + } + + E_API void +@@ -3580,7 +3617,7 @@ E_API Eina_Bool + e_comp_object_damage_exists(Evas_Object *obj) + { + API_ENTRY EINA_FALSE; +- return cw->updates_exist; ++ return cw->updates_exist || cw->updates_full; + } + + E_API void +@@ -3880,17 +3917,32 @@ e_comp_object_dirty(Evas_Object *obj) + return; + } + e_comp_object_native_surface_set(obj, 1); +- it = eina_tiler_iterator_new(cw->updates); +- EINA_ITERATOR_FOREACH(it, rect) ++ if (cw->updates_full) + { +- RENDER_DEBUG("UPDATE ADD [%p]: %d %d %dx%d", cw->ec, rect->x, rect->y, rect->w, rect->h); +- evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h); ++ Eina_Rectangle r = {0}; ++ ++ eina_tiler_area_size_get(cw->updates, &r.w, &r.h); ++ RENDER_DEBUG("UPDATE ADD [%p]: %d %d %dx%d", cw->ec, r.x, r.y, r.w, r.h); ++ evas_object_image_data_update_add(cw->obj, r.x, r.y, r.w, r.h); + EINA_LIST_FOREACH(cw->obj_mirror, ll, o) +- evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h); ++ evas_object_image_data_update_add(o, r.x, r.y, r.w, r.h); + if (cw->pending_updates) +- eina_tiler_rect_add(cw->pending_updates, rect); ++ eina_tiler_rect_add(cw->pending_updates, &r); ++ } ++ else ++ { ++ it = eina_tiler_iterator_new(cw->updates); ++ EINA_ITERATOR_FOREACH(it, rect) ++ { ++ RENDER_DEBUG("UPDATE ADD [%p]: %d %d %dx%d", cw->ec, rect->x, rect->y, rect->w, rect->h); ++ evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h); ++ EINA_LIST_FOREACH(cw->obj_mirror, ll, o) ++ evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h); ++ if (cw->pending_updates) ++ eina_tiler_rect_add(cw->pending_updates, rect); ++ } ++ eina_iterator_free(it); + } +- eina_iterator_free(it); + if (cw->pending_updates) + eina_tiler_clear(cw->updates); + else +diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c +index 8d6cc9463..e82884769 100644 +--- a/src/bin/e_comp_wl.c ++++ b/src/bin/e_comp_wl.c +@@ -439,9 +439,9 @@ _e_comp_wl_evas_cb_mouse_wheel(void *data, Evas *evas EINA_UNUSED, Evas_Object * + axis = WL_POINTER_AXIS_HORIZONTAL_SCROLL; + + if (ev->z < 0) +- dir = -wl_fixed_from_int(abs(ev->z)); ++ dir = -wl_fixed_from_int(abs(10 * ev->z)); + else +- dir = wl_fixed_from_int(ev->z); ++ dir = wl_fixed_from_int(10 * ev->z); + + if (!ec->comp_data->surface) return; + +@@ -941,7 +941,7 @@ _e_comp_wl_evas_cb_delete_request(void *data, Evas_Object *obj EINA_UNUSED, void + if (!e_client_has_xwindow(ec)) + { + if (ec->internal_elm_win) +- E_FREE_FUNC(ec->internal_elm_win, evas_object_del); ++ evas_object_del(ec->internal_elm_win); + else + e_object_del(E_OBJECT(ec)); + } +@@ -1101,12 +1101,23 @@ _e_comp_wl_client_evas_init(E_Client *ec) + static Eina_Bool + _e_comp_wl_cb_randr_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) + { +- Eina_List *l; ++ const Eina_List *l; + E_Randr2_Screen *screen; + unsigned int transform = WL_OUTPUT_TRANSFORM_NORMAL; + + if (!e_randr2) return ECORE_CALLBACK_RENEW; + ++ if (e_xinerama_fake_screens_exist()) ++ { ++ E_Screen *scr; ++ EINA_LIST_FOREACH(e_xinerama_screens_get(), l, scr) ++ { ++ e_comp_wl_output_init(NULL, NULL, NULL, ++ scr->x, scr->y, scr->w, scr->h, ++ 0, 0, 0, 0, 0, scr->escreen); ++ } ++ return ECORE_CALLBACK_RENEW; ++ } + EINA_LIST_FOREACH(e_randr2->screens, l, screen) + { + if (!screen->config.enabled) +@@ -1137,7 +1148,7 @@ _e_comp_wl_cb_randr_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *e + screen->config.geom.x, screen->config.geom.y, + screen->config.geom.w, screen->config.geom.h, + screen->info.size.w, screen->info.size.h, +- screen->config.mode.refresh, 0, transform)) ++ screen->config.mode.refresh, 0, transform, 0)) + ERR("Could not initialize screen %s", screen->info.name); + } + +@@ -1171,8 +1182,8 @@ _e_comp_wl_cb_mouse_move(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mou + { + _last_event_time = ecore_loop_time_get(); + +- e_comp_wl->ptr.x = wl_fixed_from_int(ev->x); +- e_comp_wl->ptr.y = wl_fixed_from_int(ev->y); ++ e_comp_wl->ptr.x = ev->x; ++ e_comp_wl->ptr.y = ev->y; + e_screensaver_notidle(); + if (e_comp_wl->selection.target && + (!e_client_has_xwindow(e_comp_wl->selection.target)) && +@@ -2442,6 +2453,7 @@ _e_comp_wl_client_cb_del(void *data EINA_UNUSED, E_Client *ec) + ec->parent->lock_close = EINA_FALSE; + ec->parent->modal = NULL; + } ++ if (e_comp_wl->selection.target == ec) e_comp_wl->selection.target = NULL; + + if ((ec == e_client_focused_get()) && ec->visible) _e_comp_wl_keyboard_leave(ec); + +@@ -2525,11 +2537,17 @@ _e_comp_wl_client_cb_focus_unset(void *data EINA_UNUSED, E_Client *ec) + e_comp_wl->kbd.focus = NULL; + } + ++static void ++_e_comp_wl_client_cb_move_begin(void *data EINA_UNUSED, E_Client *ec EINA_UNUSED) ++{ ++ e_comp_wl->ptr.button_mask = 0; ++} ++ + static void + _e_comp_wl_client_cb_resize_begin(void *data EINA_UNUSED, E_Client *ec) + { ++ e_comp_wl->ptr.button_mask = 0; + if (e_client_has_xwindow(ec)) return; +- + e_comp_wl->resize.edges = 0; + if (ec->keyboard_resizing) return; + switch (ec->resize_mode) +@@ -2862,6 +2880,8 @@ e_comp_wl_init(void) + e_client_hook_add(E_CLIENT_HOOK_FOCUS_UNSET, + _e_comp_wl_client_cb_focus_unset, NULL); + ++ e_client_hook_add(E_CLIENT_HOOK_MOVE_BEGIN, ++ _e_comp_wl_client_cb_move_begin, NULL); + e_client_hook_add(E_CLIENT_HOOK_RESIZE_BEGIN, + _e_comp_wl_client_cb_resize_begin, NULL); + e_client_hook_add(E_CLIENT_HOOK_RESIZE_END, +@@ -3092,7 +3112,7 @@ E_API Eina_Bool + e_comp_wl_output_init(const char *id, const char *make, const char *model, + int x, int y, int w, int h, int pw, int ph, + unsigned int refresh, unsigned int subpixel, +- unsigned int transform) ++ unsigned int transform, unsigned int num) + { + E_Comp_Wl_Output *output; + Eina_List *l2; +@@ -3103,7 +3123,10 @@ e_comp_wl_output_init(const char *id, const char *make, const char *model, + output = _e_comp_wl_output_get(e_comp_wl->outputs, id); + if (!output) + { +- zone = e_zone_for_id_get(id); ++ if (e_xinerama_fake_screens_exist()) ++ zone = e_comp_zone_number_get(num); ++ else ++ zone = e_zone_for_id_get(id); + if (!zone) return EINA_FALSE; + if (!(output = E_NEW(E_Comp_Wl_Output, 1))) return EINA_FALSE; + +diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h +index 52165d684..b81b4f3c7 100644 +--- a/src/bin/e_comp_wl.h ++++ b/src/bin/e_comp_wl.h +@@ -220,7 +220,7 @@ struct _E_Comp_Wl_Data + { + void *source; + struct wl_listener listener; +- E_Client *xwl_owner; ++ Ecore_Window xwl_owner; + } clipboard; + + struct +@@ -359,7 +359,7 @@ E_API E_Comp_Wl_Buffer *e_comp_wl_buffer_get(struct wl_resource *resource); + + E_API struct wl_signal e_comp_wl_surface_create_signal_get(void); + E_API double e_comp_wl_idle_time_get(void); +-E_API Eina_Bool e_comp_wl_output_init(const char *id, const char *make, const char *model, int x, int y, int w, int h, int pw, int ph, unsigned int refresh, unsigned int subpixel, unsigned int transform); ++E_API Eina_Bool e_comp_wl_output_init(const char *id, const char *make, const char *model, int x, int y, int w, int h, int pw, int ph, unsigned int refresh, unsigned int subpixel, unsigned int transform, unsigned int num); + E_API void e_comp_wl_output_remove(const char *id); + + EINTERN Eina_Bool e_comp_wl_key_down(Ecore_Event_Key *ev); +diff --git a/src/bin/e_comp_wl_data.c b/src/bin/e_comp_wl_data.c +index fb160f7ad..48cab4ab1 100644 +--- a/src/bin/e_comp_wl_data.c ++++ b/src/bin/e_comp_wl_data.c +@@ -501,7 +501,7 @@ _e_comp_wl_data_device_selection_set(void *data EINA_UNUSED, E_Comp_Wl_Data_Sour + } + + e_comp_wl->selection.data_source = sel_source = source; +- e_comp_wl->clipboard.xwl_owner = NULL; ++ e_comp_wl->clipboard.xwl_owner = 0; + source->serial = e_comp_wl->selection.serial = serial; + + if (e_comp_wl->kbd.enabled) +@@ -765,16 +765,19 @@ static void + _e_comp_wl_data_cb_bind_manager(struct wl_client *client, void *data EINA_UNUSED, uint32_t version EINA_UNUSED, uint32_t id) + { + struct wl_resource *res; ++ pid_t pid; + + /* try to create data manager resource */ +- e_comp_wl->mgr.resource = res = +- wl_resource_create(client, &wl_data_device_manager_interface, 3, id); ++ res = wl_resource_create(client, &wl_data_device_manager_interface, 3, id); + if (!res) + { + ERR("Could not create data device manager"); + wl_client_post_no_memory(client); + return; + } ++ wl_client_get_credentials(client, &pid, NULL, NULL); ++ if (pid == getpid()) ++ e_comp_wl->mgr.resource = res; + + wl_resource_set_implementation(res, &_e_manager_interface, + e_comp->wl_comp_data, NULL); +@@ -940,15 +943,6 @@ _e_comp_wl_clipboard_create(void) + wl_signal_add(&e_comp_wl->selection.signal, &e_comp_wl->clipboard.listener); + } + +-static void +-_e_comp_wl_data_device_target_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +-{ +- E_Client *ec = data; +- +- if (e_comp_wl->selection.target == ec) +- e_comp_wl->selection.target = NULL; +-} +- + E_API void + e_comp_wl_data_device_send_enter(E_Client *ec) + { +@@ -968,6 +962,11 @@ e_comp_wl_data_device_send_enter(E_Client *ec) + if (!data_device_res) return; + offer_res = e_comp_wl_data_device_send_offer(ec); + if (e_comp_wl->drag_source && (!offer_res)) return; ++ if (e_client_has_xwindow(e_comp_wl->drag_client)) ++ { ++ drag_source->offer->dnd_actions = drag_source->dnd_actions; ++ drag_source->offer->preferred_dnd_action = drag_source->current_dnd_action; ++ } + data_offer_update_action(drag_source->offer); + if (offer_res) + { +@@ -976,8 +975,6 @@ e_comp_wl_data_device_send_enter(E_Client *ec) + } + } + e_comp_wl->selection.target = ec; +- evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_DEL, +- _e_comp_wl_data_device_target_del, ec); + + #ifndef HAVE_WAYLAND_ONLY + if (e_client_has_xwindow(ec)) +@@ -1036,8 +1033,6 @@ e_comp_wl_data_device_send_leave(E_Client *ec) + e_client_has_xwindow(e_comp_wl->drag_client)) + return; + if (e_comp_wl->drag && (e_comp_wl->drag->object == ec->frame)) return; +- evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_DEL, +- _e_comp_wl_data_device_target_del, ec); + if (e_comp_wl->selection.target == ec) + e_comp_wl->selection.target = NULL; + #ifndef HAVE_WAYLAND_ONLY +@@ -1093,6 +1088,7 @@ e_comp_wl_data_device_keyboard_focus_set(void) + { + struct wl_resource *data_device_res, *offer_res = NULL, *focus; + E_Comp_Wl_Data_Source *source; ++ E_Client *focused; + + if (!e_comp_wl->kbd.enabled) + { +@@ -1105,6 +1101,7 @@ e_comp_wl_data_device_keyboard_focus_set(void) + ERR("No focused resource"); + return; + } ++ focused = wl_resource_get_user_data(focus); + source = (E_Comp_Wl_Data_Source *)e_comp_wl->selection.data_source; + + #ifndef HAVE_WAYLAND_ONLY +@@ -1113,10 +1110,10 @@ e_comp_wl_data_device_keyboard_focus_set(void) + if (!e_comp_util_has_xwayland()) break; + if (e_comp_wl->clipboard.xwl_owner) + { +- if (e_client_has_xwindow(e_client_focused_get())) return; ++ if (e_client_has_xwindow(focused)) return; + break; + } +- else if (source && e_client_has_xwindow(e_client_focused_get())) ++ else if (source && e_client_has_xwindow(focused)) + { + /* wl -> x11 */ + ecore_x_selection_owner_set(e_comp->cm_selection, +diff --git a/src/bin/e_comp_wl_input.c b/src/bin/e_comp_wl_input.c +index d8281c0dd..3cbb605c7 100644 +--- a/src/bin/e_comp_wl_input.c ++++ b/src/bin/e_comp_wl_input.c +@@ -450,7 +450,7 @@ e_comp_wl_input_init(void) + { + /* set default seat name */ + if (!e_comp_wl->seat.name) +- e_comp_wl->seat.name = "default"; ++ e_comp_wl->seat.name = "seat0"; + + e_comp_wl->xkb.fd = -1; + +@@ -661,8 +661,13 @@ _e_comp_wl_input_context_keymap_set(struct xkb_keymap *keymap, struct xkb_contex + dev = ecore_evas_data_get(e_comp->ee, "device"); + if (dev) + { +- ecore_drm2_device_keyboard_cached_context_set(dev, context); +- ecore_drm2_device_keyboard_cached_keymap_set(dev, keymap); ++#ifndef EFL_VERSION_1_20 ++ if (!E_EFL_VERSION_MINIMUM(1, 19, 99)) ++ { ++ ecore_drm2_device_keyboard_cached_context_set(dev, context); ++ ecore_drm2_device_keyboard_cached_keymap_set(dev, keymap); ++ } ++#endif + } + } + # else +diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c +index 3b67fe260..7f1f2afa8 100644 +--- a/src/bin/e_comp_x.c ++++ b/src/bin/e_comp_x.c +@@ -120,7 +120,7 @@ _e_comp_x_focus_check(void) + focused = e_client_focused_get(); + /* if there is no new focused or it is a non-X client, + * focus comp canvas on focus-out */ +- if ((!focused) || (e_pixmap_type_get(focused->pixmap) != E_PIXMAP_TYPE_X)) ++ if ((!focused) || (!e_client_has_xwindow(focused))) + { + focus_canvas_time = ecore_x_current_time_get(); + focus_time = 0; +@@ -3920,15 +3920,19 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) + { + unsigned int val; + +- if (ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY, &val, 1) > 0) ++ if (ecore_x_netwm_opacity_get(win, &val)) + { +- val = (val >> 24); + if (ec->netwm.opacity != val) + { + ec->netwm.opacity = val; ++ evas_object_color_set(ec->frame, ++ ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity, ec->netwm.opacity); + rem_change = 1; + } ++ ec->netwm.fetch.opacity = !ec->netwm.opacity; + } ++ else ++ ec->netwm.fetch.opacity = 0; + } + if (ec->netwm.fetch.icon) + { +@@ -4633,6 +4637,7 @@ _e_comp_x_hook_client_focus_unset(void *d EINA_UNUSED, E_Client *ec) + focus_job_client = NULL; + E_FREE_FUNC(focus_job, ecore_job_del); + } ++ if (ec->override) return; + unfocus_job_client = ec; + if (!unfocus_job) + unfocus_job = ecore_job_add(_e_comp_x_hook_client_focus_unset_job, NULL); +@@ -4677,6 +4682,7 @@ _e_comp_x_hook_client_focus_set(void *d EINA_UNUSED, E_Client *ec) + unfocus_job_client = NULL; + E_FREE_FUNC(unfocus_job, ecore_job_del); + } ++ if (ec->override) return; + focus_job_client = ec; + if (!focus_job) + focus_job = ecore_job_add(_e_comp_x_hook_client_focus_set_job, NULL); +@@ -5485,7 +5491,10 @@ _e_comp_x_setup(Ecore_X_Window root, int w, int h) + if (!e_comp_canvas_init(w, h)) return EINA_FALSE; + } + +- e_grabinput_focus(e_comp->ee_win, E_FOCUS_METHOD_PASSIVE); ++ if (e_comp->comp_type == E_PIXMAP_TYPE_X) ++ e_grabinput_focus(e_comp->ee_win, E_FOCUS_METHOD_PASSIVE); ++ else ++ e_grabinput_focus(e_comp->root, E_FOCUS_METHOD_PASSIVE); + + /* init layers */ + for (i = e_comp_canvas_layer_map(E_LAYER_CLIENT_DESKTOP); i <= e_comp_canvas_layer_map(E_LAYER_CLIENT_PRIO); i++) +diff --git a/src/bin/e_comp_x_randr.c b/src/bin/e_comp_x_randr.c +index 20ab4e54b..a539a6e3f 100644 +--- a/src/bin/e_comp_x_randr.c ++++ b/src/bin/e_comp_x_randr.c +@@ -104,6 +104,8 @@ _is_lid_name(const char *name) + else if (strstr(name, "eDP")) return EINA_TRUE; + else if (strstr(name, "edp")) return EINA_TRUE; + else if (strstr(name, "EDP")) return EINA_TRUE; ++ else if (strstr(name, "DSI")) return EINA_TRUE; ++ else if (strstr(name, "dsi")) return EINA_TRUE; + return EINA_FALSE; + } + +diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c +index 43ac2cdf3..03d0cee56 100644 +--- a/src/bin/e_fm.c ++++ b/src/bin/e_fm.c +@@ -7061,7 +7061,7 @@ _e_fm2_cb_dnd_selection_notify(void *data, const char *type, void *event) + } + } + } +- else ++ else if (sd->realpath) + { + if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST && sd->order_file) /* list */ + { +diff --git a/src/bin/e_gadget.c b/src/bin/e_gadget.c +index 7935b5fc1..2aa1e410c 100644 +--- a/src/bin/e_gadget.c ++++ b/src/bin/e_gadget.c +@@ -275,6 +275,15 @@ _gadget_object_free(E_Object *eobj) + if (zgc->id == -1) _gadget_free(zgc); + } + ++static void ++_gadget_remove(E_Gadget_Config *zgc) ++{ ++ evas_object_smart_callback_call(zgc->site->layout, "gadget_removed", zgc->gadget); ++ zgc->site->gadget_list = eina_inlist_remove(zgc->site->gadget_list, EINA_INLIST_GET(zgc)); ++ zgc->site->gadgets = eina_list_remove(zgc->site->gadgets, zgc); ++ _gadget_free(zgc); ++} ++ + static void + _gadget_wizard_end(void *data, int id) + { +@@ -282,7 +291,10 @@ _gadget_wizard_end(void *data, int id) + + zgc->id = id; + evas_object_smart_callback_call(zgc->site->layout, "gadget_site_unlocked", NULL); +- _gadget_object_finalize(zgc); ++ if (id) ++ _gadget_object_finalize(zgc); ++ else ++ _gadget_remove(zgc); + } + + static Eina_Bool +@@ -322,7 +334,7 @@ _gadget_object_create(E_Gadget_Config *zgc) + + if (!zgc->site->orient) + evas_object_smart_need_recalculate_set(zgc->site->layout, 1); +- evas_object_event_callback_priority_add(g, EVAS_CALLBACK_DEL, EVAS_CALLBACK_PRIORITY_BEFORE, _gadget_del, zgc); ++ evas_object_event_callback_priority_add(g, EVAS_CALLBACK_DEL, EVAS_CALLBACK_PRIORITY_AFTER, _gadget_del, zgc); + _gadget_reparent(zgc->site, zgc); + elm_object_tree_focus_allow_set(zgc->gadget, 0); + evas_object_raise(zgc->site->events); +@@ -386,16 +398,16 @@ _site_gadget_resize(Evas_Object *g, int w, int h, Evas_Coord *ww, Evas_Coord *hh + switch (aspect) + { + case EVAS_ASPECT_CONTROL_HORIZONTAL: +- *hh = (*ww * ay / ax); ++ *hh = (*ww * (double)ay / ax); + break; + case EVAS_ASPECT_CONTROL_VERTICAL: +- *ww = (*hh * ax / ay); ++ *ww = (*hh * (double)ax / ay); + break; + default: + if (IS_HORIZ(zgc->site->orient)) +- *ww = (*hh * ax / ay); ++ *ww = (*hh * (double)ax / ay); + else if (IS_VERT(zgc->site->orient)) +- *hh = (*ww * ay / ax); ++ *hh = (*ww * (double)ay / ax); + else if (aspect) + { + double ar = ax / (double) ay; +@@ -408,9 +420,9 @@ _site_gadget_resize(Evas_Object *g, int w, int h, Evas_Coord *ww, Evas_Coord *hh + *ww = *hh; + } + else if (ar > 1.0) +- *hh = (*ww * ay / ax); ++ *hh = (*ww * (double)ay / ax); + else +- *ww = (*hh * ax / ay); ++ *ww = (*hh * (double)ax / ay); + } + } + } +@@ -540,6 +552,7 @@ _site_layout(Evas_Object *o, Evas_Object_Box_Data *priv EINA_UNUSED, void *data) + E_Gadget_Config *zgc; + + evas_object_geometry_get(o, &x, &y, &w, &h); ++ if ((!w) || (!h)) return; + evas_object_geometry_set(zgs->events, x, y, w, h); + + evas_object_box_align_get(o, &ax, &ay); +@@ -631,11 +644,17 @@ _gadget_mouse_resize(E_Gadget_Config *zgc, int t EINA_UNUSED, Ecore_Event_Mouse_ + gw = zgc->w * w; + gh = zgc->h * h; + if (zgc->resizing & E_GADGET_SITE_ANCHOR_LEFT) +- gw -= (ev->x - zgc->down.x); ++ { ++ gw -= (ev->x - zgc->down.x); ++ zgc->x = ev->x / (double)w; ++ } + else + gw += (ev->x - zgc->down.x); + if (zgc->resizing & E_GADGET_SITE_ANCHOR_TOP) +- gh -= (ev->y - zgc->down.y); ++ { ++ gh -= (ev->y - zgc->down.y); ++ zgc->y = ev->y / (double)h; ++ } + else + gh += (ev->y - zgc->down.y); + zgc->w = gw / w; +@@ -777,15 +796,6 @@ _gadget_act_configure(E_Object *obj, const char *params EINA_UNUSED, E_Binding_E + return EINA_TRUE; + } + +-static void +-_gadget_remove(E_Gadget_Config *zgc) +-{ +- evas_object_smart_callback_call(zgc->site->layout, "gadget_removed", zgc->gadget); +- zgc->site->gadget_list = eina_inlist_remove(zgc->site->gadget_list, EINA_INLIST_GET(zgc)); +- zgc->site->gadgets = eina_list_remove(zgc->site->gadgets, zgc); +- _gadget_free(zgc); +-} +- + static void + _gadget_menu_remove(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED) + { +@@ -1141,17 +1151,17 @@ _site_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e + { + E_Gadget_Site *zgs = data; + E_Gadget_Config *zgc; +- Eina_List *l; ++ Eina_List *l, *ll; + + E_FREE_FUNC(zgs->events, evas_object_del); ++ E_FREE_FUNC(zgs->move_handler, ecore_event_handler_del); ++ E_FREE_FUNC(zgs->mouse_up_handler, ecore_event_handler_del); ++ EINA_LIST_FOREACH_SAFE(zgs->gadgets, l, ll, zgc) ++ evas_object_del(zgc->display); + zgs->layout = NULL; + zgs->cur_size = 0; + zgs->action = NULL; + zgs->style_cb = NULL; +- E_FREE_FUNC(zgs->move_handler, ecore_event_handler_del); +- E_FREE_FUNC(zgs->mouse_up_handler, ecore_event_handler_del); +- EINA_LIST_FOREACH(zgs->gadgets, l, zgc) +- evas_object_del(zgc->display); + if (zgs->name) return; + eina_stringshare_del(zgs->name); + free(zgs); +@@ -1223,13 +1233,26 @@ _site_create(E_Gadget_Site *zgs) + evas_object_raise(zgs->events); + } + ++static void ++_site_auto_add_comp_object_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) ++{ ++ E_Gadget_Site *zgs = data; ++ Eina_List *l, *ll; ++ E_Gadget_Config *zgc; ++ ++ /* prune unconfigured gadgets */ ++ EINA_LIST_FOREACH_SAFE(zgs->gadgets, l, ll, zgc) ++ if (zgc->id <= 0) _gadget_remove(zgc); ++ evas_object_del(zgs->layout); ++} ++ + static void + _site_auto_add(E_Gadget_Site *zgs, Evas_Object *comp_object) + { + int x, y, w, h; + + _site_create(zgs); +- e_comp_object_util_del_list_append(comp_object, zgs->layout); ++ evas_object_event_callback_add(comp_object, EVAS_CALLBACK_DEL, _site_auto_add_comp_object_del, zgs); + evas_object_layer_set(zgs->layout, evas_object_layer_get(comp_object)); + evas_object_stack_above(zgs->layout, comp_object); + evas_object_geometry_get(comp_object, &x, &y, &w, &h); +@@ -1508,12 +1531,13 @@ e_gadget_util_layout_style_init(Evas_Object *g, Evas_Object *style) + EINA_SAFETY_ON_NULL_RETURN_VAL(zgc, NULL); + + prev = zgc->style.obj; ++ if ((!prev) && (!style)) return NULL; + zgc->style.obj = style; + if (style) + { + elm_layout_file_get(style, NULL, &grp); + eina_stringshare_replace(&zgc->style.name, strrchr(grp, '/') + 1); +- evas_object_event_callback_priority_add(style, EVAS_CALLBACK_DEL, EVAS_CALLBACK_PRIORITY_BEFORE, _gadget_del, zgc); ++ evas_object_event_callback_priority_add(style, EVAS_CALLBACK_DEL, EVAS_CALLBACK_PRIORITY_AFTER, _gadget_del, zgc); + } + else + eina_stringshare_replace(&zgc->style.name, NULL); +diff --git a/src/bin/e_main.c b/src/bin/e_main.c +index ceab4bd8e..25acd837d 100644 +--- a/src/bin/e_main.c ++++ b/src/bin/e_main.c +@@ -327,22 +327,6 @@ main(int argc, char **argv) + e_util_env_set("DESKTOP", "Enlightenment"); + TS("Environment Variables Done"); + +- /* KDE5 applications don't understand anything other then gnome or kde */ +- /* They expect everyone else to set QT_QPA_PLATFORMTHEME to tell them how */ +- /* to theme there apps otherwise they use a fallback mode which results in */ +- /* missing icons and a inability to change the appearance of applications */ +- /* see https://bugzilla.suse.com/show_bug.cgi?id=920792 for more info. */ +- /* There are two sensible defaults for this variable, "kde" which will */ +- /* make apps appear the same as they do if they are run in kde. and gtk2 */ +- /* which will make kde applications follow the gtk/gnome theme, we have */ +- /* decided on choosing gtk2 as it means that kde/qt apps will follow the */ +- /* app and icon theme set in the enlightenment settings dialog. Some users */ +- /* who wish to use Qt apps without any gnome or gtk usage may choose to */ +- /* install qt5ct and overwrite this variable with qt5ct and use that to */ +- /* configure there Qt5 applications. */ +- e_util_env_set("QT_QPA_PLATFORMTHEME", "gtk2"); +- e_util_env_set("QT_STYLE_OVERRIDE", "gtk2"); +- + TS("Parse Arguments"); + _e_main_parse_arguments(argc, argv); + TS("Parse Arguments Done"); +@@ -566,6 +550,26 @@ main(int argc, char **argv) + TS("E_Config Init Done"); + _e_main_shutdown_push(e_config_shutdown); + ++ if (e_config->xsettings.match_e17_theme) ++ { ++ ++ /* KDE5 applications don't understand anything other then gnome or kde */ ++ /* They expect everyone else to set QT_QPA_PLATFORMTHEME to tell them how */ ++ /* to theme there apps otherwise they use a fallback mode which results in */ ++ /* missing icons and a inability to change the appearance of applications */ ++ /* see https://bugzilla.suse.com/show_bug.cgi?id=920792 for more info. */ ++ /* There are two sensible defaults for this variable, "kde" which will */ ++ /* make apps appear the same as they do if they are run in kde. and gtk2 */ ++ /* which will make kde applications follow the gtk/gnome theme, we have */ ++ /* decided on choosing gtk2 as it means that kde/qt apps will follow the */ ++ /* app and icon theme set in the enlightenment settings dialog. Some users */ ++ /* who wish to use Qt apps without any gnome or gtk usage may choose to */ ++ /* install qt5ct and overwrite this variable with qt5ct and use that to */ ++ /* configure there Qt5 applications. */ ++ e_util_env_set("QT_QPA_PLATFORMTHEME", "gtk2"); ++ e_util_env_set("QT_STYLE_OVERRIDE", "gtk2"); ++ } ++ + TS("E_Env Init"); + if (!e_env_init()) + { +@@ -1521,6 +1525,14 @@ _e_main_test_formats(void) + Evas_Object *im, *txt; + Evas_Coord tw, th; + char buff[PATH_MAX]; ++ char *types[] = ++ { ++ "svg", ++ "jpg", ++ "png", ++ "edj" ++ }; ++ unsigned int i, t_edj = 3; + + if (e_config->show_splash) + e_init_status_set(_("Testing Format Support")); +@@ -1534,45 +1546,32 @@ _e_main_test_formats(void) + evas = ecore_evas_get(ee); + im = evas_object_image_add(evas); + +- e_prefix_data_concat_static(buff, "data/images/test.svg"); +- evas_object_image_file_set(im, buff, NULL); +- if (evas_object_image_load_error_get(im) != EVAS_LOAD_ERROR_NONE) ++ for (i = 0; i < EINA_C_ARRAY_LENGTH(types); i++) + { +- e_error_message_show(_("Enlightenment found Evas can't load SVG files. " +- "Check Evas has SVG loader support.\n")); +- } +- else +- efreet_icon_extension_add(".svg"); ++ char b[128], *t = types[i]; + +- e_prefix_data_concat_static(buff, "data/images/test.jpg"); +- evas_object_image_file_set(im, buff, NULL); +- if (evas_object_image_load_error_get(im) != EVAS_LOAD_ERROR_NONE) +- { +- e_error_message_show(_("Enlightenment found Evas can't load JPEG files. " +- "Check Evas has JPEG loader support.\n")); +- _e_main_shutdown(-1); +- } +- efreet_icon_extension_add(".jpg"); +- +- e_prefix_data_concat_static(buff, "data/images/test.png"); +- evas_object_image_file_set(im, buff, NULL); +- if (evas_object_image_load_error_get(im) != EVAS_LOAD_ERROR_NONE) +- { +- e_error_message_show(_("Enlightenment found Evas can't load PNG files. " +- "Check Evas has PNG loader support.\n")); +- _e_main_shutdown(-1); +- } +- efreet_icon_extension_add(".png"); +- +- e_prefix_data_concat_static(buff, "data/images/test.edj"); +- evas_object_image_file_set(im, buff, "images/0"); +- if (evas_object_image_load_error_get(im) != EVAS_LOAD_ERROR_NONE) +- { +- e_error_message_show(_("Enlightenment found Evas can't load EET files. " +- "Check Evas has EET loader support.\n")); +- _e_main_shutdown(-1); ++ snprintf(b, sizeof(b), "data/images/test.%s", types[i]); ++ e_prefix_data_concat_static(buff, b); ++ evas_object_image_file_set(im, buff, NULL); ++ if (i == t_edj) t = "eet"; ++ switch (evas_object_image_load_error_get(im)) ++ { ++ default: ++ e_error_message_show(_("Enlightenment found Evas can't load '%s' files. " ++ "Check Evas has '%s' loader support.\n"), t, t); ++ if (i) _e_main_shutdown(-1); ++ break; ++ case EVAS_LOAD_ERROR_CORRUPT_FILE: ++ case EVAS_LOAD_ERROR_DOES_NOT_EXIST: ++ case EVAS_LOAD_ERROR_PERMISSION_DENIED: ++ e_error_message_show(_("Enlightenment cannot access test image for '%s' filetype. " ++ "Check your install for setup issues.\n"), t); ++ case EVAS_LOAD_ERROR_NONE: ++ snprintf(b, sizeof(b), ".%s", types[i]); ++ efreet_icon_extension_add(b); ++ break; ++ } + } +- efreet_icon_extension_add(".edj"); + + evas_object_del(im); + +diff --git a/src/bin/e_pixmap.c b/src/bin/e_pixmap.c +index 2849e598d..e22ec6221 100644 +--- a/src/bin/e_pixmap.c ++++ b/src/bin/e_pixmap.c +@@ -46,7 +46,6 @@ struct _E_Pixmap + + #ifdef HAVE_WAYLAND + E_Comp_Wl_Buffer *buffer; +- E_Comp_Wl_Buffer *native_buffer; + E_Comp_Wl_Buffer *held_buffer; + struct wl_listener buffer_destroy_listener; + struct wl_listener held_buffer_destroy_listener; +@@ -704,6 +703,17 @@ e_pixmap_native_surface_init(E_Pixmap *cp, Evas_Native_Surface *ns) + EINA_SAFETY_ON_NULL_RETURN_VAL(cp, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(ns, EINA_FALSE); + ++ /* This structure is stack automatic in the caller, so it's all ++ * uninitialized. Clear it to 0 so we don't have uninit data for ++ * variables only present in a newer version of native surface ++ * than this code was written for. ++ * ++ * The other option would be to set ns->version to whatever version ++ * this code was actually written against, but I've been told all ++ * native surface users are expected to set ns->version to the ++ * version provided in the headers (EVAS_NATIVE_SURFACE_VERSION) ++ */ ++ memset(ns, 0, sizeof(*ns)); + ns->version = EVAS_NATIVE_SURFACE_VERSION; + switch (cp->type) + { +@@ -721,17 +731,14 @@ e_pixmap_native_surface_init(E_Pixmap *cp, Evas_Native_Surface *ns) + if (cp->buffer->dmabuf_buffer) + { + ns->type = EVAS_NATIVE_SURFACE_WL_DMABUF; +- ns->version = EVAS_NATIVE_SURFACE_VERSION; + + ns->data.wl_dmabuf.attr = &cp->buffer->dmabuf_buffer->attributes; + ns->data.wl_dmabuf.resource = cp->buffer->resource; +- cp->native_buffer = cp->buffer; + ret = EINA_TRUE; + } + else if (!cp->buffer->shm_buffer) + { + ns->type = EVAS_NATIVE_SURFACE_WL; +- ns->version = EVAS_NATIVE_SURFACE_VERSION; + ns->data.wl.legacy_buffer = cp->buffer->resource; + ret = EINA_TRUE; + } +@@ -1059,23 +1066,24 @@ e_pixmap_dmabuf_test(struct linux_dmabuf_buffer *dmabuf) + { + Evas_Native_Surface ns; + Evas_Object *test; ++ Eina_Bool ret; + int size; + void *data; + +- if (e_comp->gl) +- { +- Eina_Bool ret; +- ns.type = EVAS_NATIVE_SURFACE_WL_DMABUF; +- ns.version = EVAS_NATIVE_SURFACE_VERSION; +- ns.data.wl_dmabuf.attr = &dmabuf->attributes; +- ns.data.wl_dmabuf.resource = NULL; +- test = evas_object_image_add(e_comp->evas); +- evas_object_image_native_surface_set(test, &ns); +- ret = evas_object_image_load_error_get(test) == EVAS_LOAD_ERROR_NONE; +- evas_object_del(test); +- if (!ns.data.wl_dmabuf.attr) return EINA_FALSE; +- return ret; +- } ++ memset(&ns, 0, sizeof(ns)); ++ ++ ns.type = EVAS_NATIVE_SURFACE_WL_DMABUF; ++ ns.version = EVAS_NATIVE_SURFACE_VERSION; ++ ns.data.wl_dmabuf.attr = &dmabuf->attributes; ++ ns.data.wl_dmabuf.resource = NULL; ++ test = evas_object_image_add(e_comp->evas); ++ evas_object_image_native_surface_set(test, &ns); ++ ret = evas_object_image_load_error_get(test) == EVAS_LOAD_ERROR_NONE; ++ evas_object_del(test); ++ if (!ns.data.wl_dmabuf.attr) return EINA_FALSE; ++ ++ if (e_comp->gl || !ret) ++ return ret; + + /* TODO: Software rendering for multi-plane formats */ + if (dmabuf->attributes.n_planes != 1) return EINA_FALSE; +@@ -1084,7 +1092,7 @@ e_pixmap_dmabuf_test(struct linux_dmabuf_buffer *dmabuf) + + /* This is only legit for ARGB8888 */ + size = dmabuf->attributes.height * dmabuf->attributes.stride[0]; +- data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, dmabuf->attributes.fd[0], 0); ++ data = mmap(NULL, size, PROT_READ, MAP_SHARED, dmabuf->attributes.fd[0], 0); + if (data == MAP_FAILED) return EINA_FALSE; + munmap(data, size); + +diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c +index 07b1761fa..dbf9b1123 100644 +--- a/src/bin/e_pointer.c ++++ b/src/bin/e_pointer.c +@@ -780,7 +780,10 @@ e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y) + } + ec = e_comp_object_client_get(o); + if (ec) +- ec->hidden = 1; ++ { ++ ec->hidden = 1; ++ evas_object_hide(ec->frame); ++ } + } + + if (obj) +@@ -807,3 +810,18 @@ e_pointer_window_add(E_Pointer *ptr, Ecore_Window win) + _e_pointer_theme_buf(ptr, buf); + _e_pointer_x11_setup(ptr, buf); + } ++ ++EINTERN void ++e_pointers_freeze_set(Eina_Bool set) ++{ ++ Eina_List *l; ++ E_Pointer *ptr; ++ ++ EINA_LIST_FOREACH(_ptrs, l, ptr) ++ { ++ if (isedje(ptr->o_ptr)) ++ edje_object_play_set(ptr->o_ptr, !set); ++ if (isedje(ptr->buffer_o_ptr)) ++ edje_object_play_set(ptr->buffer_o_ptr, !set); ++ } ++} +diff --git a/src/bin/e_pointer.h b/src/bin/e_pointer.h +index 91185a6c4..df74d882d 100644 +--- a/src/bin/e_pointer.h ++++ b/src/bin/e_pointer.h +@@ -60,6 +60,7 @@ struct _E_Pointer + + EINTERN int e_pointer_init(void); + EINTERN int e_pointer_shutdown(void); ++EINTERN void e_pointers_freeze_set(Eina_Bool set); + + E_API E_Pointer *e_pointer_window_new(Ecore_Window win, Eina_Bool filled); + E_API E_Pointer *e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled); +diff --git a/src/bin/e_sys.c b/src/bin/e_sys.c +index 72e926087..cbc24f345 100644 +--- a/src/bin/e_sys.c ++++ b/src/bin/e_sys.c +@@ -762,7 +762,7 @@ _e_sys_logout_after(void) + static void + _e_sys_logout_begin(E_Sys_Action a_after, Eina_Bool raw) + { +- const Eina_List *l; ++ const Eina_List *l, *ll; + E_Client *ec; + E_Obj_Dialog *od; + +@@ -783,7 +783,7 @@ _e_sys_logout_begin(E_Sys_Action a_after, Eina_Bool raw) + } + _e_sys_action_after = a_after; + _e_sys_action_after_raw = raw; +- EINA_LIST_FOREACH(e_comp->clients, l, ec) ++ EINA_LIST_FOREACH_SAFE(e_comp->clients, l, ll, ec) + { + e_client_act_close_begin(ec); + } +diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c +index a48622464..ae46aa068 100644 +--- a/src/bin/e_utils.c ++++ b/src/bin/e_utils.c +@@ -1056,7 +1056,7 @@ _e_util_size_debug(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj + + evas_object_geometry_get(obj, &x, &y, &w, &h); + name = evas_object_name_get(obj); +- fprintf(stderr, "%s %d OBJ[%s%s%p]: (%d,%d) - %dx%d\n", evas_object_visible_get(obj) ? "VIS" : "HID", evas_object_layer_get(obj), name ?: "", name ? "|" : "", obj, x, y, w, h); ++ fprintf(stderr, "%s %d OBJ[%s%s%p]: (%d,%d) - %dx%d\n", evas_object_visible_get(obj) ? "VIS" : "HID", evas_object_layer_get(obj), name ?: evas_object_type_get(obj), "|", obj, x, y, w, h); + } + + E_API void +diff --git a/src/bin/e_widget_entry.c b/src/bin/e_widget_entry.c +index 9426830be..46cd4c7c9 100644 +--- a/src/bin/e_widget_entry.c ++++ b/src/bin/e_widget_entry.c +@@ -6,6 +6,7 @@ struct _E_Widget_Data + Evas_Object *o_entry, *o_inout; + char **text_location; + void (*func)(void *data, void *data2); ++ char *text; + void *data; + void *data2; + }; +@@ -81,7 +82,16 @@ e_widget_entry_add(Evas_Object *parent, char **text_location, void (*func)(void + + o = wd->o_entry; + if ((text_location) && (*text_location)) +- elm_object_text_set(o, *text_location); ++ { ++ char *tmp = elm_entry_utf8_to_markup(*text_location); ++ ++ if (tmp) ++ { ++ elm_object_text_set(o, tmp); ++ free(tmp); ++ } ++ else elm_object_text_set(wd->o_entry, NULL); ++ } + + wd->func = func; + wd->data = data; +@@ -101,10 +111,17 @@ E_API void + e_widget_entry_text_set(Evas_Object *entry, const char *text) + { + E_Widget_Data *wd; ++ char *tmp; + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return; +- elm_object_text_set(wd->o_entry, text); ++ tmp = elm_entry_utf8_to_markup(text); ++ if (tmp) ++ { ++ elm_object_text_set(wd->o_entry, tmp); ++ free(tmp); ++ } ++ else elm_object_text_set(wd->o_entry, NULL); + } + + /** +@@ -117,10 +134,20 @@ E_API const char * + e_widget_entry_text_get(Evas_Object *entry) + { + E_Widget_Data *wd; ++ char *tmp; + + if (!(entry) || (!(wd = e_widget_data_get(entry)))) + return NULL; +- return elm_object_text_get(wd->o_entry); ++ tmp = elm_entry_markup_to_utf8(elm_object_text_get(wd->o_entry)); ++ if (tmp) ++ { ++ if (wd->text) free(wd->text); ++ wd->text = tmp; ++ return wd->text; ++ } ++ if (wd->text) free(wd->text); ++ wd->text = NULL; ++ return NULL; + } + + /** +@@ -197,10 +224,12 @@ _e_wid_del_hook(Evas_Object *obj) + + if (!(obj) || (!(wd = e_widget_data_get(obj)))) + return; ++ if (wd->text) free(wd->text); + evas_object_del(wd->o_entry); + evas_object_del(wd->o_inout); + wd->o_entry = NULL; + wd->o_inout = NULL; ++ wd->text = NULL; + free(wd); + } + +@@ -237,16 +266,26 @@ _e_wid_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EIN + { + Evas_Object *entry; + E_Widget_Data *wd; +- const char *text; ++ char *tmp; + + if (!(entry = data) || (!(wd = e_widget_data_get(entry)))) + return; + ++ tmp = elm_entry_markup_to_utf8(elm_object_text_get(wd->o_entry)); ++ if (tmp) ++ { ++ if (wd->text) free(wd->text); ++ wd->text = tmp; ++ } ++ else ++ { ++ if (wd->text) free(wd->text); ++ wd->text = NULL; ++ } + if (wd->text_location) + { +- text = elm_object_text_get(wd->o_entry); + free(*wd->text_location); +- *wd->text_location = text ? strdup(text) : NULL; ++ *wd->text_location = wd->text ? strdup(wd->text) : NULL; + } + e_widget_change(data); + +diff --git a/src/bin/e_win.c b/src/bin/e_win.c +index 5ae728353..de8093e6c 100644 +--- a/src/bin/e_win.c ++++ b/src/bin/e_win.c +@@ -166,13 +166,13 @@ _e_elm_win_trap_show(void *data, Evas_Object *o) + ctx->client->borderless |= borderless; + e_comp_object_frame_xy_adjust(ctx->client->frame, ctx->client->client.x, ctx->client->client.y, &ctx->client->x, &ctx->client->y); + e_comp_object_frame_wh_adjust(ctx->client->frame, ctx->client->client.w, ctx->client->client.h, &ctx->client->w, &ctx->client->h); ++ if (ctx->sized) evas_object_resize(o, ctx->w, ctx->h); ++ if (ctx->placed) evas_object_move(o, ctx->x, ctx->y); + if (ctx->centered) + { +- e_comp_object_util_center(ctx->client->frame); +- ctx->centered =0; ++ e_comp_object_util_center(o); ++ ctx->centered = 0; + } +- else if (ctx->placed) evas_object_move(o, ctx->x, ctx->y); +- if (ctx->sized) evas_object_resize(o, ctx->w, ctx->h); + return EINA_TRUE; + } + +diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c +index 4397ad0a7..f6c70864f 100644 +--- a/src/bin/e_zone.c ++++ b/src/bin/e_zone.c +@@ -78,6 +78,7 @@ _e_zone_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *eve + E_Zone_Edge edge; + E_Zone *zone = data; + ++ if (!ev->timestamp) return; + edge = _e_zone_detect_edge(zone, obj); + if (edge == E_ZONE_EDGE_NONE) return; + +@@ -101,6 +102,7 @@ _e_zone_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *ev + E_Zone_Edge edge; + E_Zone *zone = data; + ++ if (!ev->timestamp) return; + edge = _e_zone_detect_edge(zone, obj); + if (edge == E_ZONE_EDGE_NONE) return; + +@@ -124,6 +126,7 @@ _e_zone_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *e + E_Zone_Edge edge; + E_Zone *zone = data; + ++ if (!ev->timestamp) return; + edge = _e_zone_detect_edge(zone, obj); + if (edge == E_ZONE_EDGE_NONE) return; + +@@ -146,6 +149,7 @@ _e_zone_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *eve + E_Zone_Edge edge; + E_Zone *zone = data; + ++ if (!ev->timestamp) return; + edge = _e_zone_detect_edge(zone, obj); + if (edge == E_ZONE_EDGE_NONE) return; + +diff --git a/src/modules/clock/e_mod_main.c b/src/modules/clock/e_mod_main.c +index b2356a671..9011238a0 100644 +--- a/src/modules/clock/e_mod_main.c ++++ b/src/modules/clock/e_mod_main.c +@@ -38,7 +38,7 @@ static void _clock_popup_free(Instance *inst); + static Eio_Monitor *clock_tz_monitor = NULL; + static Eio_Monitor *clock_tz2_monitor = NULL; + static Eio_Monitor *clock_tzetc_monitor = NULL; +-static Eina_List *clock_eio_handlers = NULL; ++static Eina_List *handlers = NULL; + Config *clock_config = NULL; + + static E_Config_DD *conf_edd = NULL; +@@ -839,6 +839,20 @@ _clock_time_update(void *d EINA_UNUSED, int type EINA_UNUSED, void *event EINA_U + return ECORE_CALLBACK_PASS_ON; + } + ++static Eina_Bool ++_clock_screensaver_on() ++{ ++ E_FREE_FUNC(update_today, ecore_timer_del); ++ return ECORE_CALLBACK_RENEW; ++} ++ ++static Eina_Bool ++_clock_screensaver_off() ++{ ++ if (clock_instances) _update_today_timer(NULL); ++ return ECORE_CALLBACK_RENEW; ++} ++ + /* module setup */ + E_API E_Module_Api e_modapi = + { +@@ -893,14 +907,16 @@ e_modapi_init(E_Module *m) + clock_tz2_monitor = eio_monitor_add("/etc/timezone"); + if (ecore_file_is_dir("/etc")) + clock_tzetc_monitor = eio_monitor_add("/etc"); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_ERROR, _clock_eio_error, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_FILE_CREATED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_FILE_MODIFIED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_FILE_DELETED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_SELF_DELETED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_SELF_RENAME, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, E_EVENT_SYS_RESUME, _clock_time_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, ECORE_EVENT_SYSTEM_TIMEDATE_CHANGED, _clock_time_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_ERROR, _clock_eio_error, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_FILE_CREATED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_FILE_MODIFIED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_FILE_DELETED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_SELF_DELETED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_SELF_RENAME, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, E_EVENT_SYS_RESUME, _clock_time_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_SYSTEM_TIMEDATE_CHANGED, _clock_time_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_ON, _clock_screensaver_on, NULL); ++ E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_OFF, _clock_screensaver_off, NULL); + + e_gadcon_provider_register(&_gadcon_class); + +diff --git a/src/modules/conf_randr/e_int_config_randr2.c b/src/modules/conf_randr/e_int_config_randr2.c +index 50512bd69..adb9c3e89 100644 +--- a/src/modules/conf_randr/e_int_config_randr2.c ++++ b/src/modules/conf_randr/e_int_config_randr2.c +@@ -443,7 +443,7 @@ _basic_screen_info_fill(E_Config_Dialog_Data *cfdata, E_Config_Randr2_Screen *cs + else if (cs->rel_mode == E_RANDR2_RELATIVE_TO_BELOW) + elm_object_text_set(cfdata->rel_mode_obj, _("Below")); + else +- elm_object_text_set(cfdata->rel_mode_obj, "???"); ++ elm_object_text_set(cfdata->rel_mode_obj, _("Unconfigured")); + + elm_slider_value_set(cfdata->rel_align_obj, cs->rel_align); + +@@ -864,6 +864,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas EINA_UNUSED, E_Config_Dialog_Data + + /////////////////////////////////////////////////////////////////////// + o = elm_list_add(win); ++ elm_scroller_content_min_limit(o, 1, 0); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, o, 1, 0, 1, 14); +diff --git a/src/modules/conf_randr/e_mod_main.c b/src/modules/conf_randr/e_mod_main.c +index 8aa8e20e3..7667be912 100644 +--- a/src/modules/conf_randr/e_mod_main.c ++++ b/src/modules/conf_randr/e_mod_main.c +@@ -15,6 +15,7 @@ _cb_randr(void *data EINA_UNUSED, int type EINA_UNUSED, void *info EINA_UNUSED) + Eina_List *l; + E_Randr2_Screen *s; + ++ if (!e_randr2) return ECORE_CALLBACK_RENEW; + EINA_LIST_FOREACH(e_randr2->screens, l, s) + { + if (!s->config.configured) +diff --git a/src/modules/lokker/lokker.c b/src/modules/lokker/lokker.c +index db9fb8211..e462d7605 100644 +--- a/src/modules/lokker/lokker.c ++++ b/src/modules/lokker/lokker.c +@@ -518,14 +518,14 @@ _lokker_cb_exit(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) + + _auth_child_pid = -1; + /* ok */ +- if (ev->exit_code == 0) ++ if (ev->exited && (ev->exit_code == 0)) + { + /* security - null out passwd string once we are done with it */ + _lokker_null(); + e_desklock_hide(); + } + /* error */ +- else if (ev->exit_code < 128) ++ else if ((!ev->exited) || (ev->exit_code < 128)) + { + /* security - null out passwd string once we are done with it */ + _lokker_null(); +@@ -534,7 +534,7 @@ _lokker_cb_exit(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) + _("Authentication via PAM had errors setting up the<br>" + "authentication session. The error code was <hilight>%i</hilight>.<br>" + "This is bad and should not be happening. Please report this bug.") +- , ev->exit_code); ++ , ev->exited ? ev->exit_code : ev->exit_signal); + } + /* failed auth */ + else +diff --git a/src/modules/mixer/lib/backends/pulseaudio/pulse.c b/src/modules/mixer/lib/backends/pulseaudio/pulse.c +index 99d697270..3c9c96338 100644 +--- a/src/modules/mixer/lib/backends/pulseaudio/pulse.c ++++ b/src/modules/mixer/lib/backends/pulseaudio/pulse.c +@@ -329,7 +329,15 @@ _sink_input_cb(pa_context *c EINA_UNUSED, const pa_sink_input_info *info, + info->name); + + input->idx = info->index; +- input->base.name = eina_stringshare_add(info->name); ++ ++ Eina_Strbuf *input_name; ++ ++ input_name = eina_strbuf_new(); ++ eina_strbuf_append(input_name, pa_proplist_gets(info->proplist, PA_PROP_APPLICATION_NAME)); ++ eina_strbuf_append(input_name, ":"); ++ eina_strbuf_append(input_name, info->name); ++ input->base.name = eina_stringshare_add(eina_strbuf_string_get(input_name)); ++ eina_strbuf_free(input_name); + input->base.volume = _pa_cvolume_convert(&info->volume); + input->base.mute = !!info->mute; + EINA_LIST_FOREACH(ctx->sinks, l, s) +@@ -799,17 +807,11 @@ _pulse_connect(void *data) + } + #endif + c->context = pa_context_new_with_proplist(&(c->api), NULL, proplist); +- if (!c->context) ++ if (c->context) + { +- WRN("Could not create the pulseaudio context"); +- goto err; +- } +- +- pa_context_set_state_callback(c->context, _pulse_pa_state_cb, c); +- if (pa_context_connect(c->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) +- { +- WRN("Could not connect to pulse"); +- goto err; ++ pa_context_set_state_callback(c->context, _pulse_pa_state_cb, c); ++ if (pa_context_connect(c->context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) ++ ERR("Could not connect to pulse"); + } + #if !defined(EMIXER_BUILD) && defined(HAVE_WAYLAND) && !defined(HAVE_WAYLAND_ONLY) + if (e_comp->comp_type != E_PIXMAP_TYPE_X) +@@ -824,10 +826,6 @@ _pulse_connect(void *data) + + pa_proplist_free(proplist); + return ECORE_CALLBACK_DONE; +- +- err: +- pa_proplist_free(proplist); +- return ECORE_CALLBACK_RENEW; + } + + static void +diff --git a/src/modules/mixer/lib/backends/pulseaudio/pulse_ml.c b/src/modules/mixer/lib/backends/pulseaudio/pulse_ml.c +index 469aaca29..e4776fdc7 100644 +--- a/src/modules/mixer/lib/backends/pulseaudio/pulse_ml.c ++++ b/src/modules/mixer/lib/backends/pulseaudio/pulse_ml.c +@@ -18,6 +18,18 @@ + #define DBG(...) EINA_LOG_DBG(__VA_ARGS__) + #define WRN(...) EINA_LOG_WARN(__VA_ARGS__) + ++#define PULSEAUDIO_START \ ++ char *disp = NULL; \ ++ if (getenv("WAYLAND_DISPLAY")) \ ++ { \ ++ disp = eina_strdup(getenv("DISPLAY")); \ ++ unsetenv("DISPLAY"); \ ++ } ++ ++#define PULSEAUDIO_END \ ++ if (disp) setenv("DISPLAY", disp, 1); \ ++ free(disp) ++ + /* Ecore mainloop integration start */ + struct pa_io_event + { +@@ -71,9 +83,9 @@ _ecore_io_wrapper(void *data, Ecore_Fd_Handler *handler) + flags |= PA_IO_EVENT_OUTPUT; + if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR)) + flags |= PA_IO_EVENT_ERROR; +- ++PULSEAUDIO_START; + event->callback(event->mainloop, event, fd, flags, event->userdata); +- ++PULSEAUDIO_END; + return ECORE_CALLBACK_RENEW; + } + +@@ -133,8 +145,9 @@ _ecore_time_wrapper(void *data) + { + pa_time_event *event = (pa_time_event *)data; + ++PULSEAUDIO_START; + event->callback(event->mainloop, event, &event->tv, event->userdata); +- ++PULSEAUDIO_END; + return ECORE_CALLBACK_CANCEL; + } + +@@ -231,10 +244,10 @@ Eina_Bool + _ecore_defer_wrapper(void *data) + { + pa_defer_event *event = (pa_defer_event *)data; +- ++PULSEAUDIO_START; + event->idler = NULL; + event->callback(event->mainloop, event, event->userdata); +- ++PULSEAUDIO_END; + return ECORE_CALLBACK_CANCEL; + } + +diff --git a/src/modules/time/clock.c b/src/modules/time/clock.c +index c52d2b6a7..99f3618ce 100644 +--- a/src/modules/time/clock.c ++++ b/src/modules/time/clock.c +@@ -199,6 +199,8 @@ _clock_timer(void *d EINA_UNUSED) + seconds |= inst->cfg->show_seconds; + sec = time_string_format(inst, buf, sizeof(buf)); + elm_object_part_text_set(inst->o_clock, "e.text", buf); ++ time_datestring_format(inst, buf, sizeof(buf) - 1); ++ elm_object_part_text_set(inst->o_clock, "e.text.sub", buf); + _eval_instance_size(inst); + } + sec = seconds ? 1 : (61 - sec); +@@ -520,3 +522,14 @@ time_config_update(Config_Item *ci) + E_FREE_FUNC(clock_timer, ecore_timer_del); + e_config_save_queue(); + } ++ ++EINTERN void ++clock_timer_set(Eina_Bool set) ++{ ++ if (set) ++ { ++ if (clock_instances) _clock_timer(NULL); ++ } ++ else ++ E_FREE_FUNC(clock_timer, ecore_timer_del); ++} +diff --git a/src/modules/time/clock.h b/src/modules/time/clock.h +index 912aa730a..0058eaf8e 100644 +--- a/src/modules/time/clock.h ++++ b/src/modules/time/clock.h +@@ -86,6 +86,7 @@ EINTERN void digital_clock_wizard(E_Gadget_Wizard_End_Cb cb, void *data); + EINTERN void analog_clock_wizard(E_Gadget_Wizard_End_Cb cb, void *data); + EINTERN void clock_popup_new(Instance *inst); + EINTERN void time_config_update(Config_Item *ci); ++EINTERN void clock_timer_set(Eina_Bool set); + + extern Config *time_config; + extern Eina_List *clock_instances; +diff --git a/src/modules/time/time.c b/src/modules/time/time.c +index b3f93d628..224416e48 100644 +--- a/src/modules/time/time.c ++++ b/src/modules/time/time.c +@@ -6,7 +6,7 @@ + static Eio_Monitor *clock_te_monitor = NULL; + static Eio_Monitor *clock_tz2_monitor = NULL; + static Eio_Monitor *clock_tzetc_monitor = NULL; +-static Eina_List *clock_eio_handlers = NULL; ++static Eina_List *handlers = NULL; + + static Ecore_Timer *update_today = NULL; + +@@ -22,14 +22,14 @@ static Ecore_Timer *update_today = NULL; + if (tzenv) \ + strncpy(prevtz, tzenv, sizeof(prevtz) - 1); \ + if (inst->cfg->timezone) \ +- setenv("TZ", inst->cfg->timezone, 1); \ ++ e_util_env_set("TZ", inst->cfg->timezone); \ + tzset() + + #define TZUNSET() \ + if (prevtz[0]) \ +- setenv("TZ", prevtz, 1); \ ++ e_util_env_set("TZ", prevtz); \ + else \ +- unsetenv("TZ"); \ ++ e_util_env_set("TZ", NULL); \ + tzset() + + static void +@@ -323,6 +323,20 @@ _clock_eio_error(void *d EINA_UNUSED, int type EINA_UNUSED, void *event) + return ECORE_CALLBACK_PASS_ON; + } + ++static Eina_Bool ++_clock_screensaver_on() ++{ ++ clock_timer_set(0); ++ return ECORE_CALLBACK_RENEW; ++} ++ ++static Eina_Bool ++_clock_screensaver_off() ++{ ++ clock_timer_set(1); ++ return ECORE_CALLBACK_RENEW; ++} ++ + EINTERN void + time_init(void) + { +@@ -333,14 +347,16 @@ time_init(void) + if (ecore_file_is_dir("/etc")) + clock_tzetc_monitor = eio_monitor_add("/etc"); + +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_ERROR, _clock_eio_error, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_FILE_CREATED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_FILE_MODIFIED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_FILE_DELETED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_SELF_DELETED, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, EIO_MONITOR_SELF_RENAME, _clock_eio_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, E_EVENT_SYS_RESUME, _clock_time_update, NULL); +- E_LIST_HANDLER_APPEND(clock_eio_handlers, ECORE_EVENT_SYSTEM_TIMEDATE_CHANGED, _clock_time_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_ERROR, _clock_eio_error, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_FILE_CREATED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_FILE_MODIFIED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_FILE_DELETED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_SELF_DELETED, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, EIO_MONITOR_SELF_RENAME, _clock_eio_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, E_EVENT_SYS_RESUME, _clock_time_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_SYSTEM_TIMEDATE_CHANGED, _clock_time_update, NULL); ++ E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_ON, _clock_screensaver_on, NULL); ++ E_LIST_HANDLER_APPEND(handlers, E_EVENT_SCREENSAVER_OFF, _clock_screensaver_off, NULL); + _update_today_timer(NULL); + } + +diff --git a/src/modules/wl_drm/e_mod_main.c b/src/modules/wl_drm/e_mod_main.c +index 0c80e8d40..602e10f9c 100644 +--- a/src/modules/wl_drm/e_mod_main.c ++++ b/src/modules/wl_drm/e_mod_main.c +@@ -56,19 +56,11 @@ _e_mod_drm_cb_activate(void *data EINA_UNUSED, int type EINA_UNUSED, void *event + + if (ev->active) + { +- E_Client *ec; +- + if (session_state) goto end; + session_state = EINA_TRUE; + + ecore_evas_show(e_comp->ee); +- E_CLIENT_FOREACH(ec) +- { +- if (ec->visible && (!ec->input_only)) +- e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h); +- } +- e_comp_render_queue(); +- e_comp_shape_queue_block(0); ++ evas_damage_rectangle_add(e_comp->evas, 0, 0, e_comp->w, e_comp->h); + ecore_event_add(E_EVENT_COMPOSITOR_ENABLE, NULL, NULL, NULL); + } + else +@@ -81,8 +73,6 @@ _e_mod_drm_cb_activate(void *data EINA_UNUSED, int type EINA_UNUSED, void *event + evas_font_cache_flush(e_comp->evas); + evas_render_dump(e_comp->evas); + +- e_comp_render_queue(); +- e_comp_shape_queue_block(1); + ecore_event_add(E_EVENT_COMPOSITOR_DISABLE, NULL, NULL, NULL); + } + +@@ -91,56 +81,10 @@ end: + } + + static Eina_Bool +-_e_mod_drm_cb_output(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) ++_e_mod_drm_cb_output(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED) + { +- const Eina_List *l; +- E_Randr2_Screen *screen; +- Eina_Bool connected = EINA_FALSE; +- int subpixel = 0; +-#ifdef HAVE_DRM2 +- Ecore_Drm2_Event_Output_Changed *e; +-#else +- Ecore_Drm_Event_Output *e; +-#endif +- +- if (!(e = event)) goto end; +- +- DBG("WL_DRM OUTPUT CHANGE"); +- +- EINA_LIST_FOREACH(e_randr2->screens, l, screen) +- { +- if ((!strcmp(screen->info.name, e->name)) && +- (!strcmp(screen->info.screen, e->model))) +- { +-#ifdef HAVE_DRM2 +- connected = e->enabled; +- subpixel = e->subpixel; +-#else +- connected = e->plug; +- subpixel = e->subpixel_order; +-#endif +- +- if (connected) +- { +- if (!e_comp_wl_output_init(screen->id, e->make, e->model, +- e->x, e->y, e->w, e->h, +- e->phys_width, e->phys_height, +- e->refresh, subpixel, +- e->transform)) +- { +- ERR("Could not setup new output: %s", screen->id); +- } +- } +- else +- e_comp_wl_output_remove(screen->id); +- +- break; +- } +- } +- +-end: + if (!e_randr2_cfg->ignore_hotplug_events) +- e_randr2_screen_refresh_queue(EINA_TRUE); ++ e_randr2_screen_refresh_queue(1); + + return ECORE_CALLBACK_PASS_ON; + } +@@ -678,8 +622,7 @@ _drm2_randr_apply(void) + if (s->config.priority > top_priority) + top_priority = s->config.priority; + +- ecore_drm2_output_mode_set(output, mode, +- s->config.geom.x, s->config.geom.y); ++ ecore_drm2_output_mode_set(output, mode, 0, 0); + + /* TODO: cannot support rotations until we support planes + * and we cannot support planes until Atomic support is in */ +diff --git a/src/modules/xwayland/dnd.c b/src/modules/xwayland/dnd.c +index 47c5d9569..2c0594d82 100644 +--- a/src/modules/xwayland/dnd.c ++++ b/src/modules/xwayland/dnd.c +@@ -143,6 +143,12 @@ _xwayland_send_send(E_Comp_Wl_Data_Source *source EINA_UNUSED, const char* mime_ + xconvertselection(ecore_x_display_get(), sel, type, xwl_dnd_atom, e_comp->cm_selection, 0); + } + ++static void ++_xwayland_send_cancelled(E_Comp_Wl_Data_Source *source) ++{ ++ e_comp_wl_clipboard_source_unref((void*)source); ++} ++ + static void + _xwayland_cancelled_send(E_Comp_Wl_Data_Source *source EINA_UNUSED) + { +@@ -155,16 +161,16 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even + { + if (ev->owner == e_comp->cm_selection) + { +- e_comp_wl->clipboard.xwl_owner = NULL; ++ e_comp_wl->clipboard.xwl_owner = 0; + return ECORE_CALLBACK_RENEW; + } + if (ev->atom == ECORE_X_ATOM_SELECTION_XDND) + { + if (ev->owner) + { +- int x, y, num; ++ int x, y, num, i; + unsigned char *data; +- const char **names = NULL; ++ char **names = NULL; + Eina_Array *namelist = NULL; + E_Comp_Wl_Data_Source *source; + +@@ -175,22 +181,22 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even + &data, + &num)) + { +- int i; + Ecore_X_Atom *types = (void*)data; + + names = malloc(num * sizeof(void*)); + namelist = eina_array_new(num); + for (i = 0; i < num; i++) + { +- const char *name; ++ char *name; + + if (types[i] == string_atom) + { +- name = names[i] = "UTF8_STRING"; ++ name = names[i] = strdup("UTF8_STRING"); + eina_array_push(namelist, eina_stringshare_add(WL_TEXT_STR)); + } + else + names[i] = name = ecore_x_atom_name_get(types[i]); ++ DBG("XWL TARGET: %s", name); + eina_array_push(namelist, eina_stringshare_add(name)); + } + if (num > 3) +@@ -203,7 +209,7 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even + } + evas_pointer_canvas_xy_get(e_comp->evas, &x, &y); + e_comp_wl->drag_client = e_pixmap_find_client(E_PIXMAP_TYPE_X, ev->owner); +- e_comp_wl->drag = e_drag_new(x, y, names, num, NULL, 0, NULL, _xwayland_drop); ++ e_comp_wl->drag = e_drag_new(x, y, (const char**)names, num, NULL, 0, NULL, _xwayland_drop); + e_comp_wl->drag->button_mask = evas_pointer_button_down_mask_get(e_comp->evas); + ecore_x_window_move_resize(e_comp->cm_selection, 0, 0, e_comp->w, e_comp->h); + ecore_x_window_show(e_comp->cm_selection); +@@ -212,12 +218,16 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even + e_comp_wl_data_device_send_enter(e_comp_wl->ptr.ec); + e_comp_canvas_feed_mouse_up(0); + source = e_comp_wl_data_manager_source_create(e_comp_wl->xwl_client, +- e_comp_wl->mgr.resource, 1); ++ e_comp_wl->mgr.resource, 0); ++ source->current_dnd_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY; ++ source->dnd_actions = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY; + e_comp_wl->drag_source = source; + source->target = _xwayland_target_send; + source->send = _xwayland_send_send; + source->cancelled = _xwayland_cancelled_send; + source->mime_types = namelist; ++ for (i = 0; i < num; i++) ++ free(names[i]); + free(names); + } + else +@@ -234,15 +244,20 @@ _xwl_fixes_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Even + { + if (ev->owner) + { +- if (e_comp_wl->clipboard.source) +- e_comp_wl_clipboard_source_unref(e_comp_wl->clipboard.source); ++ if (e_comp_wl->selection.data_source) ++ { ++ E_Comp_Wl_Data_Source *psource = e_comp_wl->selection.data_source; ++ if (psource->cancelled) ++ psource->cancelled(psource); ++ } + e_comp_wl->clipboard.source = NULL; +- e_comp_wl->clipboard.xwl_owner = ev->owner ? e_pixmap_find_client(E_PIXMAP_TYPE_X, ev->owner) : NULL; ++ e_comp_wl->selection.data_source = NULL; ++ e_comp_wl->clipboard.xwl_owner = ev->owner; + xconvertselection(ecore_x_display_get(), ECORE_X_ATOM_SELECTION_CLIPBOARD, + ECORE_X_ATOM_SELECTION_TARGETS, xwl_dnd_atom, e_comp->cm_selection, 0); + } + else +- e_comp_wl->clipboard.xwl_owner = NULL; ++ e_comp_wl->clipboard.xwl_owner = 0; + } + return ECORE_CALLBACK_RENEW; + } +@@ -270,16 +285,22 @@ _xwl_selection_notify(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Sele + + source = e_comp_wl_clipboard_source_create(NULL, 0, -1); + dsource = e_comp_wl_data_manager_source_create(e_comp_wl->xwl_client, +- e_comp_wl->mgr.resource, 1); ++ e_comp_wl->mgr.resource, 0); + source->data_source.mime_types = eina_array_new(tgs->num_targets); + for (i = 0; i < tgs->num_targets; i++) + if (tgs->targets[i]) +- eina_array_push(source->data_source.mime_types, eina_stringshare_add(tgs->targets[i])); ++ { ++ DBG("XWL TARGET: %s", tgs->targets[i]); ++ if (eina_streq(tgs->targets[i], "UTF8_STRING")) ++ eina_array_push(source->data_source.mime_types, eina_stringshare_add(WL_TEXT_STR)); ++ eina_array_push(source->data_source.mime_types, eina_stringshare_add(tgs->targets[i])); ++ } ++ + e_comp_wl->clipboard.source = source; + e_comp_wl->selection.data_source = &source->data_source; + source->data_source.resource = dsource->resource; + source->data_source.send = _xwayland_send_send; +- free(dsource); ++ source->data_source.cancelled = _xwayland_send_cancelled; + if (e_client_has_xwindow(e_client_focused_get())) + e_comp_wl_data_device_keyboard_focus_set(); + return ECORE_CALLBACK_RENEW; +@@ -380,7 +401,7 @@ _xwl_selection_request(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Sel + ecore_x_window_prop_property_set(ev->requestor, ev->property, int_atom, 32, (void*)×tamp, 1); + ecore_x_selection_notify_send(ev->requestor, ev->selection, ev->target, ev->property, 0); + } +- else ++ else if (ev->requestor != e_comp->cm_selection) + { + const char *name; + Pipe *p; +@@ -399,7 +420,7 @@ _xwl_selection_request(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Sel + p->fdh = ecore_main_fd_handler_add(fds[0], ECORE_FD_READ, _xwl_pipe_read, p, NULL, NULL); + p->win = ev->requestor; + p->source = source; +- wl_data_source_send_send(source->resource, type, dup(fds[1])); ++ wl_data_source_send_send(source->resource, type, fds[1]); + close(fds[1]); + p->atom = ev->target; + p->selection = ev->selection; +diff --git a/src/modules/xwayland/e_mod_main.c b/src/modules/xwayland/e_mod_main.c +index 793f2e151..89309c01e 100644 +--- a/src/modules/xwayland/e_mod_main.c ++++ b/src/modules/xwayland/e_mod_main.c +@@ -225,7 +225,7 @@ _cb_xserver_event(void *data EINA_UNUSED, Ecore_Fd_Handler *hdlr EINA_UNUSED) + snprintf(xserver, sizeof(xserver), "%s", XWAYLAND_BIN); + DBG("\tLaunching %s: %s", xserver, disp); + if (execl(xserver, xserver, disp, "-rootless", "-listen", abs_fd, +- "-listen", unx_fd, "-terminate", "-shm", ++ "-listen", unx_fd, "-terminate", + NULL) < 0) + { + ERR("Failed to exec %s: %m", XWAYLAND_BIN); +@@ -289,8 +289,10 @@ xinit(void *d, Ecore_Thread *eth) + + init_threads = dlsym(NULL, "XInitThreads"); + if (init_threads) init_threads(); ++ else ERR("Could not resolve XInitThreads"); + open_display = dlsym(NULL, "XOpenDisplay"); + if (open_display) disp = open_display(d); ++ else ERR("Could not resolve XOpenDisplay"); + free(d); + ecore_thread_feedback(eth, disp); + } _______________________________________________ Frugalware-git mailing list Frugalware-git@frugalware.org http://frugalware.org/mailman/listinfo/frugalware-git