2010-01-04 04:27:15 -08:00
# include "e.h"
2013-01-09 03:34:07 -08:00
# include "e_comp.h"
# include "e_comp_cfdata.h"
# include "e_comp_update.h"
2012-01-31 08:36:07 -08:00
# ifdef HAVE_WAYLAND_CLIENTS
2013-01-09 03:34:07 -08:00
# include "e_comp_wl.h"
2012-01-20 10:40:39 -08:00
# endif
2010-01-04 04:27:15 -08:00
2012-12-07 20:14:05 -08:00
# define OVER_FLOW 1
2010-07-02 18:50:29 -07:00
2010-01-14 20:41:20 -08:00
//////////////////////////////////////////////////////////////////////////
//
2010-01-10 18:59:32 -08:00
// TODO (no specific order):
// 1. abstract evas object and compwin so we can duplicate the object N times
// in N canvases - for winlist, everything, pager etc. too
// 2. implement "unmapped composite cache" -> N pixels worth of unmapped
// windows to be fully composited. only the most active/recent.
// 3. for unmapped windows - when window goes out of unmapped comp cache
// make a miniature copy (1/4 width+height?) and set property on window
// with pixmap id
2010-04-12 01:28:51 -07:00
// 8. obey transparent property
2010-01-11 00:43:24 -08:00
// 9. shortcut lots of stuff to draw inside the compositor - shelf,
// wallpaper, efm - hell even menus and anything else in e (this is what
// e18 was mostly about)
2010-03-12 00:47:13 -08:00
// 10. fullscreen windows need to be able to bypass compositing *seems buggy*
2011-03-19 23:12:17 -07:00
//
2010-01-14 20:41:20 -08:00
//////////////////////////////////////////////////////////////////////////
2010-01-07 05:45:51 -08:00
2010-01-14 20:41:20 -08:00
struct _E_Comp
2010-01-06 06:18:47 -08:00
{
Ecore_X_Window win ;
Ecore_Evas * ee ;
Evas * evas ;
2012-08-26 08:36:05 -07:00
Evas_Object * layout ;
2012-08-27 02:22:26 -07:00
Eina_List * zones ;
2010-01-06 06:18:47 -08:00
E_Manager * man ;
Eina_Inlist * wins ;
2010-08-01 07:29:19 -07:00
Eina_List * wins_list ;
2010-01-06 22:29:53 -08:00
Eina_List * updates ;
Ecore_Animator * render_animator ;
2010-01-31 05:05:56 -08:00
Ecore_Job * update_job ;
2010-06-08 07:58:08 -07:00
Ecore_Timer * new_up_timer ;
2011-01-22 01:52:48 -08:00
Evas_Object * fps_bg ;
Evas_Object * fps_fg ;
2012-08-27 02:22:26 -07:00
Ecore_Job * screen_job ;
2012-09-20 06:40:19 -07:00
Ecore_Timer * nocomp_delay_timer ;
Ecore_Timer * nocomp_override_timer ;
Ecore_X_Window ee_win ;
2010-04-12 01:28:51 -07:00
int animating ;
2010-01-27 07:29:51 -08:00
int render_overflow ;
2011-01-22 01:52:48 -08:00
double frametimes [ 122 ] ;
int frameskip ;
2011-02-10 09:26:40 -08:00
2012-09-20 06:40:19 -07:00
int nocomp_override ;
2013-01-09 03:34:07 -08:00
2010-08-01 07:29:19 -07:00
E_Manager_Comp comp ;
2011-03-16 07:39:44 -07:00
Ecore_X_Window cm_selection ;
2011-03-19 23:12:17 -07:00
2010-01-24 03:05:18 -08:00
Eina_Bool gl : 1 ;
Eina_Bool grabbed : 1 ;
2010-03-04 05:33:33 -08:00
Eina_Bool nocomp : 1 ;
2012-09-20 06:40:19 -07:00
Eina_Bool nocomp_want : 1 ;
2010-08-01 07:29:19 -07:00
Eina_Bool wins_invalid : 1 ;
2012-08-26 08:36:05 -07:00
Eina_Bool saver : 1 ;
2010-01-06 06:18:47 -08:00
} ;
2012-08-27 02:22:26 -07:00
struct _E_Comp_Zone
{
E_Zone * zone ; // never deref - just use for handle cmp's
Evas_Object * base ;
Evas_Object * over ;
int container_num ;
int zone_num ;
int x , y , w , h ;
2012-12-08 22:27:42 -08:00
double bl ;
Eina_Bool bloff ;
2012-08-27 02:22:26 -07:00
} ;
2010-01-14 20:41:20 -08:00
struct _E_Comp_Win
2010-01-06 06:18:47 -08:00
{
EINA_INLIST ;
2011-02-10 09:26:40 -08:00
2011-03-19 23:12:17 -07:00
E_Comp * c ; // parent compositor
Ecore_X_Window win ; // raw window - for menus etc.
E_Border * bd ; // if its a border - later
E_Popup * pop ; // if its a popup - later
E_Menu * menu ; // if it is a menu - later
int x , y , w , h ; // geometry
struct
{
2011-03-19 23:51:13 -07:00
int x , y , w , h ; // hidden geometry (used when its unmapped and re-instated on map)
2010-04-07 23:01:40 -07:00
} hidden ;
2011-03-19 23:12:17 -07:00
int pw , ph ; // pixmap w/h
int border ; // border width
Ecore_X_Pixmap pixmap ; // the compositing pixmap
Ecore_X_Damage damage ; // damage region
Ecore_X_Visual vis ; // window visual
2012-09-21 01:35:24 -07:00
Ecore_X_Colormap cmap ; // colormap of window
2011-03-19 23:12:17 -07:00
int depth ; // window depth
Evas_Object * obj ; // composite object
Evas_Object * shobj ; // shadow object
Eina_List * obj_mirror ; // extra mirror objects
Ecore_X_Image * xim ; // x image - software fallback
E_Update * up ; // update handler
E_Object_Delfn * dfn ; // delete function handle for objects being tracked
Ecore_X_Sync_Counter counter ; // sync counter for syncronised drawing
Ecore_Timer * update_timeout ; // max time between damage and "done" event
Ecore_Timer * ready_timeout ; // max time on show (new window draw) to wait for window contents to be ready if sync protocol not handled. this is fallback.
int dmg_updates ; // num of damage event updates since a redirect
Ecore_X_Rectangle * rects ; // shape rects... if shaped :(
int rects_num ; // num rects above
Ecore_X_Pixmap cache_pixmap ; // the cached pixmap (1/nth the dimensions)
int cache_w , cache_h ; // cached pixmap size
int update_count ; // how many updates have happened to this win
double last_visible_time ; // last time window was visible
double last_draw_time ; // last time window was damaged
int pending_count ; // pending event count
2012-06-28 00:03:44 -07:00
2011-03-31 01:14:18 -07:00
unsigned int opacity ; // opacity set with _NET_WM_WINDOW_OPACITY
2011-03-19 23:12:17 -07:00
char * title , * name , * clas , * role ; // fetched for override-redirect windowa
Ecore_X_Window_Type primary_type ; // fetched for override-redirect windowa
2011-03-31 01:14:18 -07:00
unsigned char misses ; // number of sync misses
2011-10-22 14:15:40 -07:00
2011-03-19 23:12:17 -07:00
Eina_Bool delete_pending : 1 ; // delete pendig
Eina_Bool hidden_override : 1 ; // hidden override
Eina_Bool animating : 1 ; // it's busy animating - defer hides/dels
Eina_Bool force : 1 ; // force del/hide even if animating
2012-10-25 06:47:20 -07:00
Eina_Bool defer_show : 1 ; // stupid gtk apps hide windows twice, ticket #1558
2011-03-19 23:12:17 -07:00
Eina_Bool defer_hide : 1 ; // flag to get hide to work on deferred hide
Eina_Bool delete_me : 1 ; // delete me!
Eina_Bool visible : 1 ; // is visible
Eina_Bool input_only : 1 ; // is input_only
2012-06-28 00:03:44 -07:00
2011-03-19 23:12:17 -07:00
Eina_Bool override : 1 ; // is override-redirect
Eina_Bool argb : 1 ; // is argb
Eina_Bool shaped : 1 ; // is shaped
Eina_Bool update : 1 ; // has updates to fetch
Eina_Bool redirected : 1 ; // has updates to fetch
Eina_Bool shape_changed : 1 ; // shape changed
Eina_Bool native : 1 ; // native
Eina_Bool drawme : 1 ; // drawme flag fo syncing rendering
2012-06-28 00:03:44 -07:00
2011-03-19 23:12:17 -07:00
Eina_Bool invalid : 1 ; // invalid depth used - just use as marker
Eina_Bool nocomp : 1 ; // nocomp applied
2012-09-20 06:40:19 -07:00
Eina_Bool nocomp_need_update : 1 ; // nocomp in effect, but this window updated while in nocomp mode
2011-03-19 23:12:17 -07:00
Eina_Bool needpix : 1 ; // need new pixmap
Eina_Bool needxim : 1 ; // need new xim
Eina_Bool real_hid : 1 ; // last hide was a real window unmap
Eina_Bool inhash : 1 ; // is in the windows hash
Eina_Bool show_ready : 1 ; // is this window ready for its first show
2013-01-09 03:34:07 -08:00
2012-06-28 00:03:44 -07:00
Eina_Bool show_anim : 1 ; // ran show animation
2010-01-06 06:18:47 -08:00
} ;
static Eina_List * handlers = NULL ;
static Eina_List * compositors = NULL ;
static Eina_Hash * windows = NULL ;
2010-02-01 06:15:14 -08:00
static Eina_Hash * borders = NULL ;
2010-01-06 06:18:47 -08:00
static Eina_Hash * damages = NULL ;
2013-01-09 03:34:07 -08:00
static E_Comp_Config * conf = NULL ;
static E_Config_DD * conf_edd = NULL ;
static E_Config_DD * conf_match_edd = NULL ;
2013-01-11 00:20:14 -08:00
static Eina_Inlist * cfg_opts = NULL ;
2010-01-07 05:45:51 -08:00
//////////////////////////////////////////////////////////////////////////
2012-06-15 00:02:44 -07:00
# undef DBG
2010-02-10 23:41:02 -08:00
#if 0
2011-03-19 23:12:17 -07:00
# define DBG(f, x ...) printf(f, ##x)
2010-01-08 18:45:50 -08:00
# else
2011-03-19 23:12:17 -07:00
# define DBG(f, x ...)
2010-01-08 18:45:50 -08:00
# endif
2013-01-09 03:34:07 -08:00
static void _e_comp_win_ready_timeout_setup ( E_Comp_Win * cw ) ;
static void _e_comp_render_queue ( E_Comp * c ) ;
static void _e_comp_win_damage ( E_Comp_Win * cw ,
int x , int y , int w , int h ,
Eina_Bool dmg ) ;
static void _e_comp_win_render_queue ( E_Comp_Win * cw ) ;
static void _e_comp_win_release ( E_Comp_Win * cw ) ;
static void _e_comp_win_adopt ( E_Comp_Win * cw ) ;
static void _e_comp_win_del ( E_Comp_Win * cw ) ;
static void _e_comp_win_show ( E_Comp_Win * cw ) ;
static void _e_comp_win_real_hide ( E_Comp_Win * cw ) ;
static void _e_comp_win_hide ( E_Comp_Win * cw ) ;
static void _e_comp_win_configure ( E_Comp_Win * cw ,
int x , int y , int w , int h ,
int border ) ;
2010-01-06 06:18:47 -08:00
2011-10-22 14:15:40 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_child_show ( E_Comp_Win * cw )
2011-10-22 14:15:40 -07:00
{
evas_object_show ( cw - > shobj ) ;
if ( cw - > bd )
{
Eina_List * l ;
E_Border * tmp ;
EINA_LIST_FOREACH ( cw - > bd - > client . e . state . video_child , l , tmp )
{
E_Comp_Win * tcw ;
tcw = eina_hash_find ( borders , e_util_winid_str_get ( tmp - > client . win ) ) ;
2012-06-28 00:03:44 -07:00
if ( ! tcw ) continue ;
2011-10-22 14:15:40 -07:00
evas_object_show ( tcw - > shobj ) ;
}
}
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_child_hide ( E_Comp_Win * cw )
2011-10-22 14:15:40 -07:00
{
evas_object_hide ( cw - > shobj ) ;
if ( cw - > bd )
{
Eina_List * l ;
E_Border * tmp ;
EINA_LIST_FOREACH ( cw - > bd - > client . e . state . video_child , l , tmp )
{
E_Comp_Win * tcw ;
tcw = eina_hash_find ( borders , e_util_winid_str_get ( tmp - > client . win ) ) ;
2012-06-28 00:03:44 -07:00
if ( ! tcw ) continue ;
2011-10-22 14:15:40 -07:00
evas_object_hide ( tcw - > shobj ) ;
}
}
}
2010-08-01 07:29:19 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_cb_pending_after ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2010-08-01 07:29:19 -07:00
{
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
cw - > pending_count - - ;
if ( ! cw - > delete_pending ) return ;
if ( cw - > pending_count = = 0 )
{
free ( cw ) ;
}
}
2010-03-04 05:33:33 -08:00
static E_Comp_Win *
2013-01-09 03:34:07 -08:00
_e_comp_fullscreen_check ( E_Comp * c )
2010-01-06 22:29:53 -08:00
{
2010-03-04 05:33:33 -08:00
E_Comp_Win * cw ;
2011-02-10 09:26:40 -08:00
2010-03-04 05:33:33 -08:00
if ( ! c - > wins ) return NULL ;
EINA_INLIST_REVERSE_FOREACH ( c - > wins , cw )
2011-03-19 23:51:13 -07:00
{
if ( ( ! cw - > visible ) | | ( cw - > input_only ) | | ( cw - > invalid ) )
continue ;
if ( ( cw - > x = = 0 ) & & ( cw - > y = = 0 ) & &
( ( cw - > x + cw - > w ) > = c - > man - > w ) & &
( ( cw - > y + cw - > h ) > = c - > man - > h ) & &
( ! cw - > argb ) & & ( ! cw - > shaped )
2013-01-09 03:34:07 -08:00
)
2011-03-19 23:51:13 -07:00
{
return cw ;
}
return NULL ;
}
2010-03-04 05:33:33 -08:00
return NULL ;
}
2010-02-17 18:48:39 -08:00
2010-03-04 05:33:33 -08:00
static inline Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_shaped_check ( int w ,
int h ,
const Ecore_X_Rectangle * rects ,
int num )
2010-03-04 05:33:33 -08:00
{
if ( ( ! rects ) | | ( num < 1 ) ) return EINA_FALSE ;
if ( num > 1 ) return EINA_TRUE ;
if ( ( rects [ 0 ] . x = = 0 ) & & ( rects [ 0 ] . y = = 0 ) & &
2011-10-16 08:35:53 -07:00
( ( int ) rects [ 0 ] . width = = w ) & & ( ( int ) rects [ 0 ] . height = = h ) )
2010-03-04 05:33:33 -08:00
return EINA_FALSE ;
2010-02-17 18:48:39 -08:00
return EINA_TRUE ;
}
static inline Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_win_shaped_check ( const E_Comp_Win * cw ,
const Ecore_X_Rectangle * rects ,
int num )
2010-02-17 18:48:39 -08:00
{
2013-01-09 03:34:07 -08:00
return _e_comp_shaped_check ( cw - > w , cw - > h , rects , num ) ;
2010-02-17 18:48:39 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_shape_rectangles_apply ( E_Comp_Win * cw ,
const Ecore_X_Rectangle * rects ,
int num )
2010-02-17 18:48:39 -08:00
{
2010-08-02 23:10:33 -07:00
Eina_List * l ;
Evas_Object * o ;
2010-02-17 18:48:39 -08:00
int i ;
DBG ( " SHAPE [0x%x] change, rects=%p (%d) \n " , cw - > win , rects , num ) ;
2013-01-09 03:34:07 -08:00
if ( ! _e_comp_win_shaped_check ( cw , rects , num ) )
2010-02-21 07:52:19 -08:00
{
rects = NULL ;
}
2010-01-14 20:41:20 -08:00
if ( rects )
{
unsigned int * pix , * p ;
unsigned char * spix , * sp ;
int w , h , px , py ;
2011-02-10 09:26:40 -08:00
2010-01-14 20:41:20 -08:00
evas_object_image_size_get ( cw - > obj , & w , & h ) ;
if ( ( w > 0 ) & & ( h > 0 ) )
2010-01-07 05:45:51 -08:00
{
2011-03-19 23:12:17 -07:00
if ( cw - > native )
{
2012-09-20 06:40:19 -07:00
fprintf ( stderr , " BUGGER: shape with native surface? cw=%p \n " , cw ) ;
2011-03-19 23:12:17 -07:00
return ;
}
2010-02-17 18:48:39 -08:00
2010-02-21 07:52:19 -08:00
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
evas_object_image_alpha_set ( cw - > obj , 1 ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , NULL ) ;
evas_object_image_alpha_set ( o , 1 ) ;
}
2010-01-14 20:41:20 -08:00
pix = evas_object_image_data_get ( cw - > obj , 1 ) ;
2010-02-16 19:38:57 -08:00
if ( pix )
2010-01-08 18:45:50 -08:00
{
2010-02-16 19:38:57 -08:00
spix = calloc ( w * h , sizeof ( unsigned char ) ) ;
if ( spix )
2010-01-07 06:01:35 -08:00
{
2010-02-16 19:38:57 -08:00
DBG ( " SHAPE [0x%x] rects %i \n " , cw - > win , num ) ;
for ( i = 0 ; i < num ; i + + )
2010-01-10 18:47:59 -08:00
{
2010-02-16 19:38:57 -08:00
int rx , ry , rw , rh ;
2011-02-10 09:26:40 -08:00
2010-02-16 19:38:57 -08:00
rx = rects [ i ] . x ; ry = rects [ i ] . y ;
rw = rects [ i ] . width ; rh = rects [ i ] . height ;
E_RECTS_CLIP_TO_RECT ( rx , ry , rw , rh , 0 , 0 , w , h ) ;
sp = spix + ( w * ry ) + rx ;
for ( py = 0 ; py < rh ; py + + )
2010-01-10 18:47:59 -08:00
{
2010-02-16 19:38:57 -08:00
for ( px = 0 ; px < rw ; px + + )
{
* sp = 0xff ; sp + + ;
}
sp + = w - rw ;
2010-01-10 18:47:59 -08:00
}
2010-01-08 18:45:50 -08:00
}
2010-02-16 19:38:57 -08:00
sp = spix ;
p = pix ;
for ( py = 0 ; py < h ; py + + )
2010-01-14 20:41:20 -08:00
{
2010-02-16 19:38:57 -08:00
for ( px = 0 ; px < w ; px + + )
{
unsigned int mask , imask ;
2011-02-10 09:26:40 -08:00
2010-02-16 19:38:57 -08:00
mask = ( ( unsigned int ) ( * sp ) ) < < 24 ;
imask = mask > > 8 ;
imask | = imask > > 8 ;
imask | = imask > > 8 ;
* p = mask | ( * p & imask ) ;
2013-01-09 03:34:07 -08:00
// if (*sp) *p = 0xff000000 | *p;
// else *p = 0x00000000;
2010-02-16 19:38:57 -08:00
sp + + ;
p + + ;
}
2010-01-14 20:41:20 -08:00
}
2010-02-16 19:38:57 -08:00
free ( spix ) ;
2010-01-14 20:41:20 -08:00
}
2010-02-16 19:38:57 -08:00
evas_object_image_data_set ( cw - > obj , pix ) ;
evas_object_image_data_update_add ( cw - > obj , 0 , 0 , w , h ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_data_set ( o , pix ) ;
evas_object_image_data_update_add ( o , 0 , 0 , w , h ) ;
}
2010-01-14 20:41:20 -08:00
}
}
}
else
{
2010-02-18 03:46:15 -08:00
if ( cw - > shaped )
{
unsigned int * pix , * p ;
int w , h , px , py ;
2011-02-10 09:26:40 -08:00
2010-02-18 03:46:15 -08:00
evas_object_image_size_get ( cw - > obj , & w , & h ) ;
if ( ( w > 0 ) & & ( h > 0 ) )
{
if ( cw - > native )
{
fprintf ( stderr , " BUGGER: shape with native surface? cw=%p \n " , cw ) ;
return ;
}
2010-02-21 07:52:19 -08:00
evas_object_image_alpha_set ( cw - > obj , 0 ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_alpha_set ( o , 1 ) ;
}
2010-02-18 03:46:15 -08:00
pix = evas_object_image_data_get ( cw - > obj , 1 ) ;
if ( pix )
{
p = pix ;
for ( py = 0 ; py < h ; py + + )
{
for ( px = 0 ; px < w ; px + + )
* p | = 0xff000000 ;
}
}
evas_object_image_data_set ( cw - > obj , pix ) ;
evas_object_image_data_update_add ( cw - > obj , 0 , 0 , w , h ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_data_set ( o , pix ) ;
evas_object_image_data_update_add ( o , 0 , 0 , w , h ) ;
}
2010-02-18 03:46:15 -08:00
}
}
2011-03-19 23:12:17 -07:00
// dont need to fix alpha chanel as blending
2010-01-14 20:41:20 -08:00
// should be totally off here regardless of
2010-04-07 23:01:40 -07:00
// alpha channel content
2010-01-14 20:41:20 -08:00
}
}
2010-09-09 21:09:37 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_cb_win_show_ready_timeout ( void * data )
2010-09-09 21:09:37 -07:00
{
E_Comp_Win * cw = data ;
cw - > show_ready = 1 ;
if ( cw - > visible )
{
2012-06-28 00:03:44 -07:00
if ( ! cw - > update )
{
if ( cw - > update_timeout )
{
ecore_timer_del ( cw - > update_timeout ) ;
cw - > update_timeout = NULL ;
}
cw - > update = 1 ;
cw - > c - > updates = eina_list_append ( cw - > c - > updates , cw ) ;
}
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-09-09 21:09:37 -07:00
}
cw - > ready_timeout = NULL ;
return ECORE_CALLBACK_CANCEL ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_ready_timeout_setup ( E_Comp_Win * cw )
2010-09-09 21:09:37 -07:00
{
if ( cw - > ready_timeout )
{
ecore_timer_del ( cw - > ready_timeout ) ;
cw - > ready_timeout = NULL ;
}
if ( cw - > show_ready ) return ;
if ( cw - > counter ) return ;
2013-01-09 03:34:07 -08:00
// FIXME: make show_ready option
2010-09-09 21:09:37 -07:00
if ( 0 )
{
cw - > show_ready = 1 ;
}
else
{
cw - > ready_timeout = ecore_timer_add
2013-01-09 03:34:07 -08:00
( conf - > first_draw_delay , _e_comp_cb_win_show_ready_timeout , cw ) ;
2010-09-09 21:09:37 -07:00
}
}
2012-08-27 02:22:26 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_layout_populate ( E_Comp_Win * cw )
2012-08-27 02:22:26 -07:00
{
e_layout_pack ( cw - > c - > layout , cw - > shobj ) ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_restack ( E_Comp_Win * cw )
2012-08-27 02:22:26 -07:00
{
Eina_Inlist * prev , * next ;
Eina_List * l ;
E_Comp_Win * cwp = NULL , * cwn = NULL ;
2013-01-09 03:34:07 -08:00
2012-08-27 02:22:26 -07:00
next = EINA_INLIST_GET ( cw ) - > next ;
if ( next ) cwn = EINA_INLIST_CONTAINER_GET ( next , E_Comp_Win ) ;
prev = EINA_INLIST_GET ( cw ) - > prev ;
if ( prev ) cwp = EINA_INLIST_CONTAINER_GET ( prev , E_Comp_Win ) ;
2013-01-09 03:34:07 -08:00
2012-08-27 02:22:26 -07:00
if ( cwp )
e_layout_child_raise_above ( cw - > shobj , cwp - > shobj ) ;
else if ( cwn )
e_layout_child_raise_above ( cw - > shobj , cwn - > shobj ) ;
if ( cw - > bd )
{
E_Border * tmp ;
EINA_LIST_FOREACH ( cw - > bd - > client . e . state . video_child , l , tmp )
{
E_Comp_Win * tcw ;
tcw = eina_hash_find ( borders ,
e_util_winid_str_get ( tmp - > client . win ) ) ;
if ( ! tcw ) continue ;
e_layout_child_lower_below ( tcw - > shobj , cw - > shobj ) ;
}
}
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_geometry_update ( E_Comp_Win * cw )
2012-08-27 02:22:26 -07:00
{
e_layout_child_move ( cw - > shobj , cw - > x , cw - > y ) ;
e_layout_child_resize ( cw - > shobj , cw - > pw , cw - > ph ) ;
}
2010-01-14 20:41:20 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_update ( E_Comp_Win * cw )
2010-01-14 20:41:20 -08:00
{
2010-08-02 23:10:33 -07:00
Eina_List * l ;
Evas_Object * o ;
2010-01-14 20:41:20 -08:00
E_Update_Rect * r ;
2010-02-21 07:52:19 -08:00
int i ;
2010-04-07 23:01:40 -07:00
int pshaped = cw - > shaped ;
2010-02-24 21:12:49 -08:00
2010-06-08 07:58:08 -07:00
DBG ( " UPDATE [0x%x] pm = %x \n " , cw - > win , cw - > pixmap ) ;
2013-01-09 03:34:07 -08:00
if ( conf - > grab ) ecore_x_grab ( ) ;
2010-01-14 20:41:20 -08:00
cw - > update = 0 ;
2011-02-10 09:26:40 -08:00
2010-02-21 07:52:19 -08:00
if ( cw - > argb )
{
if ( cw - > rects )
{
free ( cw - > rects ) ;
cw - > rects = NULL ;
cw - > rects_num = 0 ;
}
}
else
{
if ( cw - > shape_changed )
{
2010-02-21 08:15:59 -08:00
if ( cw - > rects )
{
free ( cw - > rects ) ;
cw - > rects = NULL ;
cw - > rects_num = 0 ;
}
2010-02-21 07:52:19 -08:00
ecore_x_pixmap_geometry_get ( cw - > win , NULL , NULL , & ( cw - > w ) , & ( cw - > h ) ) ;
cw - > rects = ecore_x_window_shape_rectangles_get ( cw - > win , & ( cw - > rects_num ) ) ;
if ( cw - > rects )
{
for ( i = 0 ; i < cw - > rects_num ; i + + )
{
2012-06-28 00:03:44 -07:00
E_RECTS_CLIP_TO_RECT ( cw - > rects [ i ] . x ,
cw - > rects [ i ] . y ,
cw - > rects [ i ] . width ,
cw - > rects [ i ] . height ,
0 , 0 , ( int ) cw - > w , ( int ) cw - > h ) ;
2010-02-21 07:52:19 -08:00
}
}
2013-01-09 03:34:07 -08:00
if ( ! _e_comp_win_shaped_check ( cw , cw - > rects , cw - > rects_num ) )
2010-02-21 07:52:19 -08:00
{
2012-12-21 13:31:13 -08:00
E_FREE ( cw - > rects ) ;
2010-02-21 07:52:19 -08:00
cw - > rects_num = 0 ;
}
if ( ( cw - > rects ) & & ( ! cw - > shaped ) )
{
cw - > shaped = 1 ;
}
else if ( ( ! cw - > rects ) & & ( cw - > shaped ) )
{
cw - > shaped = 0 ;
}
}
}
2012-09-20 06:40:19 -07:00
if ( ( ( ! cw - > pixmap ) | | ( cw - > needpix ) ) & &
( ! cw - > real_hid ) & & ( ! cw - > nocomp ) & & ( ! cw - > c - > nocomp ) )
2010-01-14 20:41:20 -08:00
{
2012-01-28 14:52:47 -08:00
Ecore_X_Pixmap pm = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
/* #ifdef HAVE_WAYLAND_CLIENTS */
/* if ((cw->bd) && (cw->bd->borderless)) */
/* pm = e_comp_wl_pixmap_get(cw->win); */
/* #endif */
2012-01-28 14:52:47 -08:00
if ( ! pm ) pm = ecore_x_composite_name_window_pixmap_get ( cw - > win ) ;
2010-08-25 03:21:27 -07:00
if ( pm )
2010-01-14 20:41:20 -08:00
{
2010-08-25 03:21:27 -07:00
Ecore_X_Pixmap oldpm ;
2011-02-10 09:26:40 -08:00
2010-08-25 03:21:27 -07:00
cw - > needpix = 0 ;
if ( cw - > xim ) cw - > needxim = 1 ;
oldpm = cw - > pixmap ;
cw - > pixmap = pm ;
if ( cw - > pixmap )
2010-09-09 21:09:37 -07:00
{
ecore_x_pixmap_geometry_get ( cw - > pixmap , NULL , NULL , & ( cw - > pw ) , & ( cw - > ph ) ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_ready_timeout_setup ( cw ) ;
2011-03-31 01:14:18 -07:00
if ( ( cw - > pw > 0 ) & & ( cw - > ph > 0 ) )
2013-01-09 03:34:07 -08:00
_e_comp_win_geometry_update ( cw ) ;
2010-09-09 21:09:37 -07:00
}
2010-08-25 03:21:27 -07:00
else
2010-08-02 23:10:33 -07:00
{
2010-08-25 03:21:27 -07:00
cw - > pw = 0 ;
cw - > ph = 0 ;
}
DBG ( " REND [0x%x] pixmap = [0x%x], %ix%i \n " , cw - > win , cw - > pixmap , cw - > pw , cw - > ph ) ;
if ( ( cw - > pw < = 0 ) | | ( cw - > ph < = 0 ) )
{
if ( cw - > native )
2010-08-02 23:10:33 -07:00
{
2010-08-25 03:21:27 -07:00
DBG ( " [0x%x] free native \n " , cw - > win ) ;
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
cw - > native = 0 ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , NULL ) ;
}
2010-08-02 23:10:33 -07:00
}
2010-08-25 03:21:27 -07:00
if ( cw - > pixmap )
{
DBG ( " [0x%x] free pixmap \n " , cw - > win ) ;
ecore_x_pixmap_free ( cw - > pixmap ) ;
cw - > pixmap = 0 ;
2013-01-09 03:34:07 -08:00
// cw->show_ready = 0; // hmm maybe not needed?
2010-08-25 03:21:27 -07:00
}
cw - > pw = 0 ;
cw - > ph = 0 ;
2010-01-23 05:50:26 -08:00
}
2010-08-25 03:21:27 -07:00
ecore_x_e_comp_pixmap_set ( cw - > win , cw - > pixmap ) ;
cw - > native = 0 ;
DBG ( " [0x%x] up resize %ix%i \n " , cw - > win , cw - > pw , cw - > ph ) ;
2013-01-09 03:34:07 -08:00
e_comp_update_resize ( cw - > up , cw - > pw , cw - > ph ) ;
e_comp_update_add ( cw - > up , 0 , 0 , cw - > pw , cw - > ph ) ;
2010-08-25 03:21:27 -07:00
if ( oldpm )
2010-02-10 00:09:03 -08:00
{
2010-08-25 03:21:27 -07:00
DBG ( " [0x%x] free pm %x \n " , cw - > win , oldpm ) ;
2012-09-20 06:40:19 -07:00
// XXX the below is unreachable code! :)
2013-01-09 03:34:07 -08:00
/*
if ( cw - > native )
{
cw - > native = 0 ;
if ( ! ( ( cw - > pw > 0 ) & & ( cw - > ph > 0 ) ) )
{
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , NULL ) ;
}
}
}
*/
2010-08-25 03:21:27 -07:00
ecore_x_pixmap_free ( oldpm ) ;
2010-02-10 00:09:03 -08:00
}
2010-01-14 20:41:20 -08:00
}
}
2010-02-10 06:13:29 -08:00
if ( ! ( ( cw - > pw > 0 ) & & ( cw - > ph > 0 ) ) )
{
2013-01-09 03:34:07 -08:00
if ( conf - > grab ) ecore_x_ungrab ( ) ;
2010-02-10 06:13:29 -08:00
return ;
}
2010-01-14 20:41:20 -08:00
2013-01-09 03:34:07 -08:00
// evas_object_move(cw->shobj, cw->x, cw->y);
2010-08-30 06:52:22 -07:00
// was cw->w / cw->h
2013-01-09 03:34:07 -08:00
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
_e_comp_win_geometry_update ( cw ) ;
2010-02-17 18:48:39 -08:00
2013-01-09 03:34:07 -08:00
if ( ( cw - > c - > gl ) & & ( conf - > texture_from_pixmap ) & &
2012-09-20 06:40:19 -07:00
( ! cw - > shaped ) & & ( ! cw - > rects ) & & ( cw - > pixmap ) )
2010-01-14 20:41:20 -08:00
{
2013-01-09 03:34:07 -08:00
/* #ifdef HAVE_WAYLAND_CLIENTS */
/* DBG("DEBUG - pm now %x\n", e_comp_wl_pixmap_get(cw->win)); */
/* #endif */
2012-01-28 14:52:47 -08:00
/* DBG("DEBUG - pm now %x\n", ecore_x_composite_name_window_pixmap_get(cw->win)); */
2010-01-23 05:50:26 -08:00
evas_object_image_size_set ( cw - > obj , cw - > pw , cw - > ph ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_size_set ( o , cw - > pw , cw - > ph ) ;
}
2010-01-23 05:50:26 -08:00
if ( ! cw - > native )
{
Evas_Native_Surface ns ;
2011-02-10 09:26:40 -08:00
2010-12-05 23:09:51 -08:00
ns . version = EVAS_NATIVE_SURFACE_VERSION ;
ns . type = EVAS_NATIVE_SURFACE_X11 ;
2010-01-23 05:50:26 -08:00
ns . data . x11 . visual = cw - > vis ;
ns . data . x11 . pixmap = cw - > pixmap ;
evas_object_image_native_surface_set ( cw - > obj , & ns ) ;
2010-02-06 02:52:09 -08:00
DBG ( " NATIVE [0x%x] %x %ix%i \n " , cw - > win , cw - > pixmap , cw - > pw , cw - > ph ) ;
cw - > native = 1 ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , & ns ) ;
}
2010-01-23 05:50:26 -08:00
}
2013-01-09 03:34:07 -08:00
r = e_comp_update_rects_get ( cw - > up ) ;
2011-03-19 23:12:17 -07:00
if ( r )
2010-01-14 20:41:20 -08:00
{
2013-01-09 03:34:07 -08:00
e_comp_update_clear ( cw - > up ) ;
2010-01-14 20:41:20 -08:00
for ( i = 0 ; r [ i ] . w > 0 ; i + + )
{
int x , y , w , h ;
2011-02-10 09:26:40 -08:00
2010-01-14 20:41:20 -08:00
x = r [ i ] . x ; y = r [ i ] . y ;
w = r [ i ] . w ; h = r [ i ] . h ;
2010-02-10 06:13:29 -08:00
DBG ( " UPDATE [0x%x] pm [0x%x] %i %i %ix%i \n " , cw - > win , cw - > pixmap , x , y , w , h ) ;
2010-01-14 20:41:20 -08:00
evas_object_image_data_update_add ( cw - > obj , x , y , w , h ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_data_update_add ( o , x , y , w , h ) ;
}
2010-01-08 18:45:50 -08:00
}
2010-01-21 00:44:41 -08:00
free ( r ) ;
}
else
2010-09-09 21:09:37 -07:00
{
2011-08-01 18:02:14 -07:00
DBG ( " UPDATE [0x%x] NO RECTS!!! %i %i - %i %i \n " , cw - > win , cw - > up - > w , cw - > up - > h , cw - > up - > tw , cw - > up - > th ) ;
2013-01-09 03:34:07 -08:00
// cw->update = 1;
2010-09-09 21:09:37 -07:00
}
2010-01-21 00:44:41 -08:00
}
2012-09-20 06:40:19 -07:00
else if ( cw - > pixmap )
2010-01-21 00:44:41 -08:00
{
2010-08-25 03:21:27 -07:00
if ( cw - > native )
2010-08-02 23:10:33 -07:00
{
2010-08-25 03:21:27 -07:00
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , NULL ) ;
}
cw - > native = 0 ;
}
if ( cw - > needxim )
{
cw - > needxim = 0 ;
if ( cw - > xim )
{
evas_object_image_size_set ( cw - > obj , 1 , 1 ) ;
evas_object_image_data_set ( cw - > obj , NULL ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_size_set ( o , 1 , 1 ) ;
evas_object_image_data_set ( o , NULL ) ;
}
ecore_x_image_free ( cw - > xim ) ;
cw - > xim = NULL ;
}
2010-08-02 23:10:33 -07:00
}
2010-01-21 00:44:41 -08:00
if ( ! cw - > xim )
{
2010-08-19 14:19:24 -07:00
if ( ( cw - > xim = ecore_x_image_new ( cw - > pw , cw - > ph , cw - > vis , cw - > depth ) ) )
2013-01-09 03:34:07 -08:00
e_comp_update_add ( cw - > up , 0 , 0 , cw - > pw , cw - > ph ) ;
2010-01-21 00:44:41 -08:00
}
2013-01-09 03:34:07 -08:00
r = e_comp_update_rects_get ( cw - > up ) ;
2011-03-19 23:12:17 -07:00
if ( r )
2010-01-21 00:44:41 -08:00
{
if ( cw - > xim )
2010-01-08 18:45:50 -08:00
{
2012-09-21 01:35:24 -07:00
if ( ecore_x_image_is_argb32_get ( cw - > xim ) )
2010-08-02 23:10:33 -07:00
{
2012-09-21 01:35:24 -07:00
unsigned int * pix ;
2013-01-09 03:34:07 -08:00
2012-09-21 01:35:24 -07:00
pix = ecore_x_image_data_get ( cw - > xim , NULL , NULL , NULL ) ;
evas_object_image_data_set ( cw - > obj , pix ) ;
evas_object_image_size_set ( cw - > obj , cw - > pw , cw - > ph ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_data_set ( o , pix ) ;
evas_object_image_size_set ( o , cw - > pw , cw - > ph ) ;
}
2013-01-09 03:34:07 -08:00
e_comp_update_clear ( cw - > up ) ;
2012-09-21 01:35:24 -07:00
for ( i = 0 ; r [ i ] . w > 0 ; i + + )
{
int x , y , w , h ;
2013-01-09 03:34:07 -08:00
2012-09-21 01:35:24 -07:00
x = r [ i ] . x ; y = r [ i ] . y ;
w = r [ i ] . w ; h = r [ i ] . h ;
if ( ! ecore_x_image_get ( cw - > xim , cw - > pixmap , x , y , x , y , w , h ) )
{
DBG ( " UPDATE [0x%x] %i %i %ix%i FAIL!!!!!!!!!!!!!!!!! \n " , cw - > win , x , y , w , h ) ;
2013-01-09 03:34:07 -08:00
e_comp_update_add ( cw - > up , x , y , w , h ) ;
2012-09-21 01:35:24 -07:00
cw - > update = 1 ;
}
else
{
// why do we neeed these 2? this smells wrong
pix = ecore_x_image_data_get ( cw - > xim , NULL , NULL , NULL ) ;
DBG ( " UPDATE [0x%x] %i %i %ix%i -- pix = %p \n " , cw - > win , x , y , w , h , pix ) ;
evas_object_image_data_set ( cw - > obj , pix ) ;
evas_object_image_data_update_add ( cw - > obj , x , y , w , h ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_data_set ( o , pix ) ;
evas_object_image_data_update_add ( o , x , y , w , h ) ;
}
}
}
2010-08-02 23:10:33 -07:00
}
2012-09-21 01:35:24 -07:00
else
2010-01-21 00:44:41 -08:00
{
2012-09-21 01:35:24 -07:00
unsigned int * pix ;
int stride ;
2013-01-09 03:34:07 -08:00
2012-09-21 01:35:24 -07:00
evas_object_image_size_set ( cw - > obj , cw - > pw , cw - > ph ) ;
pix = evas_object_image_data_get ( cw - > obj , EINA_TRUE ) ;
stride = evas_object_image_stride_get ( cw - > obj ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
2010-02-10 23:07:58 -08:00
{
2012-09-21 01:35:24 -07:00
evas_object_image_data_set ( o , pix ) ;
evas_object_image_size_set ( o , cw - > pw , cw - > ph ) ;
2010-02-10 23:07:58 -08:00
}
2013-01-09 03:34:07 -08:00
e_comp_update_clear ( cw - > up ) ;
2012-09-21 01:35:24 -07:00
for ( i = 0 ; r [ i ] . w > 0 ; i + + )
2010-02-10 23:40:44 -08:00
{
2012-09-21 01:35:24 -07:00
int x , y , w , h ;
2013-01-09 03:34:07 -08:00
2012-09-21 01:35:24 -07:00
x = r [ i ] . x ; y = r [ i ] . y ;
w = r [ i ] . w ; h = r [ i ] . h ;
if ( ! ecore_x_image_get ( cw - > xim , cw - > pixmap , x , y , x , y , w , h ) )
{
DBG ( " UPDATE [0x%x] %i %i %ix%i FAIL!!!!!!!!!!!!!!!!! \n " , cw - > win , x , y , w , h ) ;
2013-01-09 03:34:07 -08:00
e_comp_update_add ( cw - > up , x , y , w , h ) ;
2012-09-21 01:35:24 -07:00
cw - > update = 1 ;
}
else
2012-06-28 00:03:44 -07:00
{
2012-09-21 01:35:24 -07:00
unsigned int * srcpix ;
int srcbpp = 0 , srcbpl = 0 ;
// why do we neeed these 2? this smells wrong
srcpix = ecore_x_image_data_get
2013-01-09 03:34:07 -08:00
( cw - > xim , & srcbpl , NULL , & srcbpp ) ;
2012-09-21 01:35:24 -07:00
ecore_x_image_to_argb_convert ( srcpix ,
srcbpp ,
srcbpl ,
cw - > cmap ,
cw - > vis ,
x , y , w , h ,
pix ,
stride ,
x , y ) ;
DBG ( " UPDATE [0x%x] %i %i %ix%i -- pix = %p \n " , cw - > win , x , y , w , h , pix ) ;
evas_object_image_data_update_add ( cw - > obj , x , y , w , h ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_data_update_add ( o , x , y , w , h ) ;
}
2012-06-28 00:03:44 -07:00
}
2010-02-10 23:40:44 -08:00
}
2012-09-21 01:35:24 -07:00
evas_object_image_data_set ( cw - > obj , pix ) ;
2010-01-21 00:44:41 -08:00
}
2010-01-07 05:45:51 -08:00
}
2010-01-21 00:44:41 -08:00
free ( r ) ;
2010-02-21 07:52:19 -08:00
if ( cw - > shaped )
{
2013-01-09 03:34:07 -08:00
_e_comp_win_shape_rectangles_apply ( cw , cw - > rects , cw - > rects_num ) ;
2010-02-21 07:52:19 -08:00
}
else
{
if ( cw - > shape_changed )
2013-01-09 03:34:07 -08:00
_e_comp_win_shape_rectangles_apply ( cw , cw - > rects , cw - > rects_num ) ;
2010-02-21 07:52:19 -08:00
}
cw - > shape_changed = 0 ;
2010-01-07 05:45:51 -08:00
}
2010-01-21 00:44:41 -08:00
else
2010-06-08 07:58:08 -07:00
{
DBG ( " UPDATE [0x%x] NO RECTS!!! %i %i - %i %i \n " , cw - > win , cw - > up - > w , cw - > up - > h , cw - > up - > tw , cw - > up - > th ) ;
2013-01-09 03:34:07 -08:00
// causes updates to be flagged when not needed - disabled
// cw->update = 1;
2010-06-08 07:58:08 -07:00
}
2010-01-14 20:41:20 -08:00
}
2013-01-09 03:34:07 -08:00
// FIXME: below cw update check screws with show
2011-03-19 23:12:17 -07:00
if ( /*(!cw->update) &&*/ ( cw - > visible ) & & ( cw - > dmg_updates > = 1 ) & &
2013-01-09 03:34:07 -08:00
( cw - > show_ready ) & & ( ! cw - > bd | | cw - > bd - > visible ) )
2010-02-11 00:05:19 -08:00
{
2011-03-19 23:12:17 -07:00
if ( ! evas_object_visible_get ( cw - > shobj ) )
2010-02-11 00:05:19 -08:00
{
2012-06-28 00:03:44 -07:00
if ( ! cw - > hidden_override )
{
2013-01-09 03:34:07 -08:00
_e_comp_child_show ( cw ) ;
_e_comp_win_render_queue ( cw ) ;
2012-06-28 00:03:44 -07:00
}
if ( ! cw - > show_anim )
{
edje_object_signal_emit ( cw - > shobj , " e,state,visible,on " , " e " ) ;
if ( ! cw - > animating )
{
cw - > c - > animating + + ;
}
cw - > animating = 1 ;
cw - > pending_count + + ;
e_manager_comp_event_src_visibility_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2012-06-28 00:03:44 -07:00
cw - > show_anim = EINA_TRUE ;
}
}
2010-02-11 00:05:19 -08:00
}
2010-04-07 23:01:40 -07:00
if ( ( cw - > shobj ) & & ( cw - > obj ) )
2010-01-14 20:41:20 -08:00
{
2010-04-07 23:01:40 -07:00
if ( pshaped ! = cw - > shaped )
{
if ( cw - > shaped )
2011-03-19 23:12:17 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,shadow,off " , " e " ) ;
else
2010-04-07 23:01:40 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,shadow,on " , " e " ) ;
}
2010-01-14 20:41:20 -08:00
}
2010-02-17 18:48:39 -08:00
2013-01-09 03:34:07 -08:00
if ( conf - > grab ) ecore_x_ungrab ( ) ;
2010-01-14 20:41:20 -08:00
}
2010-01-24 03:05:18 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_pre_swap ( void * data ,
Evas * e __UNUSED__ )
2010-01-24 03:05:18 -08:00
{
E_Comp * c = data ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
if ( conf - > grab )
2010-02-01 06:38:00 -08:00
{
if ( c - > grabbed )
{
ecore_x_ungrab ( ) ;
c - > grabbed = 0 ;
}
}
2010-01-24 03:05:18 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_cb_delayed_update_timer ( void * data )
2010-06-08 07:58:08 -07:00
{
E_Comp * c = data ;
2013-01-09 03:34:07 -08:00
_e_comp_render_queue ( c ) ;
2010-06-08 07:58:08 -07:00
c - > new_up_timer = NULL ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_CANCEL ;
2010-06-08 07:58:08 -07:00
}
2011-01-22 01:52:48 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_fps_update ( E_Comp * c )
2011-01-22 01:52:48 -08:00
{
2013-01-09 03:34:07 -08:00
if ( conf - > fps_show )
2011-01-22 01:52:48 -08:00
{
if ( ! c - > fps_bg )
{
c - > fps_bg = evas_object_rectangle_add ( c - > evas ) ;
evas_object_color_set ( c - > fps_bg , 0 , 0 , 0 , 128 ) ;
2011-01-22 08:32:26 -08:00
evas_object_layer_set ( c - > fps_bg , EVAS_LAYER_MAX ) ;
2011-01-22 01:52:48 -08:00
evas_object_show ( c - > fps_bg ) ;
2011-02-10 09:26:40 -08:00
2011-01-22 01:52:48 -08:00
c - > fps_fg = evas_object_text_add ( c - > evas ) ;
evas_object_text_font_set ( c - > fps_fg , " Sans " , 10 ) ;
evas_object_text_text_set ( c - > fps_fg , " ??? " ) ;
evas_object_color_set ( c - > fps_fg , 255 , 255 , 255 , 255 ) ;
2011-01-22 08:32:26 -08:00
evas_object_layer_set ( c - > fps_fg , EVAS_LAYER_MAX ) ;
2011-01-22 01:52:48 -08:00
evas_object_show ( c - > fps_fg ) ;
}
}
else
{
if ( c - > fps_fg )
{
evas_object_del ( c - > fps_fg ) ;
c - > fps_fg = NULL ;
}
if ( c - > fps_bg )
{
evas_object_del ( c - > fps_bg ) ;
c - > fps_bg = NULL ;
}
}
}
2012-09-20 06:40:19 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_release ( E_Comp_Win * cw )
2010-01-14 20:41:20 -08:00
{
2010-08-02 23:10:33 -07:00
Eina_List * l ;
Evas_Object * o ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( cw - > xim )
{
evas_object_image_size_set ( cw - > obj , 1 , 1 ) ;
evas_object_image_data_set ( cw - > obj , NULL ) ;
ecore_x_image_free ( cw - > xim ) ;
cw - > xim = NULL ;
}
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
cw - > native = 0 ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
if ( cw - > xim )
{
evas_object_image_size_set ( o , 1 , 1 ) ;
evas_object_image_data_set ( o , NULL ) ;
}
evas_object_image_native_surface_set ( o , NULL ) ;
}
if ( cw - > pixmap )
{
ecore_x_pixmap_free ( cw - > pixmap ) ;
cw - > pixmap = 0 ;
cw - > pw = 0 ;
cw - > ph = 0 ;
ecore_x_e_comp_pixmap_set ( cw - > win , cw - > pixmap ) ;
2012-11-14 01:40:30 -08:00
//cw->show_ready = 0; // hmm maybe not needed?
2012-09-20 06:40:19 -07:00
}
if ( cw - > redirected )
{
2013-01-09 03:34:07 -08:00
// we redirect all subwindows anyway
// ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
2012-09-20 06:40:19 -07:00
cw - > redirected = 0 ;
}
if ( cw - > damage )
{
Ecore_X_Region parts ;
eina_hash_del ( damages , e_util_winid_str_get ( cw - > damage ) , cw ) ;
parts = ecore_x_region_new ( NULL , 0 ) ;
ecore_x_damage_subtract ( cw - > damage , 0 , parts ) ;
ecore_x_region_free ( parts ) ;
ecore_x_damage_free ( cw - > damage ) ;
cw - > damage = 0 ;
}
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_adopt ( E_Comp_Win * cw )
2012-09-20 06:40:19 -07:00
{
if ( ! cw - > damage )
{
cw - > damage = ecore_x_damage_new
2013-01-09 03:34:07 -08:00
( cw - > win , ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES ) ;
2012-09-20 06:40:19 -07:00
eina_hash_add ( damages , e_util_winid_str_get ( cw - > damage ) , cw ) ;
}
if ( ! cw - > update )
{
cw - > update = 1 ;
cw - > c - > updates = eina_list_append ( cw - > c - > updates , cw ) ;
}
cw - > redirected = 1 ;
2013-01-09 03:34:07 -08:00
e_comp_update_resize ( cw - > up , cw - > pw , cw - > ph ) ;
e_comp_update_add ( cw - > up , 0 , 0 , cw - > pw , cw - > ph ) ;
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
_e_comp_win_render_queue ( cw ) ;
2012-09-20 06:40:19 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_cb_nocomp_begin ( E_Comp * c )
2012-09-20 06:40:19 -07:00
{
E_Comp_Win * cw , * cwf ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( c - > nocomp ) return ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( c - > nocomp_delay_timer )
{
ecore_timer_del ( c - > nocomp_delay_timer ) ;
c - > nocomp_delay_timer = NULL ;
}
2013-01-09 03:34:07 -08:00
cwf = _e_comp_fullscreen_check ( c ) ;
2012-09-20 06:40:19 -07:00
if ( ! cwf ) return ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
EINA_INLIST_FOREACH ( c - > wins , cw )
{
2013-01-09 03:34:07 -08:00
_e_comp_win_release ( cw ) ;
2012-09-20 06:40:19 -07:00
}
cw = cwf ;
fprintf ( stderr , " NOCOMP win %x shobj %p \n " , cw - > win , cw - > shobj ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_release ( cw ) ;
2012-09-20 06:40:19 -07:00
ecore_x_composite_unredirect_subwindows
2013-01-09 03:34:07 -08:00
( c - > man - > root , ECORE_X_COMPOSITE_UPDATE_MANUAL ) ;
2012-09-20 06:40:19 -07:00
c - > nocomp = 1 ;
c - > render_overflow = OVER_FLOW ;
ecore_x_window_hide ( c - > win ) ;
ecore_evas_manual_render_set ( c - > ee , EINA_TRUE ) ;
ecore_evas_resize ( c - > ee , 1 , 1 ) ;
edje_file_cache_flush ( ) ;
edje_collection_cache_flush ( ) ;
evas_image_cache_flush ( c - > evas ) ;
evas_font_cache_flush ( c - > evas ) ;
evas_render_dump ( c - > evas ) ;
cw - > nocomp = 1 ;
if ( cw - > redirected )
{
2013-01-09 03:34:07 -08:00
// ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
2012-09-20 06:40:19 -07:00
cw - > redirected = 0 ;
}
if ( cw - > update_timeout )
{
ecore_timer_del ( cw - > update_timeout ) ;
cw - > update_timeout = NULL ;
}
if ( cw - > update )
{
cw - > update = 0 ;
cw - > c - > updates = eina_list_remove ( cw - > c - > updates , cw ) ;
}
if ( cw - > counter )
{
if ( cw - > bd )
ecore_x_e_comp_sync_cancel_send ( cw - > bd - > client . win ) ;
else
ecore_x_e_comp_sync_cancel_send ( cw - > win ) ;
ecore_x_sync_counter_inc ( cw - > counter , 1 ) ;
}
DBG ( " JOB2... \n " ) ;
2013-01-09 03:34:07 -08:00
_e_comp_render_queue ( c ) ;
2012-09-20 06:40:19 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_cb_nocomp_end ( E_Comp * c )
2012-09-20 06:40:19 -07:00
{
E_Comp_Win * cw ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( ! c - > nocomp ) return ;
ecore_x_composite_redirect_subwindows
2013-01-09 03:34:07 -08:00
( c - > man - > root , ECORE_X_COMPOSITE_UPDATE_MANUAL ) ;
2012-09-20 06:40:19 -07:00
fprintf ( stderr , " COMP! \n " ) ;
c - > nocomp = 0 ;
c - > render_overflow = OVER_FLOW ;
2013-01-09 03:34:07 -08:00
// ecore_evas_manual_render_set(c->ee, conf->lock_fps);
2012-09-20 06:40:19 -07:00
ecore_evas_manual_render_set ( c - > ee , EINA_FALSE ) ;
ecore_evas_resize ( c - > ee , c - > man - > w , c - > man - > h ) ;
ecore_x_window_show ( c - > win ) ;
EINA_INLIST_FOREACH ( c - > wins , cw )
{
if ( ! cw - > nocomp )
{
if ( ( cw - > input_only ) | | ( cw - > invalid ) | | ( cw - > real_hid ) ) continue ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( cw - > nocomp_need_update )
{
cw - > nocomp_need_update = EINA_FALSE ;
2013-01-09 03:34:07 -08:00
e_comp_update_resize ( cw - > up , cw - > pw , cw - > ph ) ;
e_comp_update_add ( cw - > up , 0 , 0 , cw - > pw , cw - > ph ) ;
2012-09-20 06:40:19 -07:00
}
2013-01-09 03:34:07 -08:00
_e_comp_win_adopt ( cw ) ;
2012-09-20 06:40:19 -07:00
continue ;
}
cw - > nocomp = 0 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_adopt ( cw ) ;
2012-09-20 06:40:19 -07:00
fprintf ( stderr , " restore comp %x --- %p \n " , cw - > win , cw - > shobj ) ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( cw - > visible )
{
2013-01-09 03:34:07 -08:00
if ( ! cw - > hidden_override ) _e_comp_child_show ( cw ) ;
2012-09-20 06:40:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_visibility_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2012-09-20 06:40:19 -07:00
// no need for effect
}
if ( cw - > counter )
{
if ( cw - > bd )
ecore_x_e_comp_sync_begin_send ( cw - > bd - > client . win ) ;
else
ecore_x_e_comp_sync_begin_send ( cw - > win ) ;
}
}
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_cb_nocomp_begin_timeout ( void * data )
2012-09-20 06:40:19 -07:00
{
E_Comp * c = data ;
c - > nocomp_delay_timer = NULL ;
if ( c - > nocomp_override = = 0 )
{
2013-01-09 03:34:07 -08:00
if ( _e_comp_fullscreen_check ( c ) ) c - > nocomp_want = 1 ;
_e_comp_cb_nocomp_begin ( c ) ;
2012-09-20 06:40:19 -07:00
}
return EINA_FALSE ;
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_cb_update ( E_Comp * c )
2012-09-20 06:40:19 -07:00
{
2010-01-14 20:41:20 -08:00
E_Comp_Win * cw ;
Eina_List * new_updates = NULL ; // for failed pixmap fetches - get them next frame
2010-02-01 06:15:14 -08:00
Eina_List * update_done = NULL ;
2013-01-09 03:34:07 -08:00
// static int doframeinfo = -1;
2010-02-01 06:38:00 -08:00
2012-07-04 05:01:12 -07:00
if ( ! c ) return EINA_FALSE ;
2010-03-04 05:33:33 -08:00
c - > update_job = NULL ;
2010-06-08 07:58:08 -07:00
DBG ( " UPDATE ALL \n " ) ;
2010-03-04 05:33:33 -08:00
if ( c - > nocomp ) goto nocomp ;
2013-01-09 03:34:07 -08:00
if ( conf - > grab )
2010-02-01 06:38:00 -08:00
{
ecore_x_grab ( ) ;
ecore_x_sync ( ) ;
c - > grabbed = 1 ;
}
2010-01-14 20:41:20 -08:00
EINA_LIST_FREE ( c - > updates , cw )
{
2013-01-09 03:34:07 -08:00
if ( conf - > efl_sync )
2010-02-01 06:15:14 -08:00
{
if ( ( ( cw - > counter ) & & ( cw - > drawme ) ) | | ( ! cw - > counter ) )
{
2013-01-09 03:34:07 -08:00
_e_comp_win_update ( cw ) ;
2010-02-01 06:15:14 -08:00
if ( cw - > drawme )
2011-03-31 01:14:18 -07:00
{
update_done = eina_list_append ( update_done , cw ) ;
cw - > drawme = 0 ;
}
2010-02-01 06:15:14 -08:00
}
else
cw - > update = 0 ;
}
else
2013-01-09 03:34:07 -08:00
_e_comp_win_update ( cw ) ;
2010-01-14 20:41:20 -08:00
if ( cw - > update )
2011-03-31 01:14:18 -07:00
{
new_updates = eina_list_append ( new_updates , cw ) ;
}
2010-01-06 22:29:53 -08:00
}
2013-01-09 03:34:07 -08:00
_e_comp_fps_update ( c ) ;
if ( conf - > fps_show )
2011-01-22 01:52:48 -08:00
{
char buf [ 128 ] ;
double fps = 0.0 , t , dt ;
int i ;
2011-01-22 03:00:11 -08:00
Evas_Coord x = 0 , y = 0 , w = 0 , h = 0 ;
2011-01-22 01:52:48 -08:00
E_Zone * z ;
2011-02-10 09:26:40 -08:00
2011-01-22 01:52:48 -08:00
t = ecore_time_get ( ) ;
2013-01-09 03:34:07 -08:00
if ( conf - > fps_average_range < 1 )
conf - > fps_average_range = 30 ;
else if ( conf - > fps_average_range > 120 )
conf - > fps_average_range = 120 ;
dt = t - c - > frametimes [ conf - > fps_average_range - 1 ] ;
if ( dt > 0.0 ) fps = ( double ) conf - > fps_average_range / dt ;
2011-01-22 01:52:48 -08:00
else fps = 0.0 ;
2011-01-22 03:00:11 -08:00
if ( fps > 0.0 ) snprintf ( buf , sizeof ( buf ) , " FPS: %1.1f " , fps ) ;
else snprintf ( buf , sizeof ( buf ) , " N/A " ) ;
2012-06-28 00:03:44 -07:00
for ( i = 121 ; i > = 1 ; i - - )
c - > frametimes [ i ] = c - > frametimes [ i - 1 ] ;
2011-01-22 01:52:48 -08:00
c - > frametimes [ 0 ] = t ;
c - > frameskip + + ;
2013-01-09 03:34:07 -08:00
if ( c - > frameskip > = conf - > fps_average_range )
2011-01-22 01:52:48 -08:00
{
c - > frameskip = 0 ;
evas_object_text_text_set ( c - > fps_fg , buf ) ;
}
evas_object_geometry_get ( c - > fps_fg , NULL , NULL , & w , & h ) ;
w + = 8 ;
2011-01-22 03:00:11 -08:00
h + = 8 ;
2011-01-22 01:52:48 -08:00
z = e_util_zone_current_get ( c - > man ) ;
if ( z )
{
2013-01-09 03:34:07 -08:00
switch ( conf - > fps_corner )
2011-01-22 01:52:48 -08:00
{
2011-01-22 03:00:11 -08:00
case 3 : // bottom-right
2013-01-09 03:34:07 -08:00
x = z - > x + z - > w - w ;
y = z - > y + z - > h - h ;
break ;
2011-03-19 23:12:17 -07:00
2011-01-22 03:00:11 -08:00
case 2 : // bottom-left
2013-01-09 03:34:07 -08:00
x = z - > x ;
y = z - > y + z - > h - h ;
break ;
2011-03-19 23:12:17 -07:00
2011-01-22 03:00:11 -08:00
case 1 : // top-right
2013-01-09 03:34:07 -08:00
x = z - > x + z - > w - w ;
y = z - > y ;
break ;
2011-03-19 23:12:17 -07:00
2011-01-22 03:00:11 -08:00
default : // 0 // top-left
2013-01-09 03:34:07 -08:00
x = z - > x ;
y = z - > y ;
break ;
2011-01-22 01:52:48 -08:00
}
}
2011-01-22 03:00:11 -08:00
evas_object_move ( c - > fps_bg , x , y ) ;
evas_object_resize ( c - > fps_bg , w , h ) ;
evas_object_move ( c - > fps_fg , x + 4 , y + 4 ) ;
2011-01-22 01:52:48 -08:00
}
2013-01-09 03:34:07 -08:00
if ( conf - > lock_fps )
2010-06-08 07:58:08 -07:00
{
DBG ( " MANUAL RENDER... \n " ) ;
2013-01-09 03:34:07 -08:00
// if (!c->nocomp) ecore_evas_manual_render(c->ee);
2010-06-08 07:58:08 -07:00
}
2013-01-09 03:34:07 -08:00
if ( conf - > efl_sync )
2011-03-19 23:12:17 -07:00
{
2010-02-01 06:15:14 -08:00
EINA_LIST_FREE ( update_done , cw )
{
ecore_x_sync_counter_inc ( cw - > counter , 1 ) ;
}
}
2013-01-09 03:34:07 -08:00
if ( conf - > grab )
2010-01-24 03:05:18 -08:00
{
2010-02-01 06:38:00 -08:00
if ( c - > grabbed )
{
c - > grabbed = 0 ;
ecore_x_ungrab ( ) ;
}
2010-01-24 03:05:18 -08:00
}
2010-06-08 07:58:08 -07:00
if ( new_updates )
{
DBG ( " JOB1... \n " ) ;
if ( c - > new_up_timer ) ecore_timer_del ( c - > new_up_timer ) ;
2011-03-19 23:12:17 -07:00
c - > new_up_timer =
2013-01-09 03:34:07 -08:00
ecore_timer_add ( 0.001 , _e_comp_cb_delayed_update_timer , c ) ;
// _e_comp_render_queue(c);
2010-06-08 07:58:08 -07:00
}
2010-01-08 18:45:50 -08:00
c - > updates = new_updates ;
2010-04-12 01:28:51 -07:00
if ( ! c - > animating ) c - > render_overflow - - ;
2013-01-09 03:34:07 -08:00
/*
if ( doframeinfo = = - 1 )
{
doframeinfo = 0 ;
if ( getenv ( " DFI " ) ) doframeinfo = 1 ;
}
if ( doframeinfo )
{
static double t0 = 0.0 ;
double td , t ;
t = ecore_time_get ( ) ;
td = t - t0 ;
if ( td > 0.0 )
{
int fps , i ;
fps = 1.0 / td ;
for ( i = 0 ; i < fps ; i + = 2 ) putchar ( ' = ' ) ;
printf ( " : %3.3f \n " , 1.0 / td ) ;
}
t0 = t ;
}
*/
2011-03-19 23:12:17 -07:00
nocomp :
2013-01-09 03:34:07 -08:00
cw = _e_comp_fullscreen_check ( c ) ;
2010-03-04 05:33:33 -08:00
if ( cw )
{
2013-01-09 03:34:07 -08:00
if ( conf - > nocomp_fs )
2010-03-04 05:33:33 -08:00
{
2012-09-20 06:40:19 -07:00
if ( ( ! c - > nocomp ) & & ( ! c - > nocomp_override > 0 ) )
2010-03-04 05:33:33 -08:00
{
2012-09-20 06:40:19 -07:00
if ( ! c - > nocomp_delay_timer )
c - > nocomp_delay_timer = ecore_timer_add
2013-01-09 03:34:07 -08:00
( 1.0 , _e_comp_cb_nocomp_begin_timeout , c ) ;
2010-03-04 05:33:33 -08:00
}
}
}
else
{
2012-09-20 06:40:19 -07:00
c - > nocomp_want = 0 ;
if ( c - > nocomp_delay_timer )
2010-03-04 05:33:33 -08:00
{
2012-09-20 06:40:19 -07:00
ecore_timer_del ( c - > nocomp_delay_timer ) ;
c - > nocomp_delay_timer = NULL ;
2010-03-04 05:33:33 -08:00
}
2012-09-20 06:40:19 -07:00
if ( c - > nocomp )
2013-01-09 03:34:07 -08:00
_e_comp_cb_nocomp_end ( c ) ;
2010-03-04 05:33:33 -08:00
}
2011-02-10 09:26:40 -08:00
2010-08-27 02:37:16 -07:00
DBG ( " UPDATE ALL DONE: overflow = %i \n " , c - > render_overflow ) ;
2010-06-08 07:58:08 -07:00
if ( c - > render_overflow < = 0 )
2010-01-27 07:29:51 -08:00
{
2010-06-08 07:58:08 -07:00
c - > render_overflow = 0 ;
2010-01-31 05:05:56 -08:00
if ( c - > render_animator ) c - > render_animator = NULL ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_CANCEL ;
2010-01-27 07:29:51 -08:00
}
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_RENEW ;
2010-01-06 22:29:53 -08:00
}
2010-01-31 05:05:56 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_cb_job ( void * data )
2010-01-31 05:05:56 -08:00
{
2010-06-08 07:58:08 -07:00
DBG ( " UPDATE ALL JOB... \n " ) ;
2013-01-09 03:34:07 -08:00
_e_comp_cb_update ( data ) ;
2010-01-31 05:05:56 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_cb_animator ( void * data )
2010-01-31 05:05:56 -08:00
{
2013-01-09 03:34:07 -08:00
return _e_comp_cb_update ( data ) ;
2010-01-31 05:05:56 -08:00
}
2010-01-06 22:29:53 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_render_queue ( E_Comp * c )
2010-01-06 22:29:53 -08:00
{
2011-09-21 06:47:15 -07:00
/* FIXME workaround */
if ( ! c ) return ;
2013-01-09 03:34:07 -08:00
if ( conf - > lock_fps )
2010-01-31 05:05:56 -08:00
{
if ( c - > render_animator )
{
2010-07-13 15:46:17 -07:00
c - > render_overflow = OVER_FLOW ;
2010-01-31 05:05:56 -08:00
return ;
}
2013-01-09 03:34:07 -08:00
c - > render_animator = ecore_animator_add ( _e_comp_cb_animator , c ) ;
2010-01-31 05:05:56 -08:00
}
else
2010-01-27 07:29:51 -08:00
{
2010-01-31 05:05:56 -08:00
if ( c - > update_job )
{
2010-06-08 07:58:08 -07:00
DBG ( " UPDATE JOB DEL... \n " ) ;
2010-01-31 05:05:56 -08:00
ecore_job_del ( c - > update_job ) ;
2010-03-04 05:33:33 -08:00
c - > update_job = NULL ;
2010-01-31 05:05:56 -08:00
c - > render_overflow = 0 ;
}
2010-06-08 07:58:08 -07:00
DBG ( " UPDATE JOB ADD... \n " ) ;
2013-01-09 03:34:07 -08:00
c - > update_job = ecore_job_add ( _e_comp_cb_job , c ) ;
2010-01-27 07:29:51 -08:00
}
2010-01-06 22:29:53 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( E_Comp_Win * cw )
2010-01-06 22:29:53 -08:00
{
2010-06-08 07:58:08 -07:00
DBG ( " JOB3... \n " ) ;
2013-01-09 03:34:07 -08:00
_e_comp_render_queue ( cw - > c ) ;
2010-01-06 22:29:53 -08:00
}
2010-01-14 20:41:20 -08:00
static E_Comp *
2013-01-09 03:34:07 -08:00
_e_comp_find ( Ecore_X_Window root )
2010-01-06 06:18:47 -08:00
{
Eina_List * l ;
2010-01-14 20:41:20 -08:00
E_Comp * c ;
2011-02-10 09:26:40 -08:00
2010-01-06 06:18:47 -08:00
// fixme: use hash if compositors list > 4
EINA_LIST_FOREACH ( compositors , l , c )
{
if ( c - > man - > root = = root ) return c ;
}
return NULL ;
}
2010-01-14 20:41:20 -08:00
static E_Comp_Win *
2013-01-09 03:34:07 -08:00
_e_comp_win_find ( Ecore_X_Window win )
2010-01-06 06:18:47 -08:00
{
2010-02-01 06:15:14 -08:00
return eina_hash_find ( windows , e_util_winid_str_get ( win ) ) ;
}
2010-01-06 06:18:47 -08:00
2010-02-01 06:15:14 -08:00
static E_Comp_Win *
2013-01-09 03:34:07 -08:00
_e_comp_border_client_find ( Ecore_X_Window win )
2010-02-01 06:15:14 -08:00
{
return eina_hash_find ( borders , e_util_winid_str_get ( win ) ) ;
2010-01-06 06:18:47 -08:00
}
2010-01-14 20:41:20 -08:00
static E_Comp_Win *
2013-01-09 03:34:07 -08:00
_e_comp_win_damage_find ( Ecore_X_Damage damage )
2010-01-06 06:18:47 -08:00
{
2010-02-01 06:15:14 -08:00
return eina_hash_find ( damages , e_util_winid_str_get ( damage ) ) ;
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_win_is_borderless ( E_Comp_Win * cw )
2010-02-01 06:15:14 -08:00
{
if ( ! cw - > bd ) return 1 ;
if ( ( cw - > bd - > client . border . name ) & &
( ! strcmp ( cw - > bd - > client . border . name , " borderless " ) ) )
return 1 ;
return 0 ;
2010-01-06 06:18:47 -08:00
}
2010-01-31 05:05:56 -08:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_win_do_shadow ( E_Comp_Win * cw )
2010-01-31 05:05:56 -08:00
{
if ( cw - > shaped ) return 0 ;
if ( cw - > argb )
{
2013-01-09 03:34:07 -08:00
if ( _e_comp_win_is_borderless ( cw ) ) return 0 ;
2010-01-31 05:05:56 -08:00
}
return 1 ;
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_win_damage_timeout ( void * data )
2010-02-01 06:15:14 -08:00
{
E_Comp_Win * cw = data ;
2011-02-10 09:26:40 -08:00
2010-02-01 06:15:14 -08:00
if ( ! cw - > update )
{
if ( cw - > update_timeout )
{
ecore_timer_del ( cw - > update_timeout ) ;
cw - > update_timeout = NULL ;
}
cw - > update = 1 ;
cw - > c - > updates = eina_list_append ( cw - > c - > updates , cw ) ;
}
cw - > drawme = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-02-01 06:15:14 -08:00
cw - > update_timeout = NULL ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_CANCEL ;
2010-02-01 06:15:14 -08:00
}
2010-02-10 23:07:58 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_object_del ( void * data ,
void * obj )
2010-02-10 23:07:58 -08:00
{
E_Comp_Win * cw = data ;
2010-12-22 15:08:25 -08:00
if ( ! cw ) return ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-02-10 23:07:58 -08:00
if ( obj = = cw - > bd )
{
2010-03-06 09:15:10 -08:00
if ( cw - > counter )
{
2010-03-24 01:08:46 -07:00
if ( cw - > bd )
2012-08-27 02:22:26 -07:00
ecore_x_e_comp_sync_cancel_send ( cw - > bd - > client . win ) ;
2010-03-24 01:08:46 -07:00
else
2012-08-27 02:22:26 -07:00
ecore_x_e_comp_sync_cancel_send ( cw - > win ) ;
2010-03-06 09:15:10 -08:00
ecore_x_sync_counter_inc ( cw - > counter , 1 ) ;
}
2010-12-22 15:08:25 -08:00
if ( cw - > bd ) eina_hash_del ( borders , e_util_winid_str_get ( cw - > bd - > client . win ) , cw ) ;
2010-02-10 23:07:58 -08:00
cw - > bd = NULL ;
2010-08-04 15:10:06 -07:00
evas_object_data_del ( cw - > shobj , " border " ) ;
2013-01-09 03:34:07 -08:00
// hmm - lockup?
// cw->counter = 0;
2010-02-10 23:07:58 -08:00
}
2010-08-04 15:10:06 -07:00
else if ( obj = = cw - > pop )
{
cw - > pop = NULL ;
evas_object_data_del ( cw - > shobj , " popup " ) ;
}
else if ( obj = = cw - > menu )
{
cw - > menu = NULL ;
evas_object_data_del ( cw - > shobj , " menu " ) ;
}
2010-02-10 23:07:58 -08:00
if ( cw - > dfn )
{
e_object_delfn_del ( obj , cw - > dfn ) ;
cw - > dfn = NULL ;
}
}
2010-04-07 23:01:40 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_done_defer ( E_Comp_Win * cw )
2010-04-07 23:01:40 -07:00
{
2011-03-31 01:14:18 -07:00
if ( cw - > animating )
{
cw - > c - > animating - - ;
}
2010-04-07 23:01:40 -07:00
cw - > animating = 0 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-04-07 23:01:40 -07:00
cw - > force = 1 ;
2013-01-09 03:34:07 -08:00
if ( cw - > defer_hide ) _e_comp_win_hide ( cw ) ;
2010-04-07 23:01:40 -07:00
cw - > force = 1 ;
2013-01-09 03:34:07 -08:00
if ( cw - > delete_me ) _e_comp_win_del ( cw ) ;
2010-04-07 23:01:40 -07:00
else cw - > force = 0 ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_show_done ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2010-04-07 23:01:40 -07:00
{
E_Comp_Win * cw = data ;
2013-01-09 03:34:07 -08:00
_e_comp_done_defer ( cw ) ;
2010-04-07 23:01:40 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_hide_done ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * emission __UNUSED__ ,
const char * source __UNUSED__ )
2010-04-07 23:01:40 -07:00
{
E_Comp_Win * cw = data ;
2013-01-09 03:34:07 -08:00
_e_comp_done_defer ( cw ) ;
2010-04-07 23:01:40 -07:00
}
2010-03-24 01:08:46 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_sync_setup ( E_Comp_Win * cw ,
Ecore_X_Window win )
2010-03-24 01:08:46 -07:00
{
2013-01-09 03:34:07 -08:00
if ( ! conf - > efl_sync ) return ;
2010-03-24 01:08:46 -07:00
if ( cw - > bd )
{
2013-01-09 03:34:07 -08:00
if ( _e_comp_win_is_borderless ( cw ) | |
( conf - > loose_sync ) )
2010-03-24 01:08:46 -07:00
cw - > counter = ecore_x_e_comp_sync_counter_get ( win ) ;
else
2012-08-27 02:22:26 -07:00
ecore_x_e_comp_sync_cancel_send ( win ) ;
2010-03-24 01:08:46 -07:00
}
else
cw - > counter = ecore_x_e_comp_sync_counter_get ( win ) ;
if ( cw - > counter )
{
ecore_x_e_comp_sync_begin_send ( win ) ;
2010-10-15 00:22:17 -07:00
ecore_x_sync_counter_inc ( cw - > counter , 1 ) ;
2010-03-24 01:08:46 -07:00
}
}
2010-04-12 01:28:51 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_shadow_setup ( E_Comp_Win * cw )
2010-04-12 01:28:51 -07:00
{
2010-08-02 23:10:33 -07:00
Evas_Object * o ;
2010-04-12 01:28:51 -07:00
int ok = 0 ;
2012-08-22 00:32:12 -07:00
char buf [ 4096 ] ;
2010-05-15 02:14:31 -07:00
Eina_List * list = NULL , * l ;
2013-01-09 03:34:07 -08:00
E_Comp_Match * m ;
2013-01-10 05:20:02 -08:00
Eina_Bool focus = EINA_FALSE , urgent = EINA_FALSE , skip = EINA_FALSE ;
2010-05-15 02:14:31 -07:00
const char * title = NULL , * name = NULL , * clas = NULL , * role = NULL ;
Ecore_X_Window_Type primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
evas_object_image_smooth_scale_set ( cw - > obj , conf - > smooth_windows ) ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
2013-01-09 03:34:07 -08:00
evas_object_image_smooth_scale_set ( o , conf - > smooth_windows ) ;
2010-08-02 23:10:33 -07:00
}
2010-05-15 02:14:31 -07:00
if ( cw - > bd )
{
2013-01-09 03:34:07 -08:00
list = conf - > match . borders ;
2010-05-15 02:14:31 -07:00
title = cw - > bd - > client . icccm . title ;
if ( cw - > bd - > client . netwm . name ) title = cw - > bd - > client . netwm . name ;
name = cw - > bd - > client . icccm . name ;
clas = cw - > bd - > client . icccm . class ;
role = cw - > bd - > client . icccm . window_role ;
primary_type = cw - > bd - > client . netwm . type ;
2013-01-10 05:20:02 -08:00
skip = ( conf - > match . disable_borders ) ;
2010-05-15 02:14:31 -07:00
}
else if ( cw - > pop )
{
// FIXME: i only added "shelf" as a name for popups that are shelves
// ... need more nmes like for pager popup, evertything, exebuf
// etc. etc.
2013-01-09 03:34:07 -08:00
list = conf - > match . popups ;
2012-06-28 00:03:44 -07:00
name = cw - > pop - > name ;
2013-01-10 05:20:02 -08:00
skip = ( conf - > match . disable_borders ) ;
2010-05-15 02:14:31 -07:00
}
else if ( cw - > menu )
{
// FIXME: e has no way to tell e menus apart... need naming
2013-01-09 03:34:07 -08:00
list = conf - > match . menus ;
2013-01-10 05:20:02 -08:00
skip = ( conf - > match . disable_borders ) ;
2010-05-15 02:14:31 -07:00
}
else
{
2013-01-09 03:34:07 -08:00
list = conf - > match . overrides ;
2010-05-15 02:14:31 -07:00
title = cw - > title ;
name = cw - > name ;
clas = cw - > clas ;
role = cw - > role ;
primary_type = cw - > primary_type ;
2013-01-10 05:20:02 -08:00
skip = ( conf - > match . disable_borders ) ;
2010-05-15 02:14:31 -07:00
}
2011-02-10 09:26:40 -08:00
2013-01-10 05:20:02 -08:00
if ( ! skip )
2010-05-15 02:14:31 -07:00
{
2013-01-10 05:20:02 -08:00
EINA_LIST_FOREACH ( list , l , m )
2010-05-15 02:14:31 -07:00
{
2013-01-10 05:20:02 -08:00
if ( ( ( m - > title ) & & ( ! title ) ) | |
( ( title ) & & ( m - > title ) & & ( ! e_util_glob_match ( title , m - > title ) ) ) )
continue ;
if ( ( ( m - > name ) & & ( ! name ) ) | |
( ( name ) & & ( m - > name ) & & ( ! e_util_glob_match ( name , m - > name ) ) ) )
continue ;
if ( ( ( m - > clas ) & & ( ! clas ) ) | |
( ( clas ) & & ( m - > clas ) & & ( ! e_util_glob_match ( clas , m - > clas ) ) ) )
continue ;
if ( ( ( m - > role ) & & ( ! role ) ) | |
( ( role ) & & ( m - > role ) & & ( ! e_util_glob_match ( role , m - > role ) ) ) )
continue ;
if ( ( primary_type ! = ECORE_X_WINDOW_TYPE_UNKNOWN ) & &
( m - > primary_type ! = ECORE_X_WINDOW_TYPE_UNKNOWN ) & &
( ( int ) primary_type ! = m - > primary_type ) )
continue ;
if ( cw - > bd )
2010-05-15 02:14:31 -07:00
{
2013-01-10 05:20:02 -08:00
if ( m - > borderless ! = 0 )
{
int borderless = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-10 05:20:02 -08:00
if ( ( cw - > bd - > client . mwm . borderless ) | | ( cw - > bd - > borderless ) )
borderless = 1 ;
if ( ! ( ( ( m - > borderless = = - 1 ) & & ( ! borderless ) ) | |
( ( m - > borderless = = 1 ) & & ( borderless ) ) ) )
continue ;
}
if ( m - > dialog ! = 0 )
{
int dialog = 0 ;
if ( ( ( cw - > bd - > client . icccm . transient_for ! = 0 ) | |
( cw - > bd - > client . netwm . type = = ECORE_X_WINDOW_TYPE_DIALOG ) ) )
dialog = 1 ;
if ( ! ( ( ( m - > dialog = = - 1 ) & & ( ! dialog ) ) | |
( ( m - > dialog = = 1 ) & & ( dialog ) ) ) )
continue ;
}
if ( m - > accepts_focus ! = 0 )
{
int accepts_focus = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-10 05:20:02 -08:00
if ( cw - > bd - > client . icccm . accepts_focus )
accepts_focus = 1 ;
if ( ! ( ( ( m - > accepts_focus = = - 1 ) & & ( ! accepts_focus ) ) | |
( ( m - > accepts_focus = = 1 ) & & ( accepts_focus ) ) ) )
continue ;
}
if ( m - > vkbd ! = 0 )
{
int vkbd = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-10 05:20:02 -08:00
if ( cw - > bd - > client . vkbd . vkbd )
vkbd = 1 ;
if ( ! ( ( ( m - > vkbd = = - 1 ) & & ( ! vkbd ) ) | |
( ( m - > vkbd = = 1 ) & & ( vkbd ) ) ) )
continue ;
}
if ( m - > quickpanel ! = 0 )
{
int quickpanel = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-10 05:20:02 -08:00
if ( cw - > bd - > client . illume . quickpanel . quickpanel )
quickpanel = 1 ;
if ( ! ( ( ( m - > quickpanel = = - 1 ) & & ( ! quickpanel ) ) | |
( ( m - > quickpanel = = 1 ) & & ( quickpanel ) ) ) )
continue ;
}
if ( m - > argb ! = 0 )
{
if ( ! ( ( ( m - > argb = = - 1 ) & & ( ! cw - > argb ) ) | |
( ( m - > argb = = 1 ) & & ( cw - > argb ) ) ) )
continue ;
}
if ( m - > fullscreen ! = 0 )
{
int fullscreen = 0 ;
if ( cw - > bd - > client . netwm . state . fullscreen )
fullscreen = 1 ;
if ( ! ( ( ( m - > fullscreen = = - 1 ) & & ( ! fullscreen ) ) | |
( ( m - > fullscreen = = 1 ) & & ( fullscreen ) ) ) )
continue ;
}
if ( m - > modal ! = 0 )
{
int modal = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-10 05:20:02 -08:00
if ( cw - > bd - > client . netwm . state . modal )
modal = 1 ;
if ( ! ( ( ( m - > modal = = - 1 ) & & ( ! modal ) ) | |
( ( m - > modal = = 1 ) & & ( modal ) ) ) )
continue ;
}
2010-05-15 02:14:31 -07:00
}
2013-01-10 05:20:02 -08:00
focus = m - > focus ;
urgent = m - > urgent ;
if ( m - > shadow_style )
2010-05-15 02:14:31 -07:00
{
2013-01-10 05:20:02 -08:00
snprintf ( buf , sizeof ( buf ) , " e/comp/%s " ,
m - > shadow_style ) ;
ok = e_theme_edje_object_set ( cw - > shobj , " base/theme/borders " ,
buf ) ;
if ( ok ) break ;
2010-05-15 02:14:31 -07:00
}
}
}
2013-01-10 05:20:02 -08:00
while ( ! ok )
2011-10-21 08:31:35 -07:00
{
2013-01-10 05:20:02 -08:00
if ( skip | | ( cw - > bd & & cw - > bd - > client . e . state . video ) )
2011-10-21 08:31:35 -07:00
ok = e_theme_edje_object_set ( cw - > shobj ,
" base/theme/borders " ,
" e/comp/none " ) ;
2013-01-10 05:20:02 -08:00
if ( ok ) break ;
2013-01-09 03:34:07 -08:00
if ( conf - > shadow_style )
2010-04-12 01:28:51 -07:00
{
snprintf ( buf , sizeof ( buf ) , " e/comp/%s " ,
2013-01-09 03:34:07 -08:00
conf - > shadow_style ) ;
2010-04-12 01:28:51 -07:00
ok = e_theme_edje_object_set ( cw - > shobj , " base/theme/borders " ,
buf ) ;
}
if ( ! ok )
ok = e_theme_edje_object_set ( cw - > shobj , " base/theme/borders " ,
" e/comp/default " ) ;
2013-01-10 05:20:02 -08:00
break ;
2010-04-12 01:28:51 -07:00
}
edje_object_part_swallow ( cw - > shobj , " e.swallow.content " , cw - > obj ) ;
2012-07-31 03:25:20 -07:00
if ( cw - > bd & & cw - > bd - > client . e . state . video )
edje_object_signal_emit ( cw - > shobj , " e,state,shadow,off " , " e " ) ;
2011-10-21 08:31:35 -07:00
else
2010-04-12 01:28:51 -07:00
{
2013-01-09 03:34:07 -08:00
if ( _e_comp_win_do_shadow ( cw ) )
2010-04-12 01:28:51 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,shadow,on " , " e " ) ;
2010-04-12 07:55:25 -07:00
else
edje_object_signal_emit ( cw - > shobj , " e,state,shadow,off " , " e " ) ;
2010-04-12 01:28:51 -07:00
}
2011-08-20 04:39:25 -07:00
2012-12-18 00:33:04 -08:00
if ( cw - > bd | | focus | | urgent )
2010-04-12 01:28:51 -07:00
{
2012-12-18 00:33:04 -08:00
if ( focus | | ( cw - > bd & & cw - > bd - > focused ) )
2010-04-12 01:28:51 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,focus,on " , " e " ) ;
2012-12-18 00:33:04 -08:00
if ( urgent | | ( cw - > bd & & cw - > bd - > client . icccm . urgent ) )
2010-04-12 01:28:51 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,urgent,on " , " e " ) ;
}
2012-09-20 06:40:19 -07:00
if ( cw - > visible )
edje_object_signal_emit ( cw - > shobj , " e,state,visible,on " , " e " ) ;
else
edje_object_signal_emit ( cw - > shobj , " e,state,visible,off " , " e " ) ;
2013-01-10 05:20:02 -08:00
2012-09-20 06:40:19 -07:00
if ( ! cw - > animating )
{
cw - > c - > animating + + ;
}
cw - > animating = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-04-12 01:28:51 -07:00
}
2011-03-03 15:36:54 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_cb_win_mirror_del ( void * data , Evas * e __UNUSED__ , Evas_Object * obj , void * event_info __UNUSED__ )
2011-03-03 15:36:54 -08:00
{
2011-04-07 22:31:47 -07:00
E_Comp_Win * cw ;
2011-03-19 23:12:17 -07:00
2011-04-07 22:31:47 -07:00
if ( ! ( cw = data ) ) return ;
2011-03-03 15:36:54 -08:00
cw - > obj_mirror = eina_list_remove ( cw - > obj_mirror , obj ) ;
}
2010-08-02 23:10:33 -07:00
static Evas_Object *
2013-01-09 03:34:07 -08:00
_e_comp_win_mirror_add ( E_Comp_Win * cw )
2010-08-02 23:10:33 -07:00
{
Evas_Object * o ;
if ( ! cw - > c ) return NULL ;
2011-02-10 09:26:40 -08:00
2010-08-02 23:10:33 -07:00
o = evas_object_image_filled_add ( cw - > c - > evas ) ;
evas_object_image_colorspace_set ( o , EVAS_COLORSPACE_ARGB8888 ) ;
cw - > obj_mirror = eina_list_append ( cw - > obj_mirror , o ) ;
2013-01-09 03:34:07 -08:00
evas_object_image_smooth_scale_set ( o , conf - > smooth_windows ) ;
2010-08-02 23:10:33 -07:00
2011-03-03 15:36:54 -08:00
evas_object_event_callback_add ( o , EVAS_CALLBACK_DEL ,
2013-01-09 03:34:07 -08:00
_e_comp_cb_win_mirror_del , cw ) ;
2011-03-19 23:12:17 -07:00
2010-08-02 23:10:33 -07:00
if ( ( cw - > pixmap ) & & ( cw - > pw > 0 ) & & ( cw - > ph > 0 ) )
{
unsigned int * pix ;
Eina_Bool alpha ;
int w , h ;
alpha = evas_object_image_alpha_get ( cw - > obj ) ;
evas_object_image_size_get ( cw - > obj , & w , & h ) ;
2011-02-10 09:26:40 -08:00
2010-08-02 23:10:33 -07:00
evas_object_image_alpha_set ( o , alpha ) ;
2011-02-10 09:26:40 -08:00
2010-08-02 23:10:33 -07:00
if ( cw - > shaped )
{
pix = evas_object_image_data_get ( cw - > obj , 0 ) ;
evas_object_image_data_set ( o , pix ) ;
evas_object_image_size_set ( o , w , h ) ;
evas_object_image_data_set ( o , pix ) ;
evas_object_image_data_update_add ( o , 0 , 0 , w , h ) ;
}
else
{
if ( cw - > native )
{
Evas_Native_Surface ns ;
2011-02-10 09:26:40 -08:00
2010-12-05 23:09:51 -08:00
ns . version = EVAS_NATIVE_SURFACE_VERSION ;
ns . type = EVAS_NATIVE_SURFACE_X11 ;
2010-08-02 23:10:33 -07:00
ns . data . x11 . visual = cw - > vis ;
ns . data . x11 . pixmap = cw - > pixmap ;
evas_object_image_size_set ( o , w , h ) ;
evas_object_image_native_surface_set ( o , & ns ) ;
evas_object_image_data_update_add ( o , 0 , 0 , w , h ) ;
}
2011-03-19 09:46:04 -07:00
else if ( cw - > xim )
2010-08-02 23:10:33 -07:00
{
2012-09-21 01:35:24 -07:00
if ( ecore_x_image_is_argb32_get ( cw - > xim ) )
{
pix = ecore_x_image_data_get ( cw - > xim , NULL , NULL , NULL ) ;
evas_object_image_data_set ( o , pix ) ;
evas_object_image_size_set ( o , w , h ) ;
}
else
{
pix = evas_object_image_data_get ( cw - > obj , EINA_TRUE ) ;
evas_object_image_data_set ( o , pix ) ;
evas_object_image_size_set ( o , w , h ) ;
evas_object_image_data_set ( cw - > obj , pix ) ;
}
2010-08-02 23:10:33 -07:00
evas_object_image_data_update_add ( o , 0 , 0 , w , h ) ;
}
}
evas_object_image_size_set ( o , w , h ) ;
evas_object_image_data_update_add ( o , 0 , 0 , w , h ) ;
2011-03-19 23:12:17 -07:00
}
2010-08-02 23:10:33 -07:00
return o ;
}
2010-01-14 20:41:20 -08:00
static E_Comp_Win *
2013-01-09 03:34:07 -08:00
_e_comp_win_add ( E_Comp * c ,
Ecore_X_Window win )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Window_Attributes att ;
2010-01-14 20:41:20 -08:00
E_Comp_Win * cw ;
2011-02-10 09:26:40 -08:00
2010-01-14 20:41:20 -08:00
cw = calloc ( 1 , sizeof ( E_Comp_Win ) ) ;
2010-01-06 06:18:47 -08:00
if ( ! cw ) return NULL ;
cw - > win = win ;
cw - > c = c ;
2012-09-20 06:40:19 -07:00
cw - > real_hid = 1 ;
2011-03-16 14:25:35 -07:00
cw - > opacity = 255.0 ;
2010-02-10 23:07:58 -08:00
cw - > bd = e_border_find_by_window ( cw - > win ) ;
2013-01-09 03:34:07 -08:00
if ( conf - > grab ) ecore_x_grab ( ) ;
2010-02-10 23:07:58 -08:00
if ( cw - > bd )
{
2012-06-28 00:03:44 -07:00
eina_hash_add ( borders , e_util_winid_str_get ( cw - > bd - > client . win ) , cw ) ;
2013-01-09 03:34:07 -08:00
cw - > dfn = e_object_delfn_add ( E_OBJECT ( cw - > bd ) , _e_comp_object_del , cw ) ;
2011-03-19 23:12:17 -07:00
// setup on show
2013-01-09 03:34:07 -08:00
// _e_comp_win_sync_setup(cw, cw->bd->client.win);
2011-03-15 13:47:30 -07:00
}
else if ( ( cw - > pop = e_popup_find_by_window ( cw - > win ) ) )
{
2011-03-19 23:12:17 -07:00
cw - > dfn = e_object_delfn_add ( E_OBJECT ( cw - > pop ) ,
2013-01-09 03:34:07 -08:00
_e_comp_object_del , cw ) ;
2011-03-19 23:12:17 -07:00
cw - > show_ready = 1 ;
2011-03-15 13:47:30 -07:00
}
else if ( ( cw - > menu = e_menu_find_by_window ( cw - > win ) ) )
{
2011-03-19 23:12:17 -07:00
cw - > dfn = e_object_delfn_add ( E_OBJECT ( cw - > menu ) ,
2013-01-09 03:34:07 -08:00
_e_comp_object_del , cw ) ;
2011-03-19 23:12:17 -07:00
cw - > show_ready = 1 ;
2010-02-10 23:07:58 -08:00
}
else
{
2011-03-19 23:12:17 -07:00
char * netwm_title = NULL ;
2011-02-10 09:26:40 -08:00
2011-03-19 23:12:17 -07:00
cw - > title = ecore_x_icccm_title_get ( cw - > win ) ;
if ( ecore_x_netwm_name_get ( cw - > win , & netwm_title ) )
{
2012-12-21 13:31:13 -08:00
free ( cw - > title ) ;
2011-03-19 23:12:17 -07:00
cw - > title = netwm_title ;
}
ecore_x_icccm_name_class_get ( cw - > win , & cw - > name , & cw - > clas ) ;
cw - > role = ecore_x_icccm_window_role_get ( cw - > win ) ;
if ( ! ecore_x_netwm_window_type_get ( cw - > win , & cw - > primary_type ) )
cw - > primary_type = ECORE_X_WINDOW_TYPE_UNKNOWN ;
// setup on show
2013-01-09 03:34:07 -08:00
// _e_comp_win_sync_setup(cw, cw->win);
2010-02-10 23:07:58 -08:00
}
2011-03-15 13:47:30 -07:00
2010-09-09 21:09:37 -07:00
if ( ! cw - > counter )
{
// FIXME: config - disable ready timeout for non-counter wins
2011-03-19 23:12:17 -07:00
// cw->show_ready = 1;
2010-09-09 21:09:37 -07:00
}
2010-02-10 23:07:58 -08:00
// fixme: could use bd/pop/menu for this too
2010-01-06 07:21:16 -08:00
memset ( ( & att ) , 0 , sizeof ( Ecore_X_Window_Attributes ) ) ;
2010-01-14 20:41:20 -08:00
if ( ! ecore_x_window_attributes_get ( cw - > win , & att ) )
{
2012-12-13 05:21:43 -08:00
free ( cw - > name ) ;
free ( cw - > clas ) ;
free ( cw - > role ) ;
2010-01-14 20:41:20 -08:00
free ( cw ) ;
2013-01-09 03:34:07 -08:00
if ( conf - > grab ) ecore_x_ungrab ( ) ;
2010-01-14 20:41:20 -08:00
return NULL ;
}
2011-03-19 23:12:17 -07:00
if ( ( ! att . input_only ) & &
2010-01-14 20:41:20 -08:00
( ( att . depth ! = 24 ) & & ( att . depth ! = 32 ) ) )
2010-01-11 00:43:24 -08:00
{
2013-01-09 03:34:07 -08:00
// printf("WARNING: window 0x%x not 24/32bpp -> %ibpp\n", cw->win, att.depth);
// cw->invalid = 1;
2010-01-11 00:43:24 -08:00
}
2010-01-06 06:18:47 -08:00
cw - > input_only = att . input_only ;
2010-02-05 23:04:17 -08:00
cw - > override = att . override ;
2010-01-06 06:18:47 -08:00
cw - > vis = att . visual ;
2012-09-21 01:35:24 -07:00
cw - > cmap = att . colormap ;
2010-01-06 06:18:47 -08:00
cw - > depth = att . depth ;
2010-01-07 05:45:51 -08:00
cw - > argb = ecore_x_window_argb_get ( cw - > win ) ;
2010-01-06 06:18:47 -08:00
eina_hash_add ( windows , e_util_winid_str_get ( cw - > win ) , cw ) ;
2010-08-27 02:37:16 -07:00
cw - > inhash = 1 ;
2010-02-05 23:04:17 -08:00
if ( ( ! cw - > input_only ) & & ( ! cw - > invalid ) )
2010-01-06 06:18:47 -08:00
{
2010-01-10 18:47:59 -08:00
Ecore_X_Rectangle * rects ;
2010-04-12 01:28:51 -07:00
int num ;
2011-02-10 09:26:40 -08:00
2010-02-10 23:07:58 -08:00
cw - > damage = ecore_x_damage_new
2013-01-09 03:34:07 -08:00
( cw - > win , ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES ) ;
2010-01-06 06:18:47 -08:00
eina_hash_add ( damages , e_util_winid_str_get ( cw - > damage ) , cw ) ;
2010-01-14 20:41:20 -08:00
cw - > shobj = edje_object_add ( c - > evas ) ;
2010-04-12 01:28:51 -07:00
cw - > obj = evas_object_image_filled_add ( c - > evas ) ;
evas_object_image_colorspace_set ( cw - > obj , EVAS_COLORSPACE_ARGB8888 ) ;
if ( cw - > argb ) evas_object_image_alpha_set ( cw - > obj , 1 ) ;
else evas_object_image_alpha_set ( cw - > obj , 0 ) ;
2011-02-10 09:26:40 -08:00
2011-08-26 07:52:19 -07:00
if ( cw - > override & & ! ( att . event_mask . mine & ECORE_X_EVENT_MASK_WINDOW_PROPERTY ) )
2011-03-19 23:12:17 -07:00
ecore_x_event_mask_set ( cw - > win , ECORE_X_EVENT_MASK_WINDOW_PROPERTY ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_shadow_setup ( cw ) ;
2011-02-10 09:26:40 -08:00
2010-04-07 23:01:40 -07:00
edje_object_signal_callback_add ( cw - > shobj , " e,action,show,done " , " e " ,
2013-01-09 03:34:07 -08:00
_e_comp_show_done , cw ) ;
2010-04-07 23:01:40 -07:00
edje_object_signal_callback_add ( cw - > shobj , " e,action,hide,done " , " e " ,
2013-01-09 03:34:07 -08:00
_e_comp_hide_done , cw ) ;
_e_comp_win_layout_populate ( cw ) ;
2012-09-20 06:40:19 -07:00
2010-04-07 23:01:40 -07:00
evas_object_show ( cw - > obj ) ;
2010-01-10 18:47:59 -08:00
ecore_x_window_shape_events_select ( cw - > win , 1 ) ;
rects = ecore_x_window_shape_rectangles_get ( cw - > win , & num ) ;
if ( rects )
{
2010-02-21 07:52:19 -08:00
int i ;
2011-02-10 09:26:40 -08:00
2012-06-28 00:03:44 -07:00
for ( i = 0 ; i < num ; i + + )
E_RECTS_CLIP_TO_RECT ( rects [ i ] . x , rects [ i ] . y ,
rects [ i ] . width , rects [ i ] . height ,
0 , 0 , ( int ) att . w , ( int ) att . h ) ;
2011-08-26 07:52:19 -07:00
2013-01-09 03:34:07 -08:00
if ( _e_comp_shaped_check ( att . w , att . h , rects , num ) )
2012-06-28 00:03:44 -07:00
cw - > shape_changed = 1 ;
2011-08-26 07:52:19 -07:00
2012-06-28 00:03:44 -07:00
free ( rects ) ;
2010-01-10 18:47:59 -08:00
}
2011-02-10 09:26:40 -08:00
2010-08-04 15:10:06 -07:00
if ( cw - > bd ) evas_object_data_set ( cw - > shobj , " border " , cw - > bd ) ;
2011-03-19 23:12:17 -07:00
else if ( cw - > pop )
evas_object_data_set ( cw - > shobj , " popup " , cw - > pop ) ;
else if ( cw - > menu )
evas_object_data_set ( cw - > shobj , " menu " , cw - > menu ) ;
2011-02-10 09:26:40 -08:00
2010-08-04 15:10:06 -07:00
evas_object_pass_events_set ( cw - > obj , 1 ) ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_add_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-01-06 06:18:47 -08:00
}
2010-01-06 22:29:53 -08:00
else
{
2010-04-07 23:01:40 -07:00
cw - > shobj = evas_object_rectangle_add ( c - > evas ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_layout_populate ( cw ) ;
2010-08-04 15:10:06 -07:00
evas_object_color_set ( cw - > shobj , 0 , 0 , 0 , 0 ) ;
2010-01-06 22:29:53 -08:00
}
2010-08-05 01:23:59 -07:00
evas_object_pass_events_set ( cw - > shobj , 1 ) ;
2011-03-19 23:12:17 -07:00
evas_object_data_set ( cw - > shobj , " win " ,
2010-08-05 01:23:59 -07:00
( void * ) ( ( unsigned long ) cw - > win ) ) ;
evas_object_data_set ( cw - > shobj , " src " , cw ) ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
c - > wins_invalid = 1 ;
2010-01-11 00:43:24 -08:00
c - > wins = eina_inlist_append ( c - > wins , EINA_INLIST_GET ( cw ) ) ;
2013-01-09 03:34:07 -08:00
cw - > up = e_comp_update_new ( ) ;
e_comp_update_tile_size_set ( cw - > up , 32 , 32 ) ;
2010-01-11 00:43:24 -08:00
// for software:
2013-01-09 03:34:07 -08:00
e_comp_update_policy_set
( cw - > up , E_UPDATE_POLICY_HALF_WIDTH_OR_MORE_ROUND_UP_TO_FULL_WIDTH ) ;
2010-02-05 23:04:17 -08:00
if ( ( ( ! cw - > input_only ) & & ( ! cw - > invalid ) ) & & ( cw - > override ) )
{
2012-06-28 00:03:44 -07:00
cw - > redirected = 1 ;
// we redirect all subwindows anyway
// ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
cw - > dmg_updates = 0 ;
2010-02-05 23:04:17 -08:00
}
2010-01-08 18:45:50 -08:00
DBG ( " [0x%x] add \n " , cw - > win ) ;
2013-01-09 03:34:07 -08:00
if ( conf - > grab ) ecore_x_ungrab ( ) ;
2010-01-06 06:18:47 -08:00
return cw ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_del ( E_Comp_Win * cw )
2010-01-06 06:18:47 -08:00
{
2012-08-27 02:22:26 -07:00
Evas_Object * o ;
2010-08-01 07:29:19 -07:00
int pending_count ;
2011-03-31 01:14:18 -07:00
if ( cw - > animating )
{
cw - > c - > animating - - ;
}
cw - > animating = 0 ;
2010-08-01 07:29:19 -07:00
if ( ( ! cw - > input_only ) & & ( ! cw - > invalid ) )
{
cw - > pending_count + + ;
e_manager_comp_event_src_del_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-08-01 07:29:19 -07:00
}
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
e_comp_update_free ( cw - > up ) ;
2010-01-08 18:45:50 -08:00
DBG ( " [0x%x] del \n " , cw - > win ) ;
2012-12-21 13:31:13 -08:00
E_FREE ( cw - > rects ) ;
2010-02-01 06:15:14 -08:00
if ( cw - > update_timeout )
{
ecore_timer_del ( cw - > update_timeout ) ;
cw - > update_timeout = NULL ;
}
2010-09-09 21:09:37 -07:00
if ( cw - > ready_timeout )
{
ecore_timer_del ( cw - > ready_timeout ) ;
cw - > ready_timeout = NULL ;
}
2010-01-14 20:41:20 -08:00
if ( cw - > dfn )
{
2010-02-01 06:15:14 -08:00
if ( cw - > bd )
{
eina_hash_del ( borders , e_util_winid_str_get ( cw - > bd - > client . win ) , cw ) ;
e_object_delfn_del ( E_OBJECT ( cw - > bd ) , cw - > dfn ) ;
2010-08-27 02:37:16 -07:00
cw - > bd = NULL ;
2010-02-01 06:15:14 -08:00
}
2010-08-27 02:37:16 -07:00
else if ( cw - > pop )
2011-03-19 23:12:17 -07:00
{
e_object_delfn_del ( E_OBJECT ( cw - > pop ) , cw - > dfn ) ;
cw - > pop = NULL ;
}
2010-08-27 02:37:16 -07:00
else if ( cw - > menu )
2011-03-19 23:12:17 -07:00
{
e_object_delfn_del ( E_OBJECT ( cw - > menu ) , cw - > dfn ) ;
cw - > menu = NULL ;
}
2010-01-14 20:41:20 -08:00
cw - > dfn = NULL ;
}
2010-01-06 22:29:53 -08:00
if ( cw - > update )
{
cw - > update = 0 ;
cw - > c - > updates = eina_list_remove ( cw - > c - > updates , cw ) ;
}
2013-01-09 03:34:07 -08:00
_e_comp_win_release ( cw ) ;
2010-08-02 23:10:33 -07:00
if ( cw - > obj_mirror )
{
EINA_LIST_FREE ( cw - > obj_mirror , o )
{
if ( cw - > xim ) evas_object_image_data_set ( o , NULL ) ;
2011-03-19 23:12:17 -07:00
evas_object_event_callback_del ( o , EVAS_CALLBACK_DEL ,
2013-01-09 03:34:07 -08:00
_e_comp_cb_win_mirror_del ) ;
2010-08-02 23:10:33 -07:00
evas_object_del ( o ) ;
}
}
2010-01-06 06:18:47 -08:00
if ( cw - > obj )
{
evas_object_del ( cw - > obj ) ;
2010-02-01 06:15:14 -08:00
cw - > obj = NULL ;
2010-01-06 06:18:47 -08:00
}
2010-01-14 20:41:20 -08:00
if ( cw - > shobj )
{
evas_object_del ( cw - > shobj ) ;
2010-02-01 06:15:14 -08:00
cw - > shobj = NULL ;
2010-01-14 20:41:20 -08:00
}
2013-01-09 03:34:07 -08:00
2010-08-27 02:37:16 -07:00
if ( cw - > inhash )
2011-03-19 23:12:17 -07:00
eina_hash_del ( windows , e_util_winid_str_get ( cw - > win ) , cw ) ;
2013-01-09 03:34:07 -08:00
2012-12-21 13:31:13 -08:00
free ( cw - > title ) ;
free ( cw - > name ) ;
free ( cw - > clas ) ;
free ( cw - > role ) ;
2010-08-01 07:29:19 -07:00
cw - > c - > wins_invalid = 1 ;
2010-01-06 06:18:47 -08:00
cw - > c - > wins = eina_inlist_remove ( cw - > c - > wins , EINA_INLIST_GET ( cw ) ) ;
2010-08-01 07:29:19 -07:00
pending_count = cw - > pending_count ;
memset ( cw , 0 , sizeof ( E_Comp_Win ) ) ;
cw - > pending_count = pending_count ;
cw - > delete_pending = 1 ;
if ( cw - > pending_count > 0 ) return ;
2010-01-06 06:18:47 -08:00
free ( cw ) ;
}
2010-01-14 20:41:20 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_show ( E_Comp_Win * cw )
2010-01-06 06:18:47 -08:00
{
2010-08-02 23:10:33 -07:00
Eina_List * l ;
Evas_Object * o ;
2011-02-10 09:26:40 -08:00
2010-01-06 06:18:47 -08:00
if ( cw - > visible ) return ;
cw - > visible = 1 ;
2011-03-19 23:12:17 -07:00
DBG ( " [0x%x] sho ++ [redir=%i, pm=%x, dmg_up=%i] \n " ,
2010-08-27 02:37:16 -07:00
cw - > win , cw - > redirected , cw - > pixmap , cw - > dmg_updates ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_configure ( cw , cw - > hidden . x , cw - > hidden . y , cw - > w , cw - > h , cw - > border ) ;
2010-02-05 23:04:17 -08:00
if ( ( cw - > input_only ) | | ( cw - > invalid ) ) return ;
2011-02-10 09:26:40 -08:00
2011-04-28 03:03:43 -07:00
cw - > show_anim = EINA_FALSE ;
2012-06-28 00:03:44 -07:00
2013-01-09 03:34:07 -08:00
// setup on show
2010-10-10 23:28:23 -07:00
if ( cw - > bd )
2013-01-09 03:34:07 -08:00
_e_comp_win_sync_setup ( cw , cw - > bd - > client . win ) ;
2010-10-10 23:28:23 -07:00
else
2013-01-09 03:34:07 -08:00
_e_comp_win_sync_setup ( cw , cw - > win ) ;
2011-02-10 09:26:40 -08:00
2010-08-27 02:37:16 -07:00
if ( cw - > real_hid )
2010-08-02 23:10:33 -07:00
{
2010-08-27 02:37:16 -07:00
DBG ( " [0x%x] real hid - fix \n " , cw - > win ) ;
cw - > real_hid = 0 ;
if ( cw - > native )
{
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
cw - > native = 0 ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , NULL ) ;
}
}
if ( cw - > pixmap )
{
ecore_x_pixmap_free ( cw - > pixmap ) ;
cw - > pixmap = 0 ;
cw - > pw = 0 ;
cw - > ph = 0 ;
ecore_x_e_comp_pixmap_set ( cw - > win , cw - > pixmap ) ;
}
if ( cw - > xim )
{
evas_object_image_size_set ( cw - > obj , 1 , 1 ) ;
evas_object_image_data_set ( cw - > obj , NULL ) ;
ecore_x_image_free ( cw - > xim ) ;
cw - > xim = NULL ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_size_set ( o , 1 , 1 ) ;
evas_object_image_data_set ( o , NULL ) ;
}
}
if ( cw - > redirected )
{
cw - > redirected = 0 ;
cw - > pw = 0 ;
cw - > ph = 0 ;
}
2011-03-19 23:12:17 -07:00
if ( cw - > pop )
cw - > dmg_updates = 1 ;
else
cw - > dmg_updates = 0 ;
2010-08-02 23:10:33 -07:00
}
2010-08-27 02:37:16 -07:00
else
2011-03-15 13:47:30 -07:00
cw - > dmg_updates = 1 ;
2012-01-28 14:52:47 -08:00
2010-08-27 02:37:16 -07:00
if ( ( ! cw - > redirected ) | | ( ! cw - > pixmap ) )
2010-01-14 20:41:20 -08:00
{
2012-01-26 10:28:15 -08:00
// we redirect all subwindows anyway
// ecore_x_composite_redirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
2013-01-09 03:34:07 -08:00
/* #ifdef HAVE_WAYLAND_CLIENTS */
/* if ((cw->bd) && (cw->bd->borderless)) */
/* cw->pixmap = e_comp_wl_pixmap_get(cw->win); */
/* #endif */
2012-01-28 14:52:47 -08:00
if ( ! cw - > pixmap )
cw - > pixmap = ecore_x_composite_name_window_pixmap_get ( cw - > win ) ;
2012-01-26 10:28:15 -08:00
if ( cw - > pixmap )
{
ecore_x_pixmap_geometry_get ( cw - > pixmap , NULL , NULL , & ( cw - > pw ) , & ( cw - > ph ) ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_ready_timeout_setup ( cw ) ;
2012-01-26 10:28:15 -08:00
}
else
{
cw - > pw = 0 ;
cw - > ph = 0 ;
}
if ( ( cw - > pw < = 0 ) | | ( cw - > ph < = 0 ) )
{
if ( cw - > pixmap )
{
ecore_x_pixmap_free ( cw - > pixmap ) ;
cw - > pixmap = 0 ;
}
// cw->show_ready = 0; // hmm maybe not needed?
}
cw - > redirected = 1 ;
DBG ( " [0x%x] up resize %ix%i \n " , cw - > win , cw - > pw , cw - > ph ) ;
2013-01-09 03:34:07 -08:00
e_comp_update_resize ( cw - > up , cw - > pw , cw - > ph ) ;
e_comp_update_add ( cw - > up , 0 , 0 , cw - > pw , cw - > ph ) ;
2012-01-26 10:28:15 -08:00
evas_object_image_size_set ( cw - > obj , cw - > pw , cw - > ph ) ;
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_size_set ( o , cw - > pw , cw - > ph ) ;
}
ecore_x_e_comp_pixmap_set ( cw - > win , cw - > pixmap ) ;
2010-01-14 20:41:20 -08:00
}
2012-10-25 06:47:20 -07:00
if ( ( ( cw - > dmg_updates > = 1 ) | | ( cw - > defer_show ) ) & & ( cw - > show_ready ) )
2010-02-11 00:05:19 -08:00
{
2010-04-07 23:01:40 -07:00
cw - > defer_hide = 0 ;
2013-01-09 03:34:07 -08:00
if ( ! cw - > hidden_override ) _e_comp_child_show ( cw ) ;
2010-04-07 23:01:40 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,visible,on " , " e " ) ;
2011-03-31 01:14:18 -07:00
if ( ! cw - > animating )
{
cw - > c - > animating + + ;
}
2010-04-07 23:01:40 -07:00
cw - > animating = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_visibility_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-02-11 00:05:19 -08:00
}
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-01-06 06:18:47 -08:00
}
2010-08-27 02:37:16 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_real_hide ( E_Comp_Win * cw )
2010-08-27 02:37:16 -07:00
{
if ( cw - > bd )
{
2013-01-09 03:34:07 -08:00
_e_comp_win_hide ( cw ) ;
2010-08-27 02:37:16 -07:00
return ;
}
cw - > real_hid = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_hide ( cw ) ;
2010-08-27 02:37:16 -07:00
}
2010-01-06 06:18:47 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_hide ( E_Comp_Win * cw )
2010-01-06 06:18:47 -08:00
{
2010-08-02 23:10:33 -07:00
Eina_List * l ;
Evas_Object * o ;
2011-02-10 09:26:40 -08:00
2010-04-12 01:28:51 -07:00
if ( ( ! cw - > visible ) & & ( ! cw - > defer_hide ) ) return ;
2010-01-06 06:18:47 -08:00
cw - > visible = 0 ;
2010-02-05 23:04:17 -08:00
if ( ( cw - > input_only ) | | ( cw - > invalid ) ) return ;
2010-01-08 18:45:50 -08:00
DBG ( " [0x%x] hid -- \n " , cw - > win ) ;
2010-04-07 23:01:40 -07:00
if ( ! cw - > force )
2010-02-05 23:04:17 -08:00
{
cw - > defer_hide = 1 ;
2010-04-07 23:01:40 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,visible,off " , " e " ) ;
2011-03-31 01:14:18 -07:00
if ( ! cw - > animating )
{
cw - > c - > animating + + ;
}
2010-04-07 23:01:40 -07:00
cw - > animating = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_visibility_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-04-07 23:01:40 -07:00
return ;
2010-02-05 23:04:17 -08:00
}
2010-04-12 01:28:51 -07:00
cw - > defer_hide = 0 ;
2010-04-07 23:01:40 -07:00
cw - > force = 0 ;
2013-01-09 03:34:07 -08:00
_e_comp_child_hide ( cw ) ;
2011-02-10 09:26:40 -08:00
2010-02-01 06:15:14 -08:00
if ( cw - > update_timeout )
{
ecore_timer_del ( cw - > update_timeout ) ;
cw - > update_timeout = NULL ;
}
2013-01-09 03:34:07 -08:00
if ( conf - > keep_unmapped )
2010-02-10 06:13:29 -08:00
{
2013-01-09 03:34:07 -08:00
if ( conf - > send_flush )
2010-04-12 01:28:51 -07:00
{
if ( cw - > bd ) ecore_x_e_comp_flush_send ( cw - > bd - > client . win ) ;
else ecore_x_e_comp_flush_send ( cw - > win ) ;
}
2013-01-09 03:34:07 -08:00
if ( conf - > send_dump )
2010-04-12 01:28:51 -07:00
{
if ( cw - > bd ) ecore_x_e_comp_dump_send ( cw - > bd - > client . win ) ;
else ecore_x_e_comp_dump_send ( cw - > win ) ;
}
2010-02-10 06:13:29 -08:00
return ;
}
2010-09-09 21:09:37 -07:00
if ( cw - > ready_timeout )
{
ecore_timer_del ( cw - > ready_timeout ) ;
cw - > ready_timeout = NULL ;
}
2011-02-10 09:26:40 -08:00
2010-01-23 05:50:26 -08:00
if ( cw - > native )
{
evas_object_image_native_surface_set ( cw - > obj , NULL ) ;
cw - > native = 0 ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_native_surface_set ( o , NULL ) ;
}
2010-01-23 05:50:26 -08:00
}
2010-01-21 04:42:33 -08:00
if ( cw - > pixmap )
{
ecore_x_pixmap_free ( cw - > pixmap ) ;
cw - > pixmap = 0 ;
cw - > pw = 0 ;
cw - > ph = 0 ;
2010-07-13 16:36:32 -07:00
ecore_x_e_comp_pixmap_set ( cw - > win , cw - > pixmap ) ;
2013-01-09 03:34:07 -08:00
// cw->show_ready = 0; // hmm maybe not needed?
2010-01-21 04:42:33 -08:00
}
if ( cw - > xim )
{
2010-02-10 23:07:58 -08:00
evas_object_image_size_set ( cw - > obj , 1 , 1 ) ;
2010-01-21 04:42:33 -08:00
evas_object_image_data_set ( cw - > obj , NULL ) ;
ecore_x_image_free ( cw - > xim ) ;
cw - > xim = NULL ;
2010-08-02 23:10:33 -07:00
EINA_LIST_FOREACH ( cw - > obj_mirror , l , o )
{
evas_object_image_size_set ( o , 1 , 1 ) ;
evas_object_image_data_set ( o , NULL ) ;
}
2010-01-21 04:42:33 -08:00
}
2010-02-10 23:07:58 -08:00
if ( cw - > redirected )
{
2013-01-09 03:34:07 -08:00
// we redirect all subwindows anyway
// ecore_x_composite_unredirect_window(cw->win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
2012-06-28 00:03:44 -07:00
cw - > redirected = 0 ;
cw - > pw = 0 ;
cw - > ph = 0 ;
2010-02-10 23:07:58 -08:00
}
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
if ( conf - > send_flush )
2010-04-12 01:28:51 -07:00
{
if ( cw - > bd ) ecore_x_e_comp_flush_send ( cw - > bd - > client . win ) ;
else ecore_x_e_comp_flush_send ( cw - > win ) ;
}
2013-01-09 03:34:07 -08:00
if ( conf - > send_dump )
2010-04-12 01:28:51 -07:00
{
if ( cw - > bd ) ecore_x_e_comp_dump_send ( cw - > bd - > client . win ) ;
else ecore_x_e_comp_dump_send ( cw - > win ) ;
}
2010-01-06 06:18:47 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_raise_above ( E_Comp_Win * cw ,
E_Comp_Win * cw2 )
2010-01-06 06:18:47 -08:00
{
2010-01-08 18:45:50 -08:00
DBG ( " [0x%x] abv [0x%x] \n " , cw - > win , cw2 - > win ) ;
2010-08-01 07:29:19 -07:00
cw - > c - > wins_invalid = 1 ;
2010-01-06 22:29:53 -08:00
cw - > c - > wins = eina_inlist_remove ( cw - > c - > wins , EINA_INLIST_GET ( cw ) ) ;
2011-03-19 23:12:17 -07:00
cw - > c - > wins = eina_inlist_append_relative ( cw - > c - > wins ,
EINA_INLIST_GET ( cw ) ,
2010-01-06 22:29:53 -08:00
EINA_INLIST_GET ( cw2 ) ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_restack ( cw ) ;
_e_comp_win_render_queue ( cw ) ;
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_config_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-01-06 06:18:47 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_raise ( E_Comp_Win * cw )
2010-01-06 06:18:47 -08:00
{
2010-01-08 18:45:50 -08:00
DBG ( " [0x%x] rai \n " , cw - > win ) ;
2010-08-01 07:29:19 -07:00
cw - > c - > wins_invalid = 1 ;
2010-01-06 22:29:53 -08:00
cw - > c - > wins = eina_inlist_remove ( cw - > c - > wins , EINA_INLIST_GET ( cw ) ) ;
cw - > c - > wins = eina_inlist_append ( cw - > c - > wins , EINA_INLIST_GET ( cw ) ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_restack ( cw ) ;
_e_comp_win_render_queue ( cw ) ;
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_config_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-01-06 06:18:47 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_lower ( E_Comp_Win * cw )
2010-01-06 06:18:47 -08:00
{
2010-01-08 18:45:50 -08:00
DBG ( " [0x%x] low \n " , cw - > win ) ;
2010-08-01 07:29:19 -07:00
cw - > c - > wins_invalid = 1 ;
2010-01-06 22:29:53 -08:00
cw - > c - > wins = eina_inlist_remove ( cw - > c - > wins , EINA_INLIST_GET ( cw ) ) ;
cw - > c - > wins = eina_inlist_prepend ( cw - > c - > wins , EINA_INLIST_GET ( cw ) ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_restack ( cw ) ;
_e_comp_win_render_queue ( cw ) ;
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_config_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-01-06 06:18:47 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_configure ( E_Comp_Win * cw ,
int x ,
int y ,
int w ,
int h ,
int border )
2010-01-06 06:18:47 -08:00
{
2012-08-27 02:22:26 -07:00
Eina_Bool moved = EINA_FALSE , resized = EINA_FALSE ;
2013-01-09 03:34:07 -08:00
2010-04-07 23:01:40 -07:00
if ( ! cw - > visible )
{
cw - > hidden . x = x ;
cw - > hidden . y = y ;
cw - > border = border ;
}
else
2010-01-06 06:18:47 -08:00
{
2010-04-07 23:01:40 -07:00
if ( ! ( ( x = = cw - > x ) & & ( y = = cw - > y ) ) )
2010-01-14 20:41:20 -08:00
{
2010-04-07 23:01:40 -07:00
DBG ( " [0x%x] mov %4i %4i \n " , cw - > win , x , y ) ;
cw - > x = x ;
cw - > y = y ;
2013-01-09 03:34:07 -08:00
// evas_object_move(cw->shobj, cw->x, cw->y);
2012-08-27 02:22:26 -07:00
moved = EINA_TRUE ;
2010-01-14 20:41:20 -08:00
}
2010-04-12 01:28:51 -07:00
cw - > hidden . x = x ;
cw - > hidden . y = y ;
2010-01-06 06:18:47 -08:00
}
2011-03-31 01:14:18 -07:00
cw - > hidden . w = w ;
cw - > hidden . h = h ;
if ( cw - > counter )
2010-01-06 06:18:47 -08:00
{
2011-03-31 01:14:18 -07:00
if ( ! ( ( w = = cw - > w ) & & ( h = = cw - > h ) ) )
{
2012-06-28 00:03:44 -07:00
# if 1
2011-03-31 04:05:23 -07:00
cw - > w = w ;
cw - > h = h ;
cw - > needpix = 1 ;
// was cw->w / cw->h
2013-01-09 03:34:07 -08:00
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
2012-08-27 02:22:26 -07:00
resized = EINA_TRUE ;
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
2012-06-28 00:03:44 -07:00
# else
2011-03-31 01:14:18 -07:00
if ( cw - > bd )
{
if ( ( cw - > bd - > shading ) | | ( cw - > bd - > shaded ) )
{
cw - > needpix = 1 ;
// was cw->w / cw->h
2013-01-09 03:34:07 -08:00
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
2012-08-27 02:22:26 -07:00
resized = EINA_TRUE ;
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
2011-03-31 01:14:18 -07:00
}
2011-03-31 01:39:50 -07:00
else
2012-06-28 00:03:44 -07:00
cw - > update = 0 ;
2011-03-31 01:14:18 -07:00
}
else
{
cw - > update = 0 ;
2013-01-09 03:34:07 -08:00
// if (cw->ready_timeout) ecore_timer_del(cw->ready_timeout);
// cw->ready_timeout = ecore_timer_add
// (conf->first_draw_delay,
// _e_comp_cb_win_show_ready_timeout, cw);
2011-03-31 01:14:18 -07:00
}
2012-06-28 00:03:44 -07:00
# endif
2011-03-31 01:14:18 -07:00
}
if ( cw - > border ! = border )
{
cw - > border = border ;
cw - > needpix = 1 ;
// was cw->w / cw->h
2013-01-09 03:34:07 -08:00
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
2012-08-27 02:22:26 -07:00
resized = EINA_TRUE ;
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
2011-03-31 01:14:18 -07:00
}
if ( ( cw - > input_only ) | | ( cw - > invalid ) ) return ;
2010-01-06 06:18:47 -08:00
}
2011-03-31 01:14:18 -07:00
else
2010-01-08 03:29:32 -08:00
{
2011-03-31 01:14:18 -07:00
if ( ! ( ( w = = cw - > w ) & & ( h = = cw - > h ) ) )
{
DBG ( " [0x%x] rsz %4ix%4i \n " , cw - > win , w , h ) ;
cw - > w = w ;
cw - > h = h ;
cw - > needpix = 1 ;
// was cw->w / cw->h
2013-01-09 03:34:07 -08:00
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
2012-08-27 02:22:26 -07:00
resized = EINA_TRUE ;
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
2011-03-31 01:14:18 -07:00
}
if ( cw - > border ! = border )
{
cw - > border = border ;
cw - > needpix = 1 ;
2013-01-09 03:34:07 -08:00
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
2012-08-27 02:22:26 -07:00
resized = EINA_TRUE ;
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
2011-03-31 01:14:18 -07:00
}
if ( ( cw - > input_only ) | | ( cw - > invalid ) ) return ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-01-08 03:29:32 -08:00
}
2013-01-09 03:34:07 -08:00
if ( moved | | resized ) _e_comp_win_geometry_update ( cw ) ;
2011-03-31 01:14:18 -07:00
// add pending manager comp event count to match below config send
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
2011-03-19 23:12:17 -07:00
e_manager_comp_event_src_config_send ( cw - > c - > man ,
2010-11-02 21:53:17 -07:00
( E_Manager_Comp_Source * ) cw ,
2013-01-09 03:34:07 -08:00
_e_comp_cb_pending_after , cw - > c ) ;
2010-01-06 06:18:47 -08:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( E_Comp_Win * cw ,
int x ,
int y ,
int w ,
int h ,
Eina_Bool dmg )
2010-01-06 06:18:47 -08:00
{
2010-02-05 23:04:17 -08:00
if ( ( cw - > input_only ) | | ( cw - > invalid ) ) return ;
2011-03-19 23:12:17 -07:00
DBG ( " [0x%x] dmg [%x] %4i %4i %4ix%4i \n " , cw - > win , cw - > damage , x , y , w , h ) ;
2010-01-08 18:45:50 -08:00
if ( ( dmg ) & & ( cw - > damage ) )
2010-01-06 06:18:47 -08:00
{
2010-01-08 03:29:32 -08:00
Ecore_X_Region parts ;
2011-02-10 09:26:40 -08:00
2010-01-08 03:29:32 -08:00
parts = ecore_x_region_new ( NULL , 0 ) ;
ecore_x_damage_subtract ( cw - > damage , 0 , parts ) ;
ecore_x_region_free ( parts ) ;
2010-02-11 00:05:19 -08:00
cw - > dmg_updates + + ;
2010-01-06 06:18:47 -08:00
}
2012-09-20 06:40:19 -07:00
if ( cw - > nocomp ) return ;
if ( cw - > c - > nocomp )
{
cw - > nocomp_need_update = EINA_TRUE ;
return ;
}
2013-01-09 03:34:07 -08:00
e_comp_update_add ( cw - > up , x , y , w , h ) ;
2010-02-10 06:13:29 -08:00
if ( dmg )
2010-02-01 06:15:14 -08:00
{
2010-02-10 06:13:29 -08:00
if ( cw - > counter )
{
if ( ! cw - > update_timeout )
cw - > update_timeout = ecore_timer_add
2013-01-09 03:34:07 -08:00
( ecore_animator_frametime_get ( ) * 2 ,
_e_comp_win_damage_timeout , cw ) ;
2010-02-10 06:13:29 -08:00
return ;
}
2010-02-01 06:15:14 -08:00
}
2010-01-06 22:29:53 -08:00
if ( ! cw - > update )
{
cw - > update = 1 ;
cw - > c - > updates = eina_list_append ( cw - > c - > updates , cw ) ;
}
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-01-06 06:18:47 -08:00
}
2010-01-10 18:47:59 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_reshape ( E_Comp_Win * cw )
2010-01-10 18:47:59 -08:00
{
if ( cw - > shape_changed ) return ;
cw - > shape_changed = 1 ;
2012-09-20 06:40:19 -07:00
if ( cw - > c - > nocomp )
{
cw - > nocomp_need_update = EINA_TRUE ;
return ;
}
2010-01-10 18:47:59 -08:00
if ( ! cw - > update )
{
cw - > update = 1 ;
cw - > c - > updates = eina_list_append ( cw - > c - > updates , cw ) ;
}
2013-01-09 03:34:07 -08:00
e_comp_update_add ( cw - > up , 0 , 0 , cw - > w , cw - > h ) ;
_e_comp_win_render_queue ( cw ) ;
2010-01-10 18:47:59 -08:00
}
2010-01-06 06:18:47 -08:00
//////////////////////////////////////////////////////////////////////////
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_create ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-14 20:41:20 -08:00
{
2010-01-06 06:18:47 -08:00
Ecore_X_Event_Window_Create * ev = event ;
2010-01-14 20:41:20 -08:00
E_Comp_Win * cw ;
2013-01-09 03:34:07 -08:00
E_Comp * c = _e_comp_find ( ev - > parent ) ;
2010-06-24 09:19:12 -07:00
if ( ! c ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
if ( _e_comp_win_find ( ev - > win ) ) return ECORE_CALLBACK_PASS_ON ;
2010-06-24 09:19:12 -07:00
if ( c - > win = = ev - > win ) return ECORE_CALLBACK_PASS_ON ;
if ( c - > ee_win = = ev - > win ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
cw = _e_comp_win_add ( c , ev - > win ) ;
if ( cw ) _e_comp_win_configure ( cw , ev - > x , ev - > y , ev - > w , ev - > h , ev - > border ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_destroy ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-14 20:41:20 -08:00
{
2010-01-06 06:18:47 -08:00
Ecore_X_Event_Window_Destroy * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-04-07 23:01:40 -07:00
if ( cw - > animating ) cw - > delete_me = 1 ;
2013-01-09 03:34:07 -08:00
else _e_comp_win_del ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_show ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Event_Window_Show * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
/*
Vincent Torri via lists . sourceforge . net
2 : 31 PM ( 8 minutes ago )
to enlightenment - devel .
would it be possible to add a note in the code , about the reason of
that change ?
Vincent
On Thu , Jun 21 , 2012 at 3 : 29 PM , Enlightenment SVN
< no - reply @ enlightenment . org > wrote :
> Log :
> gtk developers with IQs over 180 enjoy hiding and showing their windows constantly ,
> especially when resizing . this broke e ' s comp since we are not nearly that clever
> and try to defer hide animations in most cases . undoing the defer whenever
> this happens allows us to keep up with their towering genius .
> fixes ticket # 765 and probably some others .
> affected apps : claws - mail , firefox
*/
2012-10-25 06:47:20 -07:00
if ( cw - > defer_hide )
{
/*
* this flag was added to further increase compatibility with such magnificent
* gui programming specialists as described in the above comment . another corner
* case of the previously - mentioned genius involves the menus of this incredible toolkit :
* when activating and deactivating menus quickly , gtk sends two separate hide events for
* the same window back - to - back . this means we end up with HIDE - SHOW - HIDE because
* the next activation comes between the hides . to prevent this , we set the defer_show
* flag , which tells comp to ignore the next hide event and to ignore the window ' s DAMAGE
2013-01-09 03:34:07 -08:00
* event counter when evaluating whether to show it in _e_comp_win_show ( ) below . in this
2012-10-25 06:47:20 -07:00
* way , we ensure that such menus will always be shown .
* ticket # 1558
*/
cw - > defer_show = 1 ;
}
2012-06-21 06:29:45 -07:00
cw - > defer_hide = 0 ;
2010-06-24 09:19:12 -07:00
if ( cw - > visible ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_show ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_hide ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Event_Window_Hide * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
if ( ! cw - > visible ) return ECORE_CALLBACK_PASS_ON ;
2012-10-25 06:47:20 -07:00
if ( cw - > defer_show ) cw - > defer_show = 0 ;
2013-01-09 03:34:07 -08:00
else _e_comp_win_real_hide ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_reparent ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Event_Window_Reparent * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-01-08 18:45:50 -08:00
DBG ( " == repar [0x%x] to [0x%x] \n " , ev - > win , ev - > parent ) ;
2010-01-06 06:18:47 -08:00
if ( ev - > parent ! = cw - > c - > man - > root )
2013-01-09 03:34:07 -08:00
_e_comp_win_del ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_configure ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Event_Window_Configure * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
if ( ev - > abovewin = = 0 )
{
2013-01-09 03:34:07 -08:00
if ( EINA_INLIST_GET ( cw ) - > prev ) _e_comp_win_lower ( cw ) ;
2010-01-06 06:18:47 -08:00
}
else
{
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw2 = _e_comp_win_find ( ev - > abovewin ) ;
2010-01-06 06:18:47 -08:00
if ( cw2 )
{
2010-01-14 20:41:20 -08:00
E_Comp_Win * cw3 = ( E_Comp_Win * ) ( EINA_INLIST_GET ( cw ) - > prev ) ;
2010-01-06 22:29:53 -08:00
2013-01-09 03:34:07 -08:00
if ( cw3 ! = cw2 ) _e_comp_win_raise_above ( cw , cw2 ) ;
2010-01-06 06:18:47 -08:00
}
}
2011-02-10 09:26:40 -08:00
2010-01-06 06:18:47 -08:00
if ( ! ( ( cw - > x = = ev - > x ) & & ( cw - > y = = ev - > y ) & &
2010-05-27 09:00:28 -07:00
( cw - > w = = ev - > w ) & & ( cw - > h = = ev - > h ) & &
2010-01-06 06:18:47 -08:00
( cw - > border = = ev - > border ) ) )
{
2013-01-09 03:34:07 -08:00
_e_comp_win_configure ( cw , ev - > x , ev - > y , ev - > w , ev - > h , ev - > border ) ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_stack ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Event_Window_Stack * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
if ( ev - > detail = = ECORE_X_WINDOW_STACK_ABOVE ) _e_comp_win_raise ( cw ) ;
else _e_comp_win_lower ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2011-03-16 14:25:35 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_win_opacity_set ( E_Comp_Win * cw )
2011-03-16 14:25:35 -07:00
{
unsigned int val ;
if ( ecore_x_window_prop_card32_get ( cw - > win , ECORE_X_ATOM_NET_WM_WINDOW_OPACITY , & val , 1 ) > 0 )
{
2011-03-19 23:12:17 -07:00
cw - > opacity = ( val > > 24 ) ;
evas_object_color_set ( cw - > shobj , cw - > opacity , cw - > opacity , cw - > opacity , cw - > opacity ) ;
2011-03-16 14:25:35 -07:00
}
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_property ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event __UNUSED__ )
2010-01-14 20:41:20 -08:00
{
2011-03-16 14:25:35 -07:00
Ecore_X_Event_Window_Property * ev = event ;
if ( ev - > atom = = ECORE_X_ATOM_NET_WM_WINDOW_OPACITY )
{
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2011-03-19 23:12:17 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_opacity_set ( cw ) ;
2011-03-16 14:25:35 -07:00
}
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_message ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-14 20:41:20 -08:00
{
2010-01-06 06:18:47 -08:00
Ecore_X_Event_Client_Message * ev = event ;
2010-02-01 06:15:14 -08:00
E_Comp_Win * cw = NULL ;
2011-03-31 01:14:18 -07:00
int version , w = 0 , h = 0 ;
Eina_Bool force = 0 ;
2012-06-28 00:03:44 -07:00
2011-03-16 14:25:35 -07:00
if ( ev - > message_type = = ECORE_X_ATOM_NET_WM_WINDOW_OPACITY )
{
2013-01-09 03:34:07 -08:00
cw = _e_comp_win_find ( ev - > win ) ;
2011-03-19 23:12:17 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_opacity_set ( cw ) ;
2011-03-19 23:12:17 -07:00
return ECORE_CALLBACK_PASS_ON ;
2011-03-16 14:25:35 -07:00
}
2010-02-01 06:15:14 -08:00
if ( ( ev - > message_type ! = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE ) | |
2010-06-24 09:19:12 -07:00
( ev - > format ! = 32 ) ) return ECORE_CALLBACK_PASS_ON ;
2011-03-31 01:14:18 -07:00
version = ev - > data . l [ 1 ] ;
2013-01-09 03:34:07 -08:00
cw = _e_comp_border_client_find ( ev - > data . l [ 0 ] ) ;
2010-10-15 00:22:17 -07:00
if ( cw )
{
if ( ! cw - > bd ) return ECORE_CALLBACK_PASS_ON ;
2011-10-16 08:35:53 -07:00
if ( ev - > data . l [ 0 ] ! = ( int ) cw - > bd - > client . win ) return ECORE_CALLBACK_PASS_ON ;
2010-10-15 00:22:17 -07:00
}
else
{
2013-01-09 03:34:07 -08:00
cw = _e_comp_win_find ( ev - > data . l [ 0 ] ) ;
2010-10-15 00:22:17 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2011-10-16 08:35:53 -07:00
if ( ev - > data . l [ 0 ] ! = ( int ) cw - > win ) return ECORE_CALLBACK_PASS_ON ;
2010-10-15 00:22:17 -07:00
}
2011-03-31 01:14:18 -07:00
if ( version = = 1 ) // v 0 was first, v1 added size params
{
w = ev - > data . l [ 2 ] ;
h = ev - > data . l [ 3 ] ;
if ( cw - > bd )
{
int clw , clh ;
2012-06-28 00:03:44 -07:00
2011-03-31 01:14:18 -07:00
if ( ( cw - > bd - > shading ) | | ( cw - > bd - > shaded ) ) force = 1 ;
2012-06-28 00:03:44 -07:00
clw = cw - > hidden . w -
2013-01-09 03:34:07 -08:00
cw - > bd - > client_inset . l -
cw - > bd - > client_inset . r ;
2012-06-28 00:03:44 -07:00
clh = cw - > hidden . h -
2013-01-09 03:34:07 -08:00
cw - > bd - > client_inset . t -
cw - > bd - > client_inset . b ;
2012-06-28 00:03:44 -07:00
DBG ( " [0x%x] sync draw done @%4ix%4i, bd %4ix%4i \n " , cw - > win ,
2011-03-31 01:14:18 -07:00
w , h , cw - > bd - > client . w , cw - > bd - > client . h ) ;
2012-06-28 00:03:44 -07:00
if ( ( w ! = clw ) | | ( h ! = clh ) )
2011-03-31 01:14:18 -07:00
{
cw - > misses + + ;
if ( cw - > misses > 1 )
{
cw - > misses = 0 ;
force = 1 ;
}
else return ECORE_CALLBACK_PASS_ON ;
}
cw - > misses = 0 ;
}
else
{
DBG ( " [0x%x] sync draw done @%4ix%4i, cw %4ix%4i \n " , cw - > win , w , h , cw - > hidden . w , cw - > hidden . h ) ;
if ( ( w ! = cw - > hidden . w ) | | ( h ! = cw - > hidden . h ) )
{
if ( cw - > misses > 1 )
{
cw - > misses = 0 ;
force = 1 ;
}
else return ECORE_CALLBACK_PASS_ON ;
}
cw - > misses = 0 ;
}
}
2010-10-15 00:22:17 -07:00
DBG ( " [0x%x] sync draw done %4ix%4i \n " , cw - > win , cw - > w , cw - > h ) ;
2013-01-09 03:34:07 -08:00
// if (cw->bd)
{
if ( cw - > counter )
{
DBG ( " [0x%x] have counter \n " , cw - > win ) ;
cw - > show_ready = 1 ;
if ( ! cw - > update )
{
DBG ( " [0x%x] set update \n " , cw - > win ) ;
if ( cw - > update_timeout )
{
DBG ( " [0x%x] del timeout \n " , cw - > win ) ;
ecore_timer_del ( cw - > update_timeout ) ;
cw - > update_timeout = NULL ;
}
cw - > update = 1 ;
cw - > c - > updates = eina_list_append ( cw - > c - > updates , cw ) ;
}
if ( ( cw - > w ! = cw - > hidden . w ) | |
( cw - > h ! = cw - > hidden . h ) | |
( force ) )
{
DBG ( " [0x%x] rsz done msg %4ix%4i \n " , cw - > win , cw - > hidden . w , cw - > hidden . h ) ;
cw - > w = cw - > hidden . w ;
cw - > h = cw - > hidden . h ;
cw - > needpix = 1 ;
// was cw->w / cw->h
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
_e_comp_win_geometry_update ( cw ) ;
_e_comp_win_damage ( cw , 0 , 0 , cw - > w , cw - > h , 0 ) ;
}
cw - > drawme = 1 ;
_e_comp_win_render_queue ( cw ) ;
}
}
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_shape ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-14 20:41:20 -08:00
{
2010-01-06 06:18:47 -08:00
Ecore_X_Event_Window_Shape * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-08-06 18:36:35 -07:00
if ( ev - > type ! = ECORE_X_SHAPE_BOUNDING ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_reshape ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_damage ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-01-06 06:18:47 -08:00
{
Ecore_X_Event_Damage * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_damage_find ( ev - > damage ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_damage ( cw ,
ev - > area . x , ev - > area . y ,
ev - > area . width , ev - > area . height , 1 ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-06 06:18:47 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_damage_win ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-03-16 01:54:57 -07:00
{
Ecore_X_Event_Window_Damage * ev = event ;
Eina_List * l ;
E_Comp * c ;
2011-02-10 09:26:40 -08:00
2010-03-16 01:54:57 -07:00
// fixme: use hash if compositors list > 4
EINA_LIST_FOREACH ( compositors , l , c )
{
if ( ev - > win = = c - > ee_win )
{
// expose on comp win - init win or some other bypass win did it
2011-08-01 18:02:14 -07:00
DBG ( " JOB4... \n " ) ;
2013-01-09 03:34:07 -08:00
_e_comp_render_queue ( c ) ;
2011-08-01 18:02:14 -07:00
break ;
2010-03-16 01:54:57 -07:00
}
}
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-03-16 01:54:57 -07:00
}
2012-09-20 06:40:19 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_override_expire ( void * data )
2012-09-20 06:40:19 -07:00
{
E_Comp * c = data ;
c - > nocomp_override_timer = NULL ;
c - > nocomp_override - - ;
2013-01-09 03:34:07 -08:00
2012-09-20 06:40:19 -07:00
if ( c - > nocomp_override < = 0 )
{
c - > nocomp_override = 0 ;
2013-01-09 03:34:07 -08:00
if ( c - > nocomp_want ) _e_comp_cb_nocomp_begin ( c ) ;
2012-09-20 06:40:19 -07:00
}
return EINA_FALSE ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_override_timed_pop ( E_Comp * c )
2012-09-20 06:40:19 -07:00
{
if ( c - > nocomp_override < = 0 ) return ;
if ( c - > nocomp_override_timer )
2013-01-09 03:34:07 -08:00
ecore_timer_del ( c - > nocomp_override_timer ) ;
2012-09-20 06:40:19 -07:00
c - > nocomp_override_timer =
2013-01-09 03:34:07 -08:00
ecore_timer_add ( 5.0 , _e_comp_override_expire , c ) ;
2012-09-20 06:40:19 -07:00
}
2012-09-21 01:35:24 -07:00
/* here for completeness
2013-01-09 03:34:07 -08:00
static void
_e_comp_override_pop ( E_Comp * c )
{
2012-09-20 06:40:19 -07:00
c - > nocomp_override - - ;
if ( c - > nocomp_override < = 0 )
2013-01-09 03:34:07 -08:00
{
c - > nocomp_override = 0 ;
if ( c - > nocomp_want ) _e_comp_cb_nocomp_begin ( c ) ;
}
}
*/
2012-09-20 06:40:19 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_override_push ( E_Comp * c )
2012-09-20 06:40:19 -07:00
{
c - > nocomp_override + + ;
2013-01-09 03:34:07 -08:00
if ( ( c - > nocomp_override > 0 ) & & ( c - > nocomp ) ) _e_comp_cb_nocomp_end ( c ) ;
2012-09-20 06:40:19 -07:00
}
2012-12-08 22:27:42 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_fade_handle ( E_Comp_Zone * cz , int out , double tim )
2012-12-08 22:27:42 -08:00
{
if ( out = = 1 )
{
if ( e_backlight_exists ( ) )
{
e_backlight_update ( ) ;
cz - > bloff = EINA_TRUE ;
cz - > bl = e_backlight_level_get ( cz - > zone ) ;
e_backlight_level_set ( cz - > zone , 0.0 , tim ) ;
}
}
else
{
if ( e_backlight_exists ( ) )
{
cz - > bloff = EINA_FALSE ;
e_backlight_update ( ) ;
if ( e_backlight_mode_get ( cz - > zone ) ! = E_BACKLIGHT_MODE_NORMAL )
e_backlight_mode_set ( cz - > zone , E_BACKLIGHT_MODE_NORMAL ) ;
else
e_backlight_level_set ( cz - > zone , e_config - > backlight . normal , tim ) ;
}
}
}
2012-08-26 08:36:05 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_screensaver_on ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event __UNUSED__ )
2012-08-26 08:36:05 -07:00
{
2012-08-27 02:22:26 -07:00
Eina_List * l , * ll ;
E_Comp_Zone * cz ;
2012-08-26 08:36:05 -07:00
E_Comp * c ;
// fixme: use hash if compositors list > 4
EINA_LIST_FOREACH ( compositors , l , c )
{
2012-12-08 22:27:42 -08:00
if ( ! c - > saver )
2012-08-26 08:36:05 -07:00
{
2012-12-08 22:27:42 -08:00
c - > saver = EINA_TRUE ;
2012-08-27 02:22:26 -07:00
EINA_LIST_FOREACH ( c - > zones , ll , cz )
{
2013-01-09 03:34:07 -08:00
_e_comp_override_push ( c ) ;
_e_comp_fade_handle ( cz , 1 , 3.0 ) ;
2012-12-08 22:27:42 -08:00
edje_object_signal_emit ( cz - > base ,
" e,state,screensaver,on " , " e " ) ;
edje_object_signal_emit ( cz - > over ,
" e,state,screensaver,on " , " e " ) ;
}
}
}
return ECORE_CALLBACK_PASS_ON ;
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_screensaver_off ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event __UNUSED__ )
2012-12-08 22:27:42 -08:00
{
Eina_List * l , * ll ;
E_Comp_Zone * cz ;
E_Comp * c ;
// fixme: use hash if compositors list > 4
EINA_LIST_FOREACH ( compositors , l , c )
{
if ( c - > saver )
{
c - > saver = EINA_FALSE ;
EINA_LIST_FOREACH ( c - > zones , ll , cz )
{
edje_object_signal_emit ( cz - > base ,
" e,state,screensaver,off " , " e " ) ;
edje_object_signal_emit ( cz - > over ,
" e,state,screensaver,off " , " e " ) ;
2013-01-09 03:34:07 -08:00
_e_comp_fade_handle ( cz , 0 , 0.5 ) ;
_e_comp_override_timed_pop ( c ) ;
2012-08-27 02:22:26 -07:00
}
2012-08-26 08:36:05 -07:00
}
}
return ECORE_CALLBACK_PASS_ON ;
}
2012-08-27 02:22:26 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_zone_fill ( E_Comp * c , E_Comp_Zone * cz )
2012-08-27 02:22:26 -07:00
{
Evas_Object * o ;
2013-01-11 01:21:39 -08:00
const char * const styles [ ] =
{
" e/modules/comp/screen/overlay/default " ,
" e/modules/comp/screen/overlay/noeffects "
} ;
2013-01-09 03:34:07 -08:00
2013-01-11 01:21:39 -08:00
if ( cz - > over )
{
e_theme_edje_object_set ( cz - > over , " base/theme/modules/comp " ,
styles [ conf - > disable_screen_effects ] ) ;
return ;
}
2012-08-27 02:22:26 -07:00
cz - > base = o = edje_object_add ( c - > evas ) ;
e_theme_edje_object_set ( o , " base/theme/modules/comp " ,
" e/modules/comp/screen/base/default " ) ;
evas_object_move ( o , cz - > zone - > x , cz - > zone - > y ) ;
evas_object_resize ( o , cz - > zone - > w , cz - > zone - > h ) ;
evas_object_lower ( o ) ;
evas_object_show ( o ) ;
cz - > over = o = edje_object_add ( c - > evas ) ;
e_theme_edje_object_set ( o , " base/theme/modules/comp " ,
2013-01-11 01:21:39 -08:00
styles [ conf - > disable_screen_effects ] ) ;
2012-08-27 02:22:26 -07:00
evas_object_move ( o , cz - > zone - > x , cz - > zone - > y ) ;
evas_object_resize ( o , cz - > zone - > w , cz - > zone - > h ) ;
evas_object_raise ( o ) ;
evas_object_show ( o ) ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_screens_eval ( E_Comp * c )
2012-08-27 02:22:26 -07:00
{
Eina_List * l , * ll ;
E_Container * con ;
E_Zone * zone ;
E_Comp_Zone * cz ;
int zn , cn ;
EINA_LIST_FREE ( c - > zones , cz )
{
evas_object_del ( cz - > base ) ;
evas_object_del ( cz - > over ) ;
2012-12-08 22:27:42 -08:00
if ( cz - > bloff )
{
if ( e_backlight_mode_get ( cz - > zone ) ! = E_BACKLIGHT_MODE_NORMAL )
e_backlight_mode_set ( cz - > zone , E_BACKLIGHT_MODE_NORMAL ) ;
e_backlight_level_set ( cz - > zone , e_config - > backlight . normal , 0.0 ) ;
}
2012-08-27 02:22:26 -07:00
free ( cz ) ;
}
cn = 0 ;
EINA_LIST_FOREACH ( c - > man - > containers , l , con )
{
zn = 0 ;
EINA_LIST_FOREACH ( con - > zones , ll , zone )
{
cz = calloc ( 1 , sizeof ( E_Comp_Zone ) ) ;
if ( cz )
{
cz - > zone = zone ;
cz - > container_num = cn ;
cz - > zone_num = zn ;
cz - > x = zone - > x ;
cz - > y = zone - > y ;
cz - > w = zone - > w ;
cz - > h = zone - > h ;
2013-01-09 03:34:07 -08:00
_e_comp_zone_fill ( c , cz ) ;
2012-08-27 02:22:26 -07:00
c - > zones = eina_list_append ( c - > zones , cz ) ;
}
zn + + ;
}
cn + + ;
}
e_layout_freeze ( c - > layout ) ;
evas_object_move ( c - > layout , 0 , 0 ) ;
evas_object_resize ( c - > layout , c - > man - > w , c - > man - > h ) ;
e_layout_virtual_size_set ( c - > layout , c - > man - > w , c - > man - > h ) ;
e_layout_thaw ( c - > layout ) ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_screen_change ( void * data )
2012-08-27 02:22:26 -07:00
{
E_Comp * c = data ;
2013-01-09 03:34:07 -08:00
2012-08-27 02:22:26 -07:00
c - > screen_job = NULL ;
2012-09-20 06:40:19 -07:00
if ( ! c - > nocomp ) ecore_evas_resize ( c - > ee , c - > man - > w , c - > man - > h ) ;
2013-01-09 03:34:07 -08:00
_e_comp_screens_eval ( c ) ;
2012-08-27 02:22:26 -07:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_randr ( void * data __UNUSED__ ,
int type __UNUSED__ ,
__UNUSED__ void * event )
2010-01-14 21:54:14 -08:00
{
Eina_List * l ;
E_Comp * c ;
EINA_LIST_FOREACH ( compositors , l , c )
{
2012-08-27 02:22:26 -07:00
if ( c - > screen_job ) ecore_job_del ( c - > screen_job ) ;
2013-01-09 03:34:07 -08:00
c - > screen_job = ecore_job_add ( _e_comp_screen_change , c ) ;
2012-08-27 02:22:26 -07:00
}
return ECORE_CALLBACK_PASS_ON ;
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_zonech ( void * data __UNUSED__ ,
int type __UNUSED__ ,
__UNUSED__ void * event )
2012-08-27 02:22:26 -07:00
{
Eina_List * l ;
E_Comp * c ;
EINA_LIST_FOREACH ( compositors , l , c )
{
if ( c - > screen_job ) ecore_job_del ( c - > screen_job ) ;
2013-01-09 03:34:07 -08:00
c - > screen_job = ecore_job_add ( _e_comp_screen_change , c ) ;
2010-01-14 21:54:14 -08:00
}
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_add ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Add * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
// fimxe: add/enable compositing here not in show event for borders
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_del ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Remove * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
if ( cw - > bd = = ev - > border ) _e_comp_object_del ( cw , ev - > border ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_show ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Show * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-08-03 02:03:58 -07:00
if ( cw - > visible ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_show ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_hide ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Hide * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-08-03 02:03:58 -07:00
if ( ! cw - > visible ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_win_hide ( cw ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_move ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-09 23:47:59 -08:00
{
E_Event_Border_Move * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-02-09 23:47:59 -08:00
// fimxe: do move here for composited bd
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-09 23:47:59 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_resize ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-09 23:47:59 -08:00
{
E_Event_Border_Resize * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-02-09 23:47:59 -08:00
// fimxe: do resize here instead of conf notify
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-09 23:47:59 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_iconify ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Iconify * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
// fimxe: special iconfiy anim
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_uniconify ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Uniconify * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
// fimxe: special uniconfiy anim
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_urgent_change ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Urgent_Change * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-04-12 01:28:51 -07:00
if ( cw - > bd - > client . icccm . urgent )
edje_object_signal_emit ( cw - > shobj , " e,state,urgent,on " , " e " ) ;
else
edje_object_signal_emit ( cw - > shobj , " e,state,urgent,off " , " e " ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_focus_in ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Focus_In * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-04-12 01:28:51 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,focus,on " , " e " ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_focus_out ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Focus_Out * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-04-12 01:28:51 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,focus,off " , " e " ) ;
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-02-05 23:04:17 -08:00
}
2010-06-24 09:19:12 -07:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_property ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2010-02-05 23:04:17 -08:00
{
E_Event_Border_Property * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2010-06-24 09:19:12 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2010-04-12 01:28:51 -07:00
// fimxe: other properties?
2010-06-24 09:19:12 -07:00
return ECORE_CALLBACK_PASS_ON ;
2010-01-14 21:54:14 -08:00
}
2012-08-10 06:20:36 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_reshadow ( E_Comp_Win * cw )
2012-08-10 06:20:36 -07:00
{
if ( cw - > visible ) evas_object_hide ( cw - > shobj ) ;
2013-01-09 03:34:07 -08:00
_e_comp_win_shadow_setup ( cw ) ;
// evas_object_move(cw->shobj, cw->x, cw->y);
// evas_object_resize(cw->shobj, cw->pw, cw->ph);
_e_comp_win_geometry_update ( cw ) ;
2012-08-10 06:20:36 -07:00
if ( cw - > visible )
{
evas_object_show ( cw - > shobj ) ;
if ( cw - > show_ready )
{
cw - > defer_hide = 0 ;
2013-01-09 03:34:07 -08:00
if ( ! cw - > hidden_override ) _e_comp_child_show ( cw ) ;
2012-08-10 06:20:36 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,visible,on " , " e " ) ;
if ( ! cw - > animating )
{
cw - > c - > animating + + ;
}
cw - > animating = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2012-08-10 06:20:36 -07:00
}
}
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_fullscreen ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2012-08-10 06:20:36 -07:00
{
E_Event_Border_Property * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2012-08-10 06:20:36 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_reshadow ( cw ) ;
2012-08-10 06:20:36 -07:00
return ECORE_CALLBACK_PASS_ON ;
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_bd_unfullscreen ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2012-08-10 06:20:36 -07:00
{
E_Event_Border_Property * ev = event ;
2013-01-09 03:34:07 -08:00
E_Comp_Win * cw = _e_comp_win_find ( ev - > border - > win ) ;
2012-08-10 06:20:36 -07:00
if ( ! cw ) return ECORE_CALLBACK_PASS_ON ;
2013-01-09 03:34:07 -08:00
_e_comp_reshadow ( cw ) ;
2012-08-10 06:20:36 -07:00
return ECORE_CALLBACK_PASS_ON ;
}
2010-01-14 20:41:20 -08:00
//////////////////////////////////////////////////////////////////////////
2012-09-10 04:01:11 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_fps_toggle ( void )
2012-09-10 04:01:11 -07:00
{
2013-01-09 03:34:07 -08:00
Eina_List * l ;
E_Comp * c ;
2012-09-10 04:01:11 -07:00
2013-01-09 03:34:07 -08:00
if ( conf - > fps_show )
{
conf - > fps_show = 0 ;
e_config_save_queue ( ) ;
}
else
{
conf - > fps_show = 1 ;
e_config_save_queue ( ) ;
2012-09-10 04:01:11 -07:00
}
2013-01-09 03:34:07 -08:00
EINA_LIST_FOREACH ( compositors , l , c ) _e_comp_cb_update ( c ) ;
2012-09-10 04:01:11 -07:00
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_key_down ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2012-09-10 04:01:11 -07:00
{
Ecore_Event_Key * ev = event ;
2013-01-09 03:34:07 -08:00
if ( ( ! strcasecmp ( ev - > keyname , " f " ) ) & &
2012-09-10 04:01:11 -07:00
( ev - > modifiers & ECORE_EVENT_MODIFIER_SHIFT ) & &
( ev - > modifiers & ECORE_EVENT_MODIFIER_CTRL ) & &
( ev - > modifiers & ECORE_EVENT_MODIFIER_ALT ) )
{
2013-01-09 03:34:07 -08:00
_e_comp_fps_toggle ( ) ;
2012-09-10 04:01:11 -07:00
}
return ECORE_CALLBACK_PASS_ON ;
}
2010-01-14 20:41:20 -08:00
2012-01-06 02:26:02 -08:00
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_signal_user ( void * data __UNUSED__ ,
int type __UNUSED__ ,
void * event )
2012-01-06 02:26:02 -08:00
{
Ecore_Event_Signal_User * ev = event ;
2012-06-28 00:03:44 -07:00
2012-01-06 02:26:02 -08:00
if ( ev - > number = = 1 )
{
// e17 uses this to pop up config panel
}
else if ( ev - > number = = 2 )
{
2013-01-09 03:34:07 -08:00
_e_comp_fps_toggle ( ) ;
2012-01-06 02:26:02 -08:00
}
return ECORE_CALLBACK_PASS_ON ;
}
2010-05-21 02:34:58 -07:00
//////////////////////////////////////////////////////////////////////////
2010-08-01 07:29:19 -07:00
static Evas *
2013-01-09 03:34:07 -08:00
_e_comp_evas_get_func ( void * data ,
E_Manager * man __UNUSED__ )
2010-08-01 07:29:19 -07:00
{
E_Comp * c = data ;
return c - > evas ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_update_func ( void * data ,
E_Manager * man __UNUSED__ )
2010-08-01 07:29:19 -07:00
{
E_Comp * c = data ;
2013-01-09 03:34:07 -08:00
_e_comp_render_queue ( c ) ;
2010-08-01 07:29:19 -07:00
}
2012-07-05 07:57:05 -07:00
static E_Manager_Comp_Source *
2013-01-09 03:34:07 -08:00
_e_comp_border_src_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
Ecore_X_Window win )
2012-07-05 07:57:05 -07:00
{
2013-01-09 03:34:07 -08:00
return ( E_Manager_Comp_Source * ) _e_comp_border_client_find ( win ) ;
2012-07-05 07:57:05 -07:00
}
2011-10-10 13:30:33 -07:00
static E_Manager_Comp_Source *
2013-01-09 03:34:07 -08:00
_e_comp_src_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
Ecore_X_Window win )
2011-10-10 13:30:33 -07:00
{
2013-01-09 03:34:07 -08:00
return ( E_Manager_Comp_Source * ) _e_comp_win_find ( win ) ;
2011-10-10 13:30:33 -07:00
}
2010-08-01 07:29:19 -07:00
static const Eina_List *
2013-01-09 03:34:07 -08:00
_e_comp_src_list_get_func ( void * data ,
E_Manager * man __UNUSED__ )
2010-08-01 07:29:19 -07:00
{
E_Comp * c = data ;
E_Comp_Win * cw ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
if ( ! c - > wins ) return NULL ;
if ( c - > wins_invalid )
{
c - > wins_invalid = 0 ;
if ( c - > wins_list ) eina_list_free ( c - > wins_list ) ;
c - > wins_list = NULL ;
2010-08-02 23:10:33 -07:00
EINA_INLIST_FOREACH ( c - > wins , cw )
2010-08-01 07:29:19 -07:00
{
2010-08-02 23:10:33 -07:00
if ( ( cw - > shobj ) & & ( cw - > obj ) )
2011-03-19 23:12:17 -07:00
c - > wins_list = eina_list_append ( c - > wins_list , cw ) ;
2010-08-01 07:29:19 -07:00
}
}
return c - > wins_list ;
}
static Evas_Object *
2013-01-09 03:34:07 -08:00
_e_comp_src_image_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2010-08-01 07:29:19 -07:00
{
2013-01-09 03:34:07 -08:00
// E_Comp *c = data;
2012-06-28 00:03:44 -07:00
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return NULL ;
return cw - > obj ;
2010-08-01 07:29:19 -07:00
}
static Evas_Object *
2013-01-09 03:34:07 -08:00
_e_comp_src_shadow_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2010-08-01 07:29:19 -07:00
{
2013-01-09 03:34:07 -08:00
// E_Comp *c = data;
2012-06-28 00:03:44 -07:00
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return NULL ;
return cw - > shobj ;
2010-08-01 07:29:19 -07:00
}
static Evas_Object *
2013-01-09 03:34:07 -08:00
_e_comp_src_image_mirror_add_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2010-08-01 07:29:19 -07:00
{
2013-01-09 03:34:07 -08:00
// E_Comp *c = data;
2012-06-28 00:03:44 -07:00
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return NULL ;
2013-01-09 03:34:07 -08:00
return _e_comp_win_mirror_add ( cw ) ;
2010-08-01 07:29:19 -07:00
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_src_visible_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2010-08-01 07:29:19 -07:00
{
2013-01-09 03:34:07 -08:00
// E_Comp *c = data;
2012-06-28 00:03:44 -07:00
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return 0 ;
return cw - > visible ;
2010-08-01 07:29:19 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_src_hidden_set_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src ,
Eina_Bool hidden )
2010-08-01 07:29:19 -07:00
{
2013-01-09 03:34:07 -08:00
// E_Comp *c = data;
2012-06-28 00:03:44 -07:00
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return ;
if ( cw - > hidden_override = = hidden ) return ;
cw - > hidden_override = hidden ;
if ( cw - > bd ) e_border_comp_hidden_set ( cw - > bd , cw - > hidden_override ) ;
if ( cw - > visible )
{
if ( cw - > hidden_override )
2013-01-09 03:34:07 -08:00
_e_comp_child_hide ( cw ) ;
2012-06-28 00:03:44 -07:00
else if ( ! cw - > bd | | cw - > bd - > visible )
2013-01-09 03:34:07 -08:00
_e_comp_child_show ( cw ) ;
2012-06-28 00:03:44 -07:00
}
else
{
2013-01-09 03:34:07 -08:00
if ( cw - > hidden_override ) _e_comp_child_hide ( cw ) ;
2012-06-28 00:03:44 -07:00
}
2010-08-01 07:29:19 -07:00
}
static Eina_Bool
2013-01-09 03:34:07 -08:00
_e_comp_src_hidden_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2010-08-01 07:29:19 -07:00
{
2013-01-09 03:34:07 -08:00
// E_Comp *c = data;
2012-06-28 00:03:44 -07:00
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return 0 ;
return cw - > hidden_override ;
2010-08-01 07:29:19 -07:00
}
2010-05-21 02:34:58 -07:00
2011-10-10 14:09:26 -07:00
static E_Popup *
2013-01-09 03:34:07 -08:00
_e_comp_src_popup_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2011-10-10 14:09:26 -07:00
{
// E_Comp *c = data;
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return 0 ;
return cw - > pop ;
}
static E_Border *
2013-01-09 03:34:07 -08:00
_e_comp_src_border_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2011-10-10 14:09:26 -07:00
{
// E_Comp *c = data;
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return 0 ;
return cw - > bd ;
}
static Ecore_X_Window
2013-01-09 03:34:07 -08:00
_e_comp_src_window_get_func ( void * data __UNUSED__ ,
E_Manager * man __UNUSED__ ,
E_Manager_Comp_Source * src )
2011-10-10 14:09:26 -07:00
{
// E_Comp *c = data;
E_Comp_Win * cw = ( E_Comp_Win * ) src ;
if ( ! cw - > c ) return 0 ;
return cw - > win ;
}
2010-01-14 20:41:20 -08:00
static E_Comp *
2013-01-09 03:34:07 -08:00
_e_comp_add ( E_Manager * man )
2010-01-06 06:18:47 -08:00
{
2010-01-14 20:41:20 -08:00
E_Comp * c ;
2010-01-06 06:18:47 -08:00
Ecore_X_Window * wins ;
2010-01-11 00:43:24 -08:00
Ecore_X_Window_Attributes att ;
2011-12-29 18:15:02 -08:00
Eina_Bool res ;
2010-01-06 06:18:47 -08:00
int i , num ;
2010-09-09 23:57:37 -07:00
2010-01-14 20:41:20 -08:00
c = calloc ( 1 , sizeof ( E_Comp ) ) ;
2010-01-06 06:18:47 -08:00
if ( ! c ) return NULL ;
2011-12-29 18:15:02 -08:00
res = ecore_x_screen_is_composited ( man - > num ) ;
if ( res )
{
e_util_dialog_internal
2013-01-09 03:34:07 -08:00
( _ ( " Compositor Error " ) ,
_ ( " Another compositor is already running<br> "
" on your display server. " ) ) ;
2011-12-29 18:15:02 -08:00
free ( c ) ;
return NULL ;
}
c - > cm_selection = ecore_x_window_input_new ( man - > root , 0 , 0 , 1 , 1 ) ;
if ( ! c - > cm_selection )
{
free ( c ) ;
return NULL ;
}
ecore_x_screen_is_composited_set ( man - > num , c - > cm_selection ) ;
2012-06-28 00:03:44 -07:00
2013-01-09 03:34:07 -08:00
ecore_x_e_comp_sync_supported_set ( man - > root , conf - > efl_sync ) ;
2011-02-10 09:26:40 -08:00
2010-01-06 06:18:47 -08:00
c - > man = man ;
c - > win = ecore_x_composite_render_window_enable ( man - > root ) ;
2010-01-11 00:43:24 -08:00
if ( ! c - > win )
{
e_util_dialog_internal
2013-01-09 03:34:07 -08:00
( _ ( " Compositor Error " ) ,
_ ( " Your display server does not support the<br> "
" compositor overlay window. This is needed<br> "
" for it to function. " ) ) ;
2010-01-11 00:43:24 -08:00
free ( c ) ;
return NULL ;
}
2011-02-10 09:26:40 -08:00
2010-01-11 00:43:24 -08:00
memset ( ( & att ) , 0 , sizeof ( Ecore_X_Window_Attributes ) ) ;
2011-03-19 23:12:17 -07:00
ecore_x_window_attributes_get ( c - > win , & att ) ;
2011-02-10 09:26:40 -08:00
2010-01-14 20:41:20 -08:00
if ( ( att . depth ! = 24 ) & & ( att . depth ! = 32 ) )
2010-01-11 00:43:24 -08:00
{
2013-01-09 03:34:07 -08:00
/*
e_util_dialog_internal
( _ ( " Compositor Error " ) ,
_ ( " Your screen is not in 24/32bit display mode.<br> "
" This is required to be your default depth<br> "
" setting for the compositor to work properly. " ) ) ;
ecore_x_composite_render_window_disable ( c - > win ) ;
free ( c ) ;
return NULL ;
*/
2010-01-11 00:43:24 -08:00
}
2011-02-10 09:26:40 -08:00
2012-10-31 00:50:10 -07:00
if ( c - > man - > num = = 0 ) e_alert_composite_win ( c - > man - > root , c - > win ) ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
if ( conf - > engine = = E_COMP_ENGINE_GL )
2010-01-19 06:28:56 -08:00
{
2010-12-26 02:17:54 -08:00
int opt [ 20 ] ;
int opt_i = 0 ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
if ( conf - > indirect )
2010-02-14 21:27:36 -08:00
{
2010-12-26 02:17:54 -08:00
opt [ opt_i ] = ECORE_EVAS_GL_X11_OPT_INDIRECT ;
opt_i + + ;
opt [ opt_i ] = 1 ;
opt_i + + ;
}
2013-01-09 03:34:07 -08:00
if ( conf - > vsync )
2010-12-26 02:17:54 -08:00
{
opt [ opt_i ] = ECORE_EVAS_GL_X11_OPT_VSYNC ;
opt_i + + ;
opt [ opt_i ] = 1 ;
opt_i + + ;
}
2012-10-10 02:35:42 -07:00
# ifdef ECORE_EVAS_GL_X11_OPT_SWAP_MODE
2013-01-09 03:34:07 -08:00
if ( conf - > swap_mode )
2012-09-27 00:16:46 -07:00
{
opt [ opt_i ] = ECORE_EVAS_GL_X11_OPT_SWAP_MODE ;
opt_i + + ;
2013-01-09 03:34:07 -08:00
opt [ opt_i ] = conf - > swap_mode ;
2012-09-27 00:16:46 -07:00
opt_i + + ;
}
2012-10-10 02:35:42 -07:00
# endif
2010-12-26 02:17:54 -08:00
if ( opt_i > 0 )
{
opt [ opt_i ] = ECORE_EVAS_GL_X11_OPT_NONE ;
2010-02-14 21:27:36 -08:00
c - > ee = ecore_evas_gl_x11_options_new
2013-01-09 03:34:07 -08:00
( NULL , c - > win , 0 , 0 , man - > w , man - > h , opt ) ;
2010-02-14 21:27:36 -08:00
}
if ( ! c - > ee )
c - > ee = ecore_evas_gl_x11_new ( NULL , c - > win , 0 , 0 , man - > w , man - > h ) ;
2010-01-24 03:05:18 -08:00
if ( c - > ee )
{
c - > gl = 1 ;
ecore_evas_gl_x11_pre_post_swap_callback_set
2013-01-09 03:34:07 -08:00
( c - > ee , c , _e_comp_pre_swap , NULL ) ;
2010-01-24 03:05:18 -08:00
}
2010-01-19 06:28:56 -08:00
}
if ( ! c - > ee )
2011-03-19 21:45:05 -07:00
{
2013-01-09 03:34:07 -08:00
if ( conf - > engine = = E_COMP_ENGINE_GL )
2011-03-19 23:12:17 -07:00
{
e_util_dialog_internal
2013-01-09 03:34:07 -08:00
( _ ( " Compositor Warning " ) ,
_ ( " Your display driver does not support OpenGL, or<br> "
" no OpenGL engines were compiled or installed for<br> "
" Evas or Ecore-Evas. Falling back to software engine. " ) ) ;
2011-03-19 23:12:17 -07:00
}
c - > ee = ecore_evas_software_x11_new ( NULL , c - > win , 0 , 0 , man - > w , man - > h ) ;
}
2010-02-01 06:15:14 -08:00
ecore_evas_comp_sync_set ( c - > ee , 0 ) ;
2013-01-09 03:34:07 -08:00
// ecore_evas_manual_render_set(c->ee, conf->lock_fps);
2010-01-06 06:18:47 -08:00
c - > evas = ecore_evas_get ( c - > ee ) ;
ecore_evas_show ( c - > ee ) ;
2011-02-10 09:26:40 -08:00
2012-08-26 08:36:05 -07:00
c - > layout = e_layout_add ( c - > evas ) ;
evas_object_show ( c - > layout ) ;
2013-01-09 03:34:07 -08:00
_e_comp_screens_eval ( c ) ;
2010-03-16 01:54:57 -07:00
c - > ee_win = ecore_evas_window_get ( c - > ee ) ;
2010-03-07 03:48:36 -08:00
ecore_x_composite_redirect_subwindows
2013-01-09 03:34:07 -08:00
( c - > man - > root , ECORE_X_COMPOSITE_UPDATE_MANUAL ) ;
2010-01-06 06:18:47 -08:00
wins = ecore_x_window_children_get ( c - > man - > root , & num ) ;
if ( wins )
{
for ( i = 0 ; i < num ; i + + )
{
2010-01-14 20:41:20 -08:00
E_Comp_Win * cw ;
2010-01-06 06:18:47 -08:00
int x , y , w , h , border ;
2010-03-12 00:47:13 -08:00
char * wname = NULL , * wclass = NULL ;
2011-02-10 09:26:40 -08:00
2010-03-12 00:47:13 -08:00
ecore_x_icccm_name_class_get ( wins [ i ] , & wname , & wclass ) ;
if ( ( man - > initwin = = wins [ i ] ) | |
( ( wname ) & & ( wclass ) & & ( ! strcmp ( wname , " E " ) ) & &
( ! strcmp ( wclass , " Init_Window " ) ) ) )
{
free ( wname ) ;
free ( wclass ) ;
ecore_x_window_reparent ( wins [ i ] , c - > win , 0 , 0 ) ;
ecore_x_sync ( ) ;
continue ;
}
2012-12-21 13:31:13 -08:00
free ( wname ) ;
free ( wclass ) ;
2010-03-12 00:47:13 -08:00
wname = wclass = NULL ;
2013-01-09 03:34:07 -08:00
cw = _e_comp_win_add ( c , wins [ i ] ) ;
2010-01-06 06:18:47 -08:00
if ( ! cw ) continue ;
ecore_x_window_geometry_get ( cw - > win , & x , & y , & w , & h ) ;
border = ecore_x_window_border_width_get ( cw - > win ) ;
if ( wins [ i ] = = c - > win ) continue ;
2013-01-09 03:34:07 -08:00
_e_comp_win_configure ( cw , x , y , w , h , border ) ;
2010-01-06 06:18:47 -08:00
if ( ecore_x_window_visible_get ( wins [ i ] ) )
2013-01-09 03:34:07 -08:00
_e_comp_win_show ( cw ) ;
2010-01-06 06:18:47 -08:00
}
free ( wins ) ;
}
2011-02-10 09:26:40 -08:00
2010-05-21 02:34:58 -07:00
ecore_x_window_key_grab ( c - > man - > root ,
2011-03-19 23:12:17 -07:00
" Home " ,
2010-05-21 02:34:58 -07:00
ECORE_EVENT_MODIFIER_SHIFT |
ECORE_EVENT_MODIFIER_CTRL |
ECORE_EVENT_MODIFIER_ALT , 0 ) ;
2011-01-22 01:52:48 -08:00
ecore_x_window_key_grab ( c - > man - > root ,
2011-03-19 23:12:17 -07:00
" F " ,
2011-01-22 01:52:48 -08:00
ECORE_EVENT_MODIFIER_SHIFT |
ECORE_EVENT_MODIFIER_CTRL |
ECORE_EVENT_MODIFIER_ALT , 0 ) ;
2011-02-10 09:26:40 -08:00
2011-03-19 23:12:17 -07:00
c - > comp . data = c ;
2013-01-09 03:34:07 -08:00
c - > comp . func . evas_get = _e_comp_evas_get_func ;
c - > comp . func . update = _e_comp_update_func ;
c - > comp . func . src_get = _e_comp_src_get_func ;
c - > comp . func . border_src_get = _e_comp_border_src_get_func ;
c - > comp . func . src_list_get = _e_comp_src_list_get_func ;
c - > comp . func . src_image_get = _e_comp_src_image_get_func ;
c - > comp . func . src_shadow_get = _e_comp_src_shadow_get_func ;
c - > comp . func . src_image_mirror_add = _e_comp_src_image_mirror_add_func ;
c - > comp . func . src_visible_get = _e_comp_src_visible_get_func ;
c - > comp . func . src_hidden_set = _e_comp_src_hidden_set_func ;
c - > comp . func . src_hidden_get = _e_comp_src_hidden_get_func ;
c - > comp . func . src_window_get = _e_comp_src_window_get_func ;
c - > comp . func . src_border_get = _e_comp_src_border_get_func ;
c - > comp . func . src_popup_get = _e_comp_src_popup_get_func ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
e_manager_comp_set ( c - > man , & ( c - > comp ) ) ;
2010-01-06 06:18:47 -08:00
return c ;
}
2010-01-11 00:43:24 -08:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_del ( E_Comp * c )
2010-01-11 00:43:24 -08:00
{
2010-01-14 20:41:20 -08:00
E_Comp_Win * cw ;
2012-08-27 02:22:26 -07:00
E_Comp_Zone * cz ;
2012-07-18 02:15:08 -07:00
Eina_List * l , * hide_bd = NULL ;
E_Border * bd ;
2013-01-09 03:34:07 -08:00
2012-07-18 02:15:08 -07:00
EINA_LIST_FOREACH ( e_border_client_list ( ) , l , bd )
{
if ( ! bd - > visible )
hide_bd = eina_list_append ( hide_bd , bd ) ;
}
2013-01-09 03:34:07 -08:00
2011-01-22 01:52:48 -08:00
if ( c - > fps_fg )
{
evas_object_del ( c - > fps_fg ) ;
c - > fps_fg = NULL ;
}
if ( c - > fps_bg )
{
evas_object_del ( c - > fps_bg ) ;
c - > fps_bg = NULL ;
}
2010-08-01 07:29:19 -07:00
e_manager_comp_set ( c - > man , NULL ) ;
2011-02-10 09:26:40 -08:00
2011-01-22 01:52:48 -08:00
ecore_x_window_key_ungrab ( c - > man - > root ,
2011-03-19 23:12:17 -07:00
" F " ,
2011-01-22 01:52:48 -08:00
ECORE_EVENT_MODIFIER_SHIFT |
ECORE_EVENT_MODIFIER_CTRL |
ECORE_EVENT_MODIFIER_ALT , 0 ) ;
2010-05-21 02:34:58 -07:00
ecore_x_window_key_ungrab ( c - > man - > root ,
2011-03-19 23:12:17 -07:00
" Home " ,
2010-05-21 02:34:58 -07:00
ECORE_EVENT_MODIFIER_SHIFT |
ECORE_EVENT_MODIFIER_CTRL |
ECORE_EVENT_MODIFIER_ALT , 0 ) ;
2010-01-24 03:05:18 -08:00
if ( c - > grabbed )
{
c - > grabbed = 0 ;
ecore_x_ungrab ( ) ;
}
2010-01-11 00:43:24 -08:00
while ( c - > wins )
{
2010-01-14 20:41:20 -08:00
cw = ( E_Comp_Win * ) ( c - > wins ) ;
2010-02-01 06:15:14 -08:00
if ( cw - > counter )
{
ecore_x_sync_counter_free ( cw - > counter ) ;
cw - > counter = 0 ;
}
2010-04-12 01:28:51 -07:00
cw - > force = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_hide ( cw ) ;
2010-04-12 01:28:51 -07:00
cw - > force = 1 ;
2013-01-09 03:34:07 -08:00
_e_comp_win_del ( cw ) ;
2010-01-11 00:43:24 -08:00
}
2013-01-09 03:34:07 -08:00
2012-08-27 02:22:26 -07:00
EINA_LIST_FREE ( c - > zones , cz )
{
evas_object_del ( cz - > base ) ;
evas_object_del ( cz - > over ) ;
2012-12-08 22:27:42 -08:00
if ( cz - > bloff )
{
if ( e_backlight_mode_get ( cz - > zone ) ! = E_BACKLIGHT_MODE_NORMAL )
e_backlight_mode_set ( cz - > zone , E_BACKLIGHT_MODE_NORMAL ) ;
e_backlight_level_set ( cz - > zone , e_config - > backlight . normal , 0.0 ) ;
}
2012-08-27 02:22:26 -07:00
free ( cz ) ;
}
2012-08-26 08:36:05 -07:00
2012-08-27 02:22:26 -07:00
if ( c - > layout ) evas_object_del ( c - > layout ) ;
2013-01-09 03:34:07 -08:00
2010-01-11 00:43:24 -08:00
ecore_evas_free ( c - > ee ) ;
2010-02-10 23:07:58 -08:00
ecore_x_composite_unredirect_subwindows
2013-01-09 03:34:07 -08:00
( c - > man - > root , ECORE_X_COMPOSITE_UPDATE_MANUAL ) ;
2010-01-11 00:43:24 -08:00
ecore_x_composite_render_window_disable ( c - > win ) ;
2012-10-31 00:50:10 -07:00
if ( c - > man - > num = = 0 ) e_alert_composite_win ( c - > man - > root , 0 ) ;
2010-01-11 00:43:24 -08:00
if ( c - > render_animator ) ecore_animator_del ( c - > render_animator ) ;
2010-06-08 07:58:08 -07:00
if ( c - > new_up_timer ) ecore_timer_del ( c - > new_up_timer ) ;
2010-01-31 05:05:56 -08:00
if ( c - > update_job ) ecore_job_del ( c - > update_job ) ;
2010-08-01 07:29:19 -07:00
if ( c - > wins_list ) eina_list_free ( c - > wins_list ) ;
2012-08-27 02:22:26 -07:00
if ( c - > screen_job ) ecore_job_del ( c - > screen_job ) ;
2012-09-20 06:40:19 -07:00
if ( c - > nocomp_delay_timer ) ecore_timer_del ( c - > nocomp_delay_timer ) ;
if ( c - > nocomp_override_timer ) ecore_timer_del ( c - > nocomp_override_timer ) ;
2011-02-10 09:26:40 -08:00
2011-03-19 23:12:17 -07:00
ecore_x_window_free ( c - > cm_selection ) ;
2010-02-01 06:15:14 -08:00
ecore_x_e_comp_sync_supported_set ( c - > man - > root , 0 ) ;
2011-12-29 18:15:02 -08:00
ecore_x_screen_is_composited_set ( c - > man - > num , 0 ) ;
2013-01-09 03:34:07 -08:00
2012-07-18 02:15:08 -07:00
EINA_LIST_FREE ( hide_bd , bd )
{
e_border_show ( bd ) ;
e_border_hide ( bd , 1 ) ;
}
2011-02-10 09:26:40 -08:00
2010-01-11 00:43:24 -08:00
free ( c ) ;
}
2010-01-06 06:18:47 -08:00
//////////////////////////////////////////////////////////////////////////
2012-09-01 07:56:16 -07:00
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_done_cb ( void * data , Evas_Object * obj , const char * sig , const char * src )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
edje_object_signal_callback_del ( obj , sig , src , _e_comp_sys_done_cb ) ;
2012-09-01 07:56:16 -07:00
e_sys_action_raw_do ( ( E_Sys_Action ) ( long ) data , NULL ) ;
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_Sys_Action a , const char * sig , const char * rep , Eina_Bool nocomp_push )
2012-09-01 07:56:16 -07:00
{
Eina_List * l , * ll ;
E_Comp_Zone * cz ;
E_Comp * c ;
Eina_Bool first = EINA_TRUE ;
2013-01-09 03:34:07 -08:00
2012-09-01 07:56:16 -07:00
EINA_LIST_FOREACH ( compositors , l , c )
{
2013-01-09 03:34:07 -08:00
if ( nocomp_push ) _e_comp_override_push ( c ) ;
else _e_comp_override_timed_pop ( c ) ;
2012-09-01 07:56:16 -07:00
EINA_LIST_FOREACH ( c - > zones , ll , cz )
{
2013-01-09 03:34:07 -08:00
if ( nocomp_push ) _e_comp_fade_handle ( cz , 1 , 0.5 ) ;
else _e_comp_fade_handle ( cz , 0 , 0.5 ) ;
2012-09-01 07:56:16 -07:00
edje_object_signal_emit ( cz - > base , sig , " e " ) ;
edje_object_signal_emit ( cz - > over , sig , " e " ) ;
if ( ( rep ) & & ( first ) )
edje_object_signal_callback_add ( cz - > over , rep , " e " ,
2013-01-09 03:34:07 -08:00
_e_comp_sys_done_cb ,
2012-09-01 07:56:16 -07:00
( void * ) ( long ) a ) ;
first = EINA_FALSE ;
}
}
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_suspend ( void )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_SYS_SUSPEND ,
" e,state,sys,suspend " ,
" e,state,sys,suspend,done " ,
EINA_TRUE ) ;
2012-09-01 07:56:16 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_hibernate ( void )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_SYS_HIBERNATE ,
" e,state,sys,hibernate " ,
" e,state,sys,hibernate,done " ,
EINA_TRUE ) ;
2012-09-01 07:56:16 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_reboot ( void )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_SYS_REBOOT ,
" e,state,sys,reboot " ,
" e,state,sys,reboot,done " ,
EINA_TRUE ) ;
2012-09-01 07:56:16 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_shutdown ( void )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_SYS_HALT ,
" e,state,sys,halt " ,
" e,state,sys,halt,done " ,
EINA_TRUE ) ;
2012-09-01 07:56:16 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_logout ( void )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_SYS_LOGOUT ,
" e,state,sys,logout " ,
" e,state,sys,logout,done " ,
EINA_TRUE ) ;
2012-09-01 07:56:16 -07:00
}
static void
2013-01-09 03:34:07 -08:00
_e_comp_sys_resume ( void )
2012-09-01 07:56:16 -07:00
{
2013-01-09 03:34:07 -08:00
_e_comp_sys_emit_cb_wait ( E_SYS_SUSPEND ,
" e,state,sys,resume " ,
NULL ,
EINA_FALSE ) ;
2012-09-01 07:56:16 -07:00
}
2013-01-11 00:20:14 -08:00
static Eina_List *
_e_comp_engine_info_cb ( E_Configure_Option * co )
{
Eina_List * ret = NULL ;
E_Configure_Option_Info * oi ;
int x ;
const char * name [ ] =
{
" Software " ,
NULL
} ;
# define ENGINE_SW 1
# define ENGINE_GL 2
if ( ! getenv ( " ECORE_X_NO_XLIB " ) )
{
if ( ecore_evas_engine_type_supported_get ( ECORE_EVAS_ENGINE_OPENGL_X11 ) )
{
name [ 1 ] = " OpenGL " ;
}
}
for ( x = ENGINE_SW ; x < = ENGINE_GL ; x + + )
{
if ( ! name [ x - 1 ] ) continue ;
oi = e_configure_option_info_new ( co , _ ( name [ x - 1 ] ) , ( intptr_t * ) ( long ) x ) ;
oi - > current = ( * ( int * ) co - > valptr = = x ) ;
ret = eina_list_append ( ret , oi ) ;
}
return ret ;
}
static void
_e_comp_cfg_init ( void )
{
E_Configure_Option * co ;
E_CONFIGURE_OPTION_ADD ( co , BOOL , vsync , conf , _ ( " Tear-free compositing (VSYNC) " ) , _ ( " composite " ) , _ ( " border " ) ) ;
co - > requires_restart = 1 ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
E_CONFIGURE_OPTION_ADD ( co , BOOL , match . disable_borders , conf , _ ( " Disable composite effects for windows " ) , _ ( " composite " ) , _ ( " border " ) , _ ( " theme " ) , _ ( " animate " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
E_CONFIGURE_OPTION_ADD ( co , BOOL , match . disable_menus , conf , _ ( " Disable composite effects for menus " ) , _ ( " composite " ) , _ ( " menu " ) , _ ( " theme " ) , _ ( " animate " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
E_CONFIGURE_OPTION_ADD ( co , BOOL , match . disable_popups , conf , _ ( " Disable composite effects for popups " ) , _ ( " composite " ) , _ ( " popup " ) , _ ( " theme " ) , _ ( " animate " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
E_CONFIGURE_OPTION_ADD ( co , BOOL , match . disable_overrides , conf , _ ( " Disable composite effects for override-redirect windows (tooltips and such) " ) , _ ( " composite " ) , _ ( " theme " ) , _ ( " animate " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
2013-01-11 01:21:39 -08:00
E_CONFIGURE_OPTION_ADD ( co , BOOL , match . disable_overrides , conf , _ ( " Disable composite effects for the screen " ) , _ ( " composite " ) , _ ( " theme " ) , _ ( " animate " ) , _ ( " screen " ) ) ;
E_CONFIGURE_OPTION_HELP ( co , _ ( " This option disables composite effects from themes, such as animating the screen fade when blanking " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
2013-01-11 00:20:14 -08:00
E_CONFIGURE_OPTION_ADD ( co , BOOL , smooth_windows , conf , _ ( " Smooth scaling of composited window content " ) , _ ( " composite " ) , _ ( " border " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
E_CONFIGURE_OPTION_ADD ( co , BOOL , nocomp_fs , conf , _ ( " Don't composite fullscreen windows " ) , _ ( " composite " ) , _ ( " border " ) ) ;
co - > funcs [ 1 ] . none = co - > funcs [ 0 ] . none = e_comp_shadows_reset ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
E_CONFIGURE_OPTION_ADD ( co , ENUM , engine , conf , _ ( " Compositing engine " ) , _ ( " composite " ) , _ ( " border " ) ) ;
co - > info_cb = _e_comp_engine_info_cb ;
co - > requires_restart = 1 ;
cfg_opts = eina_inlist_append ( cfg_opts , EINA_INLIST_GET ( co ) ) ;
e_configure_option_category_tag_add ( _ ( " windows " ) , _ ( " composite " ) ) ;
e_configure_option_category_tag_add ( _ ( " composite " ) , _ ( " composite " ) ) ;
e_configure_option_category_icon_set ( _ ( " composite " ) , " preferences-composite " ) ;
}
2012-09-01 07:56:16 -07:00
//////////////////////////////////////////////////////////////////////////
2013-01-09 23:53:20 -08:00
EINTERN Eina_Bool
2013-01-09 03:34:07 -08:00
e_comp_init ( void )
2010-01-04 04:27:15 -08:00
{
2010-01-06 06:18:47 -08:00
Eina_List * l ;
E_Manager * man ;
2013-01-09 03:34:07 -08:00
e_sys_handlers_set ( _e_comp_sys_suspend ,
_e_comp_sys_hibernate ,
_e_comp_sys_reboot ,
_e_comp_sys_shutdown ,
_e_comp_sys_logout ,
_e_comp_sys_resume ) ;
2011-02-10 09:26:40 -08:00
2010-01-06 06:18:47 -08:00
windows = eina_hash_string_superfast_new ( NULL ) ;
2010-02-01 06:15:14 -08:00
borders = eina_hash_string_superfast_new ( NULL ) ;
2010-01-06 06:18:47 -08:00
damages = eina_hash_string_superfast_new ( NULL ) ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_CREATE , _e_comp_create , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_DESTROY , _e_comp_destroy , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_SHOW , _e_comp_show , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_HIDE , _e_comp_hide , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_REPARENT , _e_comp_reparent , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_CONFIGURE , _e_comp_configure , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_STACK , _e_comp_stack , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_PROPERTY , _e_comp_property , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_CLIENT_MESSAGE , _e_comp_message , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_SHAPE , _e_comp_shape , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_DAMAGE_NOTIFY , _e_comp_damage , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_X_EVENT_WINDOW_DAMAGE , _e_comp_damage_win , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_SCREENSAVER_ON , _e_comp_screensaver_on , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_SCREENSAVER_OFF , _e_comp_screensaver_off , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_EVENT_KEY_DOWN , _e_comp_key_down , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , ECORE_EVENT_SIGNAL_USER , _e_comp_signal_user , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_CONTAINER_RESIZE , _e_comp_randr , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_ZONE_MOVE_RESIZE , _e_comp_zonech , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_ZONE_ADD , _e_comp_zonech , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_ZONE_DEL , _e_comp_zonech , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_ADD , _e_comp_bd_add , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_REMOVE , _e_comp_bd_del , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_SHOW , _e_comp_bd_show , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_HIDE , _e_comp_bd_hide , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_MOVE , _e_comp_bd_move , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_RESIZE , _e_comp_bd_resize , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_ICONIFY , _e_comp_bd_iconify , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_UNICONIFY , _e_comp_bd_uniconify , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_URGENT_CHANGE , _e_comp_bd_urgent_change , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_FOCUS_IN , _e_comp_bd_focus_in , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_FOCUS_OUT , _e_comp_bd_focus_out , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_PROPERTY , _e_comp_bd_property , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_FULLSCREEN , _e_comp_bd_fullscreen , NULL ) ;
E_LIST_HANDLER_APPEND ( handlers , E_EVENT_BORDER_UNFULLSCREEN , _e_comp_bd_unfullscreen , NULL ) ;
2010-02-05 23:04:17 -08:00
2010-09-09 23:57:37 -07:00
if ( ! ecore_x_composite_query ( ) )
{
e_util_dialog_internal
2013-01-09 03:34:07 -08:00
( _ ( " Compositor Error " ) ,
_ ( " Your display server does not support XComposite,<br> "
" or Ecore-X was built without XComposite support.<br> "
" Note that for composite support you will also need<br> "
" XRender and XFixes support in X11 and Ecore. " ) ) ;
return EINA_FALSE ;
2010-09-09 23:57:37 -07:00
}
if ( ! ecore_x_damage_query ( ) )
{
e_util_dialog_internal
2013-01-09 03:34:07 -08:00
( _ ( " Compositor Error " ) ,
_ ( " Your display server does not support XDamage<br> "
" or Ecore was built without XDamage support. " ) ) ;
return EINA_FALSE ;
2010-09-09 23:57:37 -07:00
}
2012-01-20 10:40:39 -08:00
2013-01-09 03:34:07 -08:00
e_comp_cfdata_edd_init ( & conf_edd , & conf_match_edd ) ;
2013-01-10 05:03:36 -08:00
conf = e_config_domain_load ( " e_comp " , conf_edd ) ;
2013-01-09 03:34:07 -08:00
if ( conf )
{
conf - > max_unmapped_pixels = 32 * 1024 ;
conf - > keep_unmapped = 1 ;
}
else
conf = e_comp_cfdata_config_new ( ) ;
2012-01-31 08:36:07 -08:00
# ifdef HAVE_WAYLAND_CLIENTS
2013-01-09 03:34:07 -08:00
if ( ! e_comp_wl_init ( ) )
2012-01-20 10:40:39 -08:00
EINA_LOG_ERR ( " Failed to initialize Wayland Client Support !! \n " ) ;
# endif
2013-01-11 00:20:14 -08:00
_e_comp_cfg_init ( ) ;
2010-01-06 06:18:47 -08:00
EINA_LIST_FOREACH ( e_manager_list ( ) , l , man )
{
2010-01-14 20:41:20 -08:00
E_Comp * c ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
c = _e_comp_add ( man ) ;
if ( c )
compositors = eina_list_append ( compositors , c ) ;
2010-01-06 06:18:47 -08:00
}
2011-02-10 09:26:40 -08:00
2010-03-08 06:50:00 -08:00
ecore_x_sync ( ) ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
return EINA_TRUE ;
2010-01-04 04:27:15 -08:00
}
2013-01-10 05:03:36 -08:00
EAPI int
e_comp_internal_save ( void )
{
return e_config_domain_save ( " e_comp " , conf_edd , conf ) ;
}
2013-01-09 23:53:20 -08:00
EINTERN int
2013-01-09 03:34:07 -08:00
e_comp_shutdown ( void )
2010-01-04 04:27:15 -08:00
{
2013-01-09 23:53:20 -08:00
if ( ! compositors ) return 1 ;
2013-01-09 03:34:07 -08:00
E_FREE_LIST ( compositors , _e_comp_del ) ;
2010-01-06 06:18:47 -08:00
E_FREE_LIST ( handlers , ecore_event_handler_del ) ;
2011-02-10 09:26:40 -08:00
2012-01-31 08:36:07 -08:00
# ifdef HAVE_WAYLAND_CLIENTS
2013-01-09 03:34:07 -08:00
e_comp_wl_shutdown ( ) ;
2012-01-20 10:40:39 -08:00
# endif
2013-01-09 03:34:07 -08:00
2013-01-11 00:20:14 -08:00
E_CONFIGURE_OPTION_LIST_CLEAR ( cfg_opts ) ;
e_configure_option_category_tag_del ( _ ( " composite " ) , _ ( " composite " ) ) ;
e_configure_option_category_tag_del ( _ ( " windows " ) , _ ( " composite " ) ) ;
2013-01-09 03:34:07 -08:00
e_comp_cfdata_config_free ( conf ) ;
E_CONFIG_DD_FREE ( conf_match_edd ) ;
E_CONFIG_DD_FREE ( conf_edd ) ;
conf = NULL ;
conf_match_edd = NULL ;
conf_edd = NULL ;
2010-09-09 23:57:37 -07:00
if ( damages ) eina_hash_free ( damages ) ;
if ( windows ) eina_hash_free ( windows ) ;
if ( borders ) eina_hash_free ( borders ) ;
damages = NULL ;
windows = NULL ;
borders = NULL ;
2013-01-09 03:34:07 -08:00
2012-09-01 07:56:16 -07:00
e_sys_handlers_set ( NULL , NULL , NULL , NULL , NULL , NULL ) ;
2013-01-09 23:53:20 -08:00
return 1 ;
2010-01-04 04:27:15 -08:00
}
2010-01-14 20:41:20 -08:00
2013-01-10 05:03:36 -08:00
EAPI E_Comp_Config *
e_comp_config_get ( void )
{
return conf ;
}
2013-01-09 23:53:20 -08:00
EAPI void
2013-01-10 06:05:08 -08:00
e_comp_shadows_reset ( void )
2010-01-14 20:41:20 -08:00
{
2013-01-11 01:21:39 -08:00
Eina_List * l , * ll ;
2010-01-14 20:41:20 -08:00
E_Comp * c ;
EINA_LIST_FOREACH ( compositors , l , c )
{
E_Comp_Win * cw ;
2013-01-11 01:21:39 -08:00
E_Comp_Zone * cz ;
2011-02-10 09:26:40 -08:00
2013-01-09 03:34:07 -08:00
// ecore_evas_manual_render_set(c->ee, conf->lock_fps);
_e_comp_fps_update ( c ) ;
2013-01-11 01:21:39 -08:00
EINA_LIST_FOREACH ( c - > zones , ll , cz )
_e_comp_zone_fill ( c , cz ) ;
2010-01-14 20:41:20 -08:00
EINA_INLIST_FOREACH ( c - > wins , cw )
{
2010-04-07 23:01:40 -07:00
if ( ( cw - > shobj ) & & ( cw - > obj ) )
2010-01-14 20:41:20 -08:00
{
2013-01-09 03:34:07 -08:00
_e_comp_win_shadow_setup ( cw ) ;
2011-02-10 09:26:40 -08:00
2010-04-12 01:28:51 -07:00
if ( cw - > visible )
2010-01-14 20:41:20 -08:00
{
2010-04-12 01:28:51 -07:00
edje_object_signal_emit ( cw - > shobj , " e,state,visible,on " , " e " ) ;
2011-03-31 01:14:18 -07:00
if ( ! cw - > animating )
{
cw - > c - > animating + + ;
}
2013-01-09 03:34:07 -08:00
_e_comp_win_render_queue ( cw ) ;
2010-04-12 01:28:51 -07:00
cw - > animating = 1 ;
2011-02-10 09:26:40 -08:00
2010-08-01 07:29:19 -07:00
cw - > pending_count + + ;
e_manager_comp_event_src_visibility_send
2013-01-09 03:34:07 -08:00
( cw - > c - > man , ( E_Manager_Comp_Source * ) cw ,
_e_comp_cb_pending_after , cw - > c ) ;
2010-01-14 20:41:20 -08:00
}
}
}
}
}
2011-03-19 23:12:17 -07:00