summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <m.blumenkran@samsung.com>2013-10-03 14:31:44 +0100
committerMike Blumenkrantz <m.blumenkran@samsung.com>2013-10-28 13:23:33 +0000
commit7ecf5a295e5672c54029909bfedff9208fe62b7c (patch)
tree2cbe3afc8ad1bd58dc03c948bc06ae749006b4a6
parent424d8287265a4cb3ddb55ed5548c0179892fee49 (diff)
downloadenlightenment-7ecf5a295e5672c54029909bfedff9208fe62b7c.tar.gz
feature: allow desk flip animations to be handled completely externally
-rw-r--r--src/bin/e_desk.c108
-rw-r--r--src/bin/e_desk.h5
2 files changed, 70 insertions, 43 deletions
diff --git a/src/bin/e_desk.c b/src/bin/e_desk.c
index 4b7ebc3642..e44fa255db 100644
--- a/src/bin/e_desk.c
+++ b/src/bin/e_desk.c
@@ -16,6 +16,9 @@ static void _e_desk_hide_begin(E_Desk *desk, int dx, int dy);
static void _e_desk_event_desk_window_profile_change_free(void *data, void *ev);
static void _e_desk_window_profile_change_protocol_set(void);
+static E_Desk_Flip_Cb _e_desk_flip_cb = NULL;
+static void *_e_desk_flip_data = NULL;
+
static Eina_Bool nofocus = EINA_FALSE;
EAPI int E_EVENT_DESK_SHOW = 0;
@@ -624,6 +627,56 @@ e_desk_window_profile_update(void)
}
}
+EAPI void
+e_desk_flip_cb_set(E_Desk_Flip_Cb cb, const void *data)
+{
+ _e_desk_flip_cb = cb;
+ _e_desk_flip_data = (void*)data;
+}
+
+EAPI void
+e_desk_flip_end(E_Desk *desk)
+{
+ E_Event_Desk_After_Show *ev;
+ E_Client *ec;
+
+ ev = E_NEW(E_Event_Desk_After_Show, 1);
+ ev->desk = desk;
+ e_object_ref(E_OBJECT(ev->desk));
+ ecore_event_add(E_EVENT_DESK_AFTER_SHOW, ev,
+ _e_desk_event_desk_after_show_free, NULL);
+
+ e_comp_shape_queue(e_comp_get(desk));
+ if (!e_config->focus_last_focused_per_desktop) return;
+ if ((e_config->focus_policy == E_FOCUS_MOUSE) ||
+ (e_config->focus_policy == E_FOCUS_SLOPPY))
+ {
+ ec = e_client_focused_get();
+ /* only set focus/warp pointer if currently focused window
+ * is on same screen (user hasn't switched screens during transition)
+ */
+ if (ec && ec->desk && (ec->desk->zone != desk->zone))
+ return;
+ }
+ ec = e_desk_last_focused_focus(desk);
+ if ((e_config->focus_policy != E_FOCUS_MOUSE) && (!ec))
+ {
+ /* we didn't previously have a focused window on this desk
+ * but we should, so this is probably the first time the
+ * user has flipped to this desk. let's be helpful and
+ * focus a random window!
+ */
+ E_CLIENT_REVERSE_FOREACH(e_comp_get(desk), ec)
+ {
+ /* start with top and go down... */
+ if (e_client_util_ignored_get(ec)) continue;
+ if (!e_client_util_desk_visible(ec, desk)) continue;
+ if (ec->iconic) continue;
+ evas_object_focus_set(ec->frame, 1);
+ }
+ }
+}
+
static void
_e_desk_free(E_Desk *desk)
{
@@ -703,47 +756,6 @@ _e_desk_transition_setup(E_Client *ec, int dx, int dy, int state)
}
static void
-_e_desk_show_end_serious(E_Desk *desk)
-{
- E_Event_Desk_After_Show *ev;
- E_Client *ec;
-
- ev = E_NEW(E_Event_Desk_After_Show, 1);
- ev->desk = desk;
- e_object_ref(E_OBJECT(ev->desk));
- ecore_event_add(E_EVENT_DESK_AFTER_SHOW, ev,
- _e_desk_event_desk_after_show_free, NULL);
-
- if (!e_config->focus_last_focused_per_desktop) return;
- if ((e_config->focus_policy == E_FOCUS_MOUSE) ||
- (e_config->focus_policy == E_FOCUS_SLOPPY))
- {
- ec = e_client_focused_get();
- /* only set focus/warp pointer if currently focused window
- * is on same screen (user hasn't switched screens during transition)
- */
- if (ec && ec->desk && (ec->desk->zone != desk->zone))
- return;
- }
- ec = e_desk_last_focused_focus(desk);
- if ((e_config->focus_policy != E_FOCUS_MOUSE) && (!ec))
- {
- /* we didn't previously have a focused window on this desk
- * but we should, so this is probably the first time the
- * user has flipped to this desk. let's be helpful and
- * focus a random window!
- */
- E_CLIENT_REVERSE_FOREACH(e_comp_get(desk), ec)
- {
- /* start with top and go down... */
- if (e_client_util_ignored_get(ec)) continue;
- if (!e_client_util_desk_visible(ec, desk)) continue;
- evas_object_focus_set(ec->frame, 1);
- }
- }
-}
-
-static void
_e_desk_show_end(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED)
{
E_Client *ec = data;
@@ -754,7 +766,7 @@ _e_desk_show_end(void *data, Evas_Object *obj EINA_UNUSED, const char *emission
ec->hidden = 0;
if (!ec->visible) evas_object_show(ec->frame);
if (ec->desk != e_desk_current_get(ec->zone)) return;
- if (!ec->desk->animate_count) _e_desk_show_end_serious(ec->desk);
+ if (!ec->desk->animate_count) e_desk_flip_end(ec->desk);
}
static void
@@ -778,6 +790,11 @@ _e_desk_show_begin(E_Desk *desk, int dx, int dy)
if (dy > 0) dy = 1;
desk->animate_count = 0;
+ if (_e_desk_flip_cb)
+ {
+ _e_desk_flip_cb(_e_desk_flip_data, desk, dx, dy, 1);
+ return;
+ }
E_CLIENT_FOREACH(desk->zone->comp, ec)
{
if ((ec->desk->zone != desk->zone) || (ec->iconic) || e_client_util_ignored_get(ec)) continue;
@@ -803,7 +820,7 @@ _e_desk_show_begin(E_Desk *desk, int dx, int dy)
evas_object_show(ec->frame);
}
if ((!e_config->desk_flip_animate_type) || (!desk->animate_count))
- _e_desk_show_end_serious(desk);
+ e_desk_flip_end(desk);
}
static void
@@ -817,6 +834,11 @@ _e_desk_hide_begin(E_Desk *desk, int dx, int dy)
if (dy > 0) dy = 1;
desk->animate_count = 0;
+ if (_e_desk_flip_cb)
+ {
+ _e_desk_flip_cb(_e_desk_flip_data, desk, dx, dy, 0);
+ return;
+ }
E_CLIENT_FOREACH(desk->zone->comp, ec)
{
if ((ec->desk->zone != desk->zone) || (ec->iconic) || e_client_util_ignored_get(ec)) continue;
diff --git a/src/bin/e_desk.h b/src/bin/e_desk.h
index 4d6985b465..29a90f2487 100644
--- a/src/bin/e_desk.h
+++ b/src/bin/e_desk.h
@@ -7,6 +7,8 @@ typedef struct _E_Event_Desk_After_Show E_Event_Desk_After_Show;
typedef struct _E_Event_Desk_Name_Change E_Event_Desk_Name_Change;
typedef struct _E_Event_Desk_Window_Profile_Change E_Event_Desk_Window_Profile_Change;
+typedef void (*E_Desk_Flip_Cb)(void *data, E_Desk *desk, int dx, int dy, Eina_Bool show);
+
#else
#ifndef E_DESK_H
#define E_DESK_H
@@ -87,6 +89,9 @@ EAPI void e_desk_window_profile_add(int manager, int zone, int desk_x, i
EAPI void e_desk_window_profile_del(int manager, int zone, int desk_x, int desk_y);
EAPI void e_desk_window_profile_update(void);
+EAPI void e_desk_flip_cb_set(E_Desk_Flip_Cb cb, const void *data);
+EAPI void e_desk_flip_end(E_Desk *desk);
+
extern EAPI int E_EVENT_DESK_SHOW;
extern EAPI int E_EVENT_DESK_BEFORE_SHOW;
extern EAPI int E_EVENT_DESK_AFTER_SHOW;