enlightenment/src/bin/e_manager.c

1081 lines
29 KiB
C

#include "e.h"
/* local subsystem functions */
static void _e_manager_free(E_Manager *man);
static Eina_Bool _e_manager_cb_window_show_request(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_window_configure(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_key_up(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_key_down(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_frame_extents_request(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_ping(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_screensaver_notify(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_cb_client_message(void *data, int ev_type, void *ev);
static Eina_Bool _e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__,
const void *key __UNUSED__,
void *data, void *fdata __UNUSED__);
static E_Manager *_e_manager_get_for_root(Ecore_X_Window root);
static Eina_Bool _e_manager_clear_timer(void *data);
#if 0 /* use later - maybe */
static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_create(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_property(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev);
static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev);
static int _e_manager_cb_client_message(void *data, int ev_type, void *ev);
#endif
/* local subsystem globals */
typedef struct _Frame_Extents Frame_Extents;
struct _Frame_Extents
{
int l, r, t, b;
};
static Eina_List *managers = NULL;
static Eina_Hash *frame_extents = NULL;
static Ecore_Timer *timer_post_screensaver_lock = NULL;
/* externally accessible functions */
EINTERN int
e_manager_init(void)
{
ecore_x_screensaver_event_listen_set(1);
frame_extents = eina_hash_string_superfast_new(NULL);
return 1;
}
EINTERN int
e_manager_shutdown(void)
{
E_FREE_LIST(managers, e_object_del);
if (frame_extents)
{
eina_hash_foreach(frame_extents, _e_manager_frame_extents_free_cb, NULL);
eina_hash_free(frame_extents);
frame_extents = NULL;
}
if (timer_post_screensaver_lock)
{
ecore_timer_del(timer_post_screensaver_lock);
timer_post_screensaver_lock = NULL;
}
return 1;
}
EAPI Eina_List *
e_manager_list(void)
{
return managers;
}
EAPI E_Manager *
e_manager_new(Ecore_X_Window root, int num)
{
E_Manager *man;
if (!ecore_x_window_manage(root)) return NULL;
man = E_OBJECT_ALLOC(E_Manager, E_MANAGER_TYPE, _e_manager_free);
if (!man) return NULL;
managers = eina_list_append(managers, man);
man->root = root;
man->num = num;
ecore_x_window_size_get(man->root, &(man->w), &(man->h));
man->win = man->root;
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST,
_e_manager_cb_window_show_request,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
_e_manager_cb_window_configure,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
_e_manager_cb_key_down,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_EVENT_KEY_UP,
_e_manager_cb_key_up,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST,
_e_manager_cb_frame_extents_request,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_X_EVENT_PING,
_e_manager_cb_ping,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY,
_e_manager_cb_screensaver_notify,
man));
man->handlers =
eina_list_append(man->handlers,
ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
_e_manager_cb_client_message,
man));
man->pointer = e_pointer_window_new(man->root, 1);
ecore_x_window_background_color_set(man->root, 0, 0, 0);
man->clear_timer = ecore_timer_add(10.0, _e_manager_clear_timer, man);
return man;
}
EAPI void
e_manager_manage_windows(E_Manager *man)
{
Ecore_X_Window *windows;
int wnum;
/* a manager is designated for each root. lets get all the windows in
the managers root */
windows = ecore_x_window_children_get(man->root, &wnum);
if (windows)
{
int i;
const char *atom_names[] =
{
"_XEMBED_INFO",
"_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
"KWM_DOCKWINDOW"
};
Ecore_X_Atom atoms[3];
Ecore_X_Atom atom_xmbed, atom_kde_netwm_systray, atom_kwm_dockwindow;
unsigned char *data = NULL;
int count;
ecore_x_atoms_get(atom_names, 3, atoms);
atom_xmbed = atoms[0];
atom_kde_netwm_systray = atoms[1];
atom_kwm_dockwindow = atoms[2];
for (i = 0; i < wnum; i++)
{
Ecore_X_Window_Attributes att;
unsigned int ret_val, deskxy[2];
int ret;
if (e_border_find_by_client_window(windows[i]))
continue;
ecore_x_window_attributes_get(windows[i], &att);
if ((att.override) || (att.input_only))
{
if (att.override)
{
char *wname = NULL, *wclass = NULL;
ecore_x_icccm_name_class_get(windows[i],
&wname, &wclass);
if ((wname) && (wclass) &&
(!strcmp(wname, "E")) &&
(!strcmp(wclass, "Init_Window")))
{
free(wname);
free(wclass);
man->initwin = windows[i];
}
else
{
if (wname) free(wname);
if (wclass) free(wclass);
continue;
}
}
else
continue;
}
/* XXX manage xembed windows as long as they are not override_redirect..
* if (!ecore_x_window_prop_property_get(windows[i],
* atom_xmbed,
* atom_xmbed, 32,
* &data, &count))
* data = NULL;
* if (!data) */
{
if (!ecore_x_window_prop_property_get(windows[i],
atom_kde_netwm_systray,
atom_xmbed, 32,
&data, &count))
data = NULL;
}
if (!data)
{
if (!ecore_x_window_prop_property_get(windows[i],
atom_kwm_dockwindow,
atom_kwm_dockwindow, 32,
&data, &count))
data = NULL;
}
if (data)
{
free(data);
data = NULL;
continue;
}
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_MANAGED,
&ret_val, 1);
/* we have seen this window before */
if ((ret > -1) && (ret_val == 1))
{
E_Container *con = NULL;
E_Zone *zone = NULL;
E_Desk *desk = NULL;
E_Border *bd = NULL;
unsigned int id;
char *path;
Efreet_Desktop *desktop = NULL;
/* get all information from window before it is
* reset by e_border_new */
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_CONTAINER,
&id, 1);
if (ret == 1)
con = e_container_number_get(man, id);
if (!con)
con = e_container_current_get(man);
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_ZONE,
&id, 1);
if (ret == 1)
zone = e_container_zone_number_get(con, id);
if (!zone)
zone = e_zone_current_get(con);
ret = ecore_x_window_prop_card32_get(windows[i],
E_ATOM_DESK,
deskxy, 2);
if (ret == 2)
desk = e_desk_at_xy_get(zone,
deskxy[0],
deskxy[1]);
path = ecore_x_window_prop_string_get(windows[i],
E_ATOM_DESKTOP_FILE);
if (path)
{
desktop = efreet_desktop_get(path);
free(path);
}
{
bd = e_border_new(con, windows[i], 1, 0);
if (bd)
{
bd->ignore_first_unmap = 1;
/* FIXME:
* It's enough to set the desk, the zone will
* be set according to the desk */
// if (zone) e_border_zone_set(bd, zone);
if (desk) e_border_desk_set(bd, desk);
bd->desktop = desktop;
}
}
}
else if ((att.visible) && (!att.override) &&
(!att.input_only))
{
/* We have not seen this window, and X tells us it
* should be seen */
E_Container *con;
E_Border *bd;
con = e_container_current_get(man);
bd = e_border_new(con, windows[i], 1, 0);
if (bd)
{
bd->ignore_first_unmap = 1;
e_border_show(bd);
}
}
}
free(windows);
}
}
EAPI void
e_manager_show(E_Manager *man)
{
Eina_List *l;
E_Container *con;
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if (man->visible) return;
EINA_LIST_FOREACH(man->containers, l, con)
{
e_container_show(con);
}
if (man->root != man->win)
{
Ecore_X_Window mwin;
mwin = e_menu_grab_window_get();
if (!mwin) mwin = man->initwin;
if (!mwin)
ecore_x_window_raise(man->win);
else
ecore_x_window_configure(man->win,
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
0, 0, 0, 0, 0,
mwin, ECORE_X_WINDOW_STACK_BELOW);
ecore_x_window_show(man->win);
}
man->visible = 1;
}
EAPI void
e_manager_hide(E_Manager *man)
{
Eina_List *l;
E_Container *con;
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if (!man->visible) return;
EINA_LIST_FOREACH(man->containers, l, con)
{
e_container_hide(con);
}
if (man->root != man->win)
ecore_x_window_hide(man->win);
man->visible = 0;
}
EAPI void
e_manager_move(E_Manager *man, int x, int y)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if ((x == man->x) && (y == man->y)) return;
if (man->root != man->win)
{
man->x = x;
man->y = y;
ecore_x_window_move(man->win, man->x, man->y);
}
}
EAPI void
e_manager_resize(E_Manager *man, int w, int h)
{
Eina_List *l;
E_Container *con;
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
man->w = w;
man->h = h;
if (man->root != man->win)
ecore_x_window_resize(man->win, man->w, man->h);
EINA_LIST_FOREACH(man->containers, l, con)
{
e_container_resize(con, man->w, man->h);
}
ecore_x_netwm_desk_size_set(man->root, man->w, man->h);
}
EAPI void
e_manager_move_resize(E_Manager *man, int x, int y, int w, int h)
{
Eina_List *l;
E_Container *con;
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if (man->root != man->win)
{
man->x = x;
man->y = y;
}
man->w = w;
man->h = h;
ecore_x_window_move_resize(man->win, man->x, man->y, man->w, man->h);
EINA_LIST_FOREACH(man->containers, l, con)
{
e_container_resize(con, man->w, man->h);
}
}
EAPI void
e_manager_raise(E_Manager *man)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if (man->root != man->win)
{
Ecore_X_Window mwin;
mwin = e_menu_grab_window_get();
if (!mwin) mwin = man->initwin;
if (!mwin)
ecore_x_window_raise(man->win);
else
ecore_x_window_configure(man->win,
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
0, 0, 0, 0, 0,
mwin, ECORE_X_WINDOW_STACK_BELOW);
}
}
EAPI void
e_manager_lower(E_Manager *man)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if (man->root != man->win)
ecore_x_window_lower(man->win);
}
EAPI E_Manager *
e_manager_current_get(void)
{
Eina_List *l;
E_Manager *man;
int x, y;
if (!managers) return NULL;
EINA_LIST_FOREACH(managers, l, man)
{
ecore_x_pointer_xy_get(man->win, &x, &y);
if (x == -1 && y == -1)
continue;
if (E_INSIDE(x, y, man->x, man->y, man->w, man->h))
return man;
}
return eina_list_data_get(managers);
}
EAPI E_Manager *
e_manager_number_get(int num)
{
Eina_List *l;
E_Manager *man;
if (!managers) return NULL;
EINA_LIST_FOREACH(managers, l, man)
{
if (man->num == num)
return man;
}
return NULL;
}
EAPI void
e_managers_keys_grab(void)
{
Eina_List *l;
E_Manager *man;
EINA_LIST_FOREACH(managers, l, man)
{
e_bindings_key_grab(E_BINDING_CONTEXT_ANY, man->root);
}
}
EAPI void
e_managers_keys_ungrab(void)
{
Eina_List *l;
E_Manager *man;
EINA_LIST_FOREACH(managers, l, man)
{
e_bindings_key_ungrab(E_BINDING_CONTEXT_ANY, man->root);
}
}
EAPI void
e_manager_comp_set(E_Manager *man, E_Manager_Comp *comp)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
man->comp = comp;
e_msg_send("comp.manager", "change.comp", // name + info
0, // val
E_OBJECT(man), // obj
NULL, // msgdata
NULL, NULL); // afterfunc + afterdata
}
EAPI Evas *
e_manager_comp_evas_get(E_Manager *man)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK_RETURN(man, E_MANAGER_TYPE, NULL);
if (!man->comp) return NULL;
return man->comp->func.evas_get(man->comp->data, man);
}
EAPI void
e_manager_comp_evas_update(E_Manager *man)
{
E_OBJECT_CHECK(man);
E_OBJECT_TYPE_CHECK(man, E_MANAGER_TYPE);
if (!man->comp) return;
return man->comp->func.update(man->comp->data, man);
}
EAPI const Eina_List *
e_manager_comp_src_list(E_Manager *man)
{
return man->comp->func.src_list_get(man->comp->data, man);
}
EAPI E_Manager_Comp_Source*
e_manager_comp_border_src_get(E_Manager *man, Ecore_X_Window win)
{
return man->comp->func.border_src_get(man->comp->data, man, win);
}
EAPI E_Manager_Comp_Source*
e_manager_comp_src_get(E_Manager *man, Ecore_X_Window win)
{
return man->comp->func.src_get(man->comp->data, man, win);
}
EAPI Evas_Object *
e_manager_comp_src_image_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_image_get(man->comp->data, man, src);
}
EAPI Evas_Object *
e_manager_comp_src_shadow_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_shadow_get(man->comp->data, man, src);
}
EAPI Evas_Object *
e_manager_comp_src_image_mirror_add(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_image_mirror_add(man->comp->data, man, src);
}
EAPI Eina_Bool
e_manager_comp_src_visible_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_visible_get(man->comp->data, man, src);
}
EAPI void
e_manager_comp_src_hidden_set(E_Manager *man, E_Manager_Comp_Source *src, Eina_Bool hidden)
{
return man->comp->func.src_hidden_set(man->comp->data, man, src, hidden);
}
EAPI Eina_Bool
e_manager_comp_src_hidden_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_hidden_get(man->comp->data, man, src);
}
EAPI Ecore_X_Window
e_manager_comp_src_window_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_window_get(man->comp->data, man, src);
}
EAPI E_Popup *
e_manager_comp_src_popup_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_popup_get(man->comp->data, man, src);
}
EAPI E_Border *
e_manager_comp_src_border_get(E_Manager *man, E_Manager_Comp_Source *src)
{
return man->comp->func.src_border_get(man->comp->data, man, src);
}
EAPI void
e_manager_comp_event_resize_send(E_Manager *man)
{
e_msg_send("comp.manager", "resize.comp", // name + info
0, // val
E_OBJECT(man), // obj
NULL, // msgdata
NULL, NULL); // afterfunc + afterdata
}
EAPI void
e_manager_comp_event_src_add_send(E_Manager *man, E_Manager_Comp_Source *src,
void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
void *data)
{
e_msg_send("comp.manager", "add.src", // name + info
0, // val
E_OBJECT(man), // obj
src, // msgdata
(void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
}
EAPI void
e_manager_comp_event_src_del_send(E_Manager *man, E_Manager_Comp_Source *src,
void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
void *data)
{
e_msg_send("comp.manager", "del.src", // name + info
0, // val
E_OBJECT(man), // obj
src, // msgdata
(void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
}
EAPI void
e_manager_comp_event_src_config_send(E_Manager *man, E_Manager_Comp_Source *src,
void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
void *data)
{
e_msg_send("comp.manager", "config.src", // name + info
0, // val
E_OBJECT(man), // obj
src, // msgdata
(void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
}
EAPI void
e_manager_comp_event_src_visibility_send(E_Manager *man, E_Manager_Comp_Source *src,
void (*afterfunc) (void *data, E_Manager *man, E_Manager_Comp_Source *src),
void *data)
{
e_msg_send("comp.manager", "visibility.src", // name + info
0, // val
E_OBJECT(man), // obj
src, // msgdata
(void (*)(void *, E_Object *, void *))afterfunc, data); // afterfunc + afterdata
}
/* local subsystem functions */
static void
_e_manager_free(E_Manager *man)
{
Eina_List *l;
E_FREE_LIST(man->handlers, ecore_event_handler_del);
l = man->containers;
man->containers = NULL;
E_FREE_LIST(l, e_object_del);
if (man->root != man->win)
{
ecore_x_window_free(man->win);
}
if (man->pointer) e_object_del(E_OBJECT(man->pointer));
managers = eina_list_remove(managers, man);
if (man->clear_timer) ecore_timer_del(man->clear_timer);
free(man);
}
static Eina_Bool
_e_manager_cb_window_show_request(void *data, int ev_type __UNUSED__, void *ev)
{
E_Manager *man;
Ecore_X_Event_Window_Show_Request *e;
man = data;
e = ev;
if (e_stolen_win_get(e->win)) return 1;
if (ecore_x_window_parent_get(e->win) != man->root)
return ECORE_CALLBACK_PASS_ON; /* try other handlers for this */
{
E_Container *con;
E_Border *bd;
con = e_container_current_get(man);
if (!e_border_find_by_client_window(e->win))
{
bd = e_border_new(con, e->win, 0, 0);
if (!bd)
ecore_x_window_show(e->win);
}
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
{
E_Manager *man;
Ecore_X_Event_Window_Configure *e;
man = data;
e = ev;
if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
e_manager_resize(man, e->w, e->h);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
{
E_Manager *man;
Ecore_Event_Key *e;
man = data;
e = ev;
if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
return ECORE_CALLBACK_DONE;
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_key_up(void *data, int ev_type __UNUSED__, void *ev)
{
E_Manager *man;
Ecore_Event_Key *e;
man = data;
e = ev;
if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
if (e_bindings_key_up_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
return ECORE_CALLBACK_DONE;
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_frame_extents_request(void *data, int ev_type __UNUSED__, void *ev)
{
E_Manager *man;
E_Container *con;
Ecore_X_Event_Frame_Extents_Request *e;
Ecore_X_Window_Type type;
Ecore_X_MWM_Hint_Decor decor;
Ecore_X_Window_State *state;
Frame_Extents *extents;
const char *border, *sig, *key;
int ok;
unsigned int i, num;
man = data;
con = e_container_current_get(man);
e = ev;
if (ecore_x_window_parent_get(e->win) != man->root) return ECORE_CALLBACK_PASS_ON;
/* TODO:
* * We need to check if we remember this window, and border locking is set
*/
border = "default";
key = border;
ok = ecore_x_mwm_hints_get(e->win, NULL, &decor, NULL);
if ((ok) &&
(!(decor & ECORE_X_MWM_HINT_DECOR_ALL)) &&
(!(decor & ECORE_X_MWM_HINT_DECOR_TITLE)) &&
(!(decor & ECORE_X_MWM_HINT_DECOR_BORDER)))
{
border = "borderless";
key = border;
}
ok = ecore_x_netwm_window_type_get(e->win, &type);
if ((ok) &&
((type == ECORE_X_WINDOW_TYPE_DESKTOP) ||
(type == ECORE_X_WINDOW_TYPE_DOCK)))
{
border = "borderless";
key = border;
}
sig = NULL;
ecore_x_netwm_window_state_get(e->win, &state, &num);
if (state)
{
int maximized = 0;
for (i = 0; i < num; i++)
{
switch (state[i])
{
case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
maximized++;
break;
case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
maximized++;
break;
case ECORE_X_WINDOW_STATE_FULLSCREEN:
border = "borderless";
key = border;
break;
case ECORE_X_WINDOW_STATE_SHADED:
case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
case ECORE_X_WINDOW_STATE_SKIP_PAGER:
case ECORE_X_WINDOW_STATE_HIDDEN:
case ECORE_X_WINDOW_STATE_ICONIFIED:
case ECORE_X_WINDOW_STATE_MODAL:
case ECORE_X_WINDOW_STATE_STICKY:
case ECORE_X_WINDOW_STATE_ABOVE:
case ECORE_X_WINDOW_STATE_BELOW:
case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
case ECORE_X_WINDOW_STATE_UNKNOWN:
break;
}
}
if ((maximized == 2) &&
(e_config->maximize_policy == E_MAXIMIZE_FULLSCREEN))
{
sig = "e,action,maximize,fullscreen";
key = "maximize,fullscreen";
}
free(state);
}
extents = eina_hash_find(frame_extents, key);
if (!extents)
{
extents = E_NEW(Frame_Extents, 1);
if (extents)
{
Evas_Object *o;
char buf[1024];
o = edje_object_add(con->bg_evas);
snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", border);
ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
if (ok)
{
Evas_Coord x, y, w, h;
if (sig)
{
edje_object_signal_emit(o, sig, "e");
edje_object_message_signal_process(o);
}
evas_object_resize(o, 1000, 1000);
edje_object_calc_force(o);
edje_object_part_geometry_get(o, "e.swallow.client",
&x, &y, &w, &h);
extents->l = x;
extents->r = 1000 - (x + w);
extents->t = y;
extents->b = 1000 - (y + h);
}
else
{
extents->l = 0;
extents->r = 0;
extents->t = 0;
extents->b = 0;
}
evas_object_del(o);
eina_hash_add(frame_extents, key, extents);
}
}
if (extents)
ecore_x_netwm_frame_size_set(e->win, extents->l, extents->r, extents->t, extents->b);
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_ping(void *data, int ev_type __UNUSED__, void *ev)
{
E_Manager *man;
E_Border *bd;
Ecore_X_Event_Ping *e;
man = data;
e = ev;
if (e->win != man->root) return ECORE_CALLBACK_PASS_ON;
bd = e_border_find_by_client_window(e->event_win);
if (!bd) return ECORE_CALLBACK_PASS_ON;
bd->ping_ok = 1;
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_timer_post_screensaver_lock(void *data __UNUSED__)
{
e_desklock_show_autolocked();
timer_post_screensaver_lock = NULL;
return ECORE_CALLBACK_CANCEL;
}
static Eina_Bool
_e_manager_cb_screensaver_notify(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
{
Ecore_X_Event_Screensaver_Notify *e = ev;
if (timer_post_screensaver_lock)
{
ecore_timer_del(timer_post_screensaver_lock);
timer_post_screensaver_lock = NULL;
}
if (e->on)
{
if (e_config->desklock_autolock_screensaver)
{
if (e_config->desklock_post_screensaver_time <= 1.0)
{
e_desklock_show_autolocked();
}
else
{
timer_post_screensaver_lock = ecore_timer_add
(e_config->desklock_post_screensaver_time,
_e_manager_cb_timer_post_screensaver_lock, NULL);
}
}
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_cb_client_message(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
{
Ecore_X_Event_Client_Message *e;
E_Border *bd;
e = ev;
if (e->message_type == ECORE_X_ATOM_NET_ACTIVE_WINDOW)
{
bd = e_border_find_by_client_window(e->win);
if ((bd) && (!bd->focused))
{
#if 0 /* notes */
if (e->data.l[0] == 0 /* 0 == old, 1 == client, 2 == pager */)
{
// FIXME: need config for the below - what to do given each
// request (either do nothng, make app look urgent/want
// attention or actiually flip to app as below is the
// current default)
// if 0 == just make app demand attention somehow
// if 1 == just make app demand attention somehow
// if 2 == activate window as below
}
timestamp = e->data.l[1];
requestor_id e->data.l[2];
#endif
if ((e_config->focus_setting == E_FOCUS_NEW_WINDOW) ||
((bd->parent) &&
((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
((bd->parent->focused) &&
(e_config->focus_setting == E_FOCUS_NEW_DIALOG_IF_OWNER_FOCUSED)))))
{
if (bd->iconic)
{
if (e_config->clientlist_warp_to_iconified_desktop == 1)
e_desk_show(bd->desk);
if (!bd->lock_user_iconify)
e_border_uniconify(bd);
}
if ((!bd->iconic) && (!bd->sticky))
e_desk_show(bd->desk);
if (!bd->lock_user_stacking) e_border_raise(bd);
if (!bd->lock_focus_out)
{
/* XXX ooffice does send this request for
config dialogs when the main window gets focus.
causing the pointer to jump back and forth. */
if ((e_config->focus_policy != E_FOCUS_CLICK) &&
!(bd->client.icccm.name && !strcmp(bd->client.icccm.name, "VCLSalFrame")))
ecore_x_pointer_warp(bd->zone->container->win,
bd->x + (bd->w / 2), bd->y + (bd->h / 2));
e_border_focus_set(bd, 1, 1);
}
}
}
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_e_manager_frame_extents_free_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__,
void *data, void *fdata __UNUSED__)
{
free(data);
return EINA_TRUE;
}
static E_Manager *
_e_manager_get_for_root(Ecore_X_Window root)
{
Eina_List *l;
E_Manager *man;
if (!managers) return NULL;
EINA_LIST_FOREACH(managers, l, man)
{
if (man->root == root)
return man;
}
return eina_list_data_get(managers);
}
static Eina_Bool
_e_manager_clear_timer(void *data)
{
E_Manager *man = data;
ecore_x_window_background_color_set(man->root, 0, 0, 0);
man->clear_timer = NULL;
return EINA_FALSE;
}
#if 0 /* use later - maybe */
static int _e_manager_cb_window_destroy(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_hide(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_reparent(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_create(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_configure_request(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_configure(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_gravity(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_stack(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_stack_request(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_property(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_colormap(void *data, int ev_type, void *ev){return 1;}
static int _e_manager_cb_window_shape(void *data, int ev_type, void *ev){return 1;}
#endif