forked from enlightenment/enlightenment
fix shaped windows - event loop
put some fixme's in for netwm.. too many round trips -especially on map SVN revision: 14987
This commit is contained in:
parent
bf701a2010
commit
a0bab24802
|
@ -23,6 +23,7 @@ e_atoms_init(void)
|
|||
E_ATOM_MAPPED = ecore_x_atom_get("__E_WINDOW_MAPPED");
|
||||
E_ATOM_SHADE_DIRECTION = ecore_x_atom_get("__E_WINDOW_SHADE_DIRECTION");
|
||||
E_ATOM_HIDDEN = ecore_x_atom_get("__E_WINDOW_HIDDEN");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -289,6 +289,40 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
|
|||
bd->client.icccm.max_aspect = 0.0;
|
||||
bd->client.icccm.accepts_focus = 1;
|
||||
|
||||
{
|
||||
int at_num = 0, i;
|
||||
Ecore_X_Atom *atoms;
|
||||
|
||||
atoms = ecore_x_window_prop_list(bd->client.win, &at_num);
|
||||
if (atoms)
|
||||
{
|
||||
for (i = 0; i < at_num; i++)
|
||||
{
|
||||
if (atoms[i] == ECORE_X_ATOM_WM_NAME)
|
||||
bd->client.icccm.fetch.title = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_CLASS)
|
||||
bd->client.icccm.fetch.name_class = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_ICON_NAME)
|
||||
bd->client.icccm.fetch.icon_name = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_CLIENT_MACHINE)
|
||||
bd->client.icccm.fetch.machine = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_HINTS)
|
||||
bd->client.icccm.fetch.hints = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_NORMAL_HINTS)
|
||||
bd->client.icccm.fetch.size_pos_hints = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_PROTOCOLS)
|
||||
bd->client.icccm.fetch.protocol = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_MOTIF_WM_HINTS)
|
||||
bd->client.mwm.fetch.hints = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_TRANSIENT_FOR)
|
||||
bd->client.icccm.fetch.transient_for = 1;
|
||||
else if (atoms[i] == ECORE_X_ATOM_WM_WINDOW_ROLE)
|
||||
bd->client.icccm.fetch.window_role = 1;
|
||||
}
|
||||
free(atoms);
|
||||
}
|
||||
}
|
||||
/*
|
||||
bd->client.icccm.fetch.title = 1;
|
||||
bd->client.icccm.fetch.name_class = 1;
|
||||
bd->client.icccm.fetch.icon_name = 1;
|
||||
|
@ -297,8 +331,10 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
|
|||
bd->client.icccm.fetch.size_pos_hints = 1;
|
||||
bd->client.icccm.fetch.protocol = 1;
|
||||
bd->client.mwm.fetch.hints = 1;
|
||||
*/
|
||||
bd->client.border.changed = 1;
|
||||
|
||||
/* FIXME; set fetch flags as above */
|
||||
bd->client.netwm.pid = 0;
|
||||
bd->client.netwm.desktop = 0;
|
||||
bd->client.netwm.state.modal = 0;
|
||||
|
@ -1146,7 +1182,8 @@ e_border_find_by_client_window(Ecore_X_Window win)
|
|||
E_Border *bd;
|
||||
|
||||
bd = evas_hash_find(borders_hash, _e_border_winid_str_get(win));
|
||||
if ((bd) && (!e_object_is_del(E_OBJECT(bd))))
|
||||
if ((bd) && (!e_object_is_del(E_OBJECT(bd))) &&
|
||||
(bd->client.win == win))
|
||||
return bd;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1154,13 +1191,25 @@ e_border_find_by_client_window(Ecore_X_Window win)
|
|||
E_Border *
|
||||
e_border_find_by_frame_window(Ecore_X_Window win)
|
||||
{
|
||||
return e_border_find_by_client_window(win);
|
||||
E_Border *bd;
|
||||
|
||||
bd = evas_hash_find(borders_hash, _e_border_winid_str_get(win));
|
||||
if ((bd) && (!e_object_is_del(E_OBJECT(bd))) &&
|
||||
(bd->bg_win == win))
|
||||
return bd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
E_Border *
|
||||
e_border_find_by_window(Ecore_X_Window win)
|
||||
{
|
||||
return e_border_find_by_client_window(win);
|
||||
E_Border *bd;
|
||||
|
||||
bd = evas_hash_find(borders_hash, _e_border_winid_str_get(win));
|
||||
if ((bd) && (!e_object_is_del(E_OBJECT(bd))) &&
|
||||
(bd->win == win))
|
||||
return bd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
E_Border *
|
||||
|
@ -1444,6 +1493,7 @@ _e_border_free(E_Border *bd)
|
|||
if (bd->client.icccm.class) free(bd->client.icccm.class);
|
||||
if (bd->client.icccm.icon_name) free(bd->client.icccm.icon_name);
|
||||
if (bd->client.icccm.machine) free(bd->client.icccm.machine);
|
||||
if (bd->client.icccm.window_role) free(bd->client.icccm.window_role);
|
||||
e_object_del(E_OBJECT(bd->shape));
|
||||
if (bd->icon_object) evas_object_del(bd->icon_object);
|
||||
evas_object_del(bd->bg_object);
|
||||
|
@ -1827,6 +1877,16 @@ _e_border_cb_window_property(void *data, int ev_type, void *ev)
|
|||
bd->client.mwm.fetch.hints = 1;
|
||||
bd->changed = 1;
|
||||
}
|
||||
else if (e->atom == ECORE_X_ATOM_WM_TRANSIENT_FOR)
|
||||
{
|
||||
bd->client.icccm.fetch.transient_for = 1;
|
||||
bd->changed = 1;
|
||||
}
|
||||
else if (e->atom == ECORE_X_ATOM_WM_WINDOW_ROLE)
|
||||
{
|
||||
bd->client.icccm.fetch.window_role = 1;
|
||||
bd->changed = 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2918,6 +2978,16 @@ _e_border_eval(E_Border *bd)
|
|||
}
|
||||
bd->client.mwm.fetch.hints = 0;
|
||||
}
|
||||
if (bd->client.icccm.fetch.transient_for)
|
||||
{
|
||||
bd->client.icccm.transient_for = ecore_x_icccm_transient_for_get(bd->client.win);
|
||||
bd->client.icccm.fetch.transient_for = 0;
|
||||
}
|
||||
if (bd->client.icccm.fetch.window_role)
|
||||
{
|
||||
bd->client.icccm.window_role = ecore_x_icccm_window_role_get(bd->client.win);
|
||||
bd->client.icccm.fetch.window_role = 0;
|
||||
}
|
||||
if (bd->changes.shape)
|
||||
{
|
||||
Ecore_X_Rectangle *rects;
|
||||
|
@ -3217,6 +3287,7 @@ _e_border_eval(E_Border *bd)
|
|||
ecore_event_add(E_EVENT_BORDER_ADD, ev, _e_border_event_border_add_free, NULL);
|
||||
|
||||
/* Recreate state */
|
||||
/* FIXME: this should be split into property fetches and state setup */
|
||||
e_hints_window_init(bd);
|
||||
|
||||
ecore_x_icccm_move_resize_send(bd->client.win,
|
||||
|
|
|
@ -127,20 +127,24 @@ struct _E_Border
|
|||
Ecore_X_Pixmap icon_mask;
|
||||
Ecore_X_Window icon_window;
|
||||
Ecore_X_Window window_group;
|
||||
Ecore_X_Window transient_for;
|
||||
Ecore_X_Gravity gravity;
|
||||
char *window_role;
|
||||
unsigned char take_focus : 1;
|
||||
unsigned char accepts_focus : 1;
|
||||
unsigned char urgent : 1;
|
||||
unsigned char delete_request : 1;
|
||||
unsigned char request_pos : 1;
|
||||
struct {
|
||||
unsigned int title : 1;
|
||||
unsigned int name_class : 1;
|
||||
unsigned int icon_name : 1;
|
||||
unsigned int machine : 1;
|
||||
unsigned int hints : 1;
|
||||
unsigned int size_pos_hints : 1;
|
||||
unsigned int protocol : 1;
|
||||
unsigned char title : 1;
|
||||
unsigned char name_class : 1;
|
||||
unsigned char icon_name : 1;
|
||||
unsigned char machine : 1;
|
||||
unsigned char hints : 1;
|
||||
unsigned char size_pos_hints : 1;
|
||||
unsigned char protocol : 1;
|
||||
unsigned char transient_for : 1;
|
||||
unsigned char window_role : 1;
|
||||
} fetch;
|
||||
} icccm;
|
||||
struct {
|
||||
|
@ -150,10 +154,11 @@ struct _E_Border
|
|||
unsigned char exists : 1;
|
||||
unsigned char borderless : 1;
|
||||
struct {
|
||||
unsigned int hints : 1;
|
||||
unsigned char hints : 1;
|
||||
} fetch;
|
||||
} mwm;
|
||||
struct {
|
||||
/* FIXME: add name field */
|
||||
pid_t pid;
|
||||
unsigned int desktop;
|
||||
|
||||
|
@ -173,6 +178,14 @@ struct _E_Border
|
|||
|
||||
Ecore_X_Window_Type type;
|
||||
|
||||
struct {
|
||||
unsigned char name : 1;
|
||||
unsigned char pid : 1;
|
||||
unsigned char desktop : 1;
|
||||
unsigned char type : 1;
|
||||
unsigned char icon_name : 1;
|
||||
unsigned char state : 1;
|
||||
} fetch;
|
||||
} netwm;
|
||||
Ecore_X_Window_Attributes initial_attributes;
|
||||
} client;
|
||||
|
|
|
@ -244,6 +244,9 @@ e_hints_window_name_set(E_Border *bd)
|
|||
void
|
||||
e_hints_window_name_get(E_Border *bd)
|
||||
{
|
||||
/* FIXME: only call from border_eval() if fetch flag set */
|
||||
/* FIXME: split name into icccm and netwm name - prefer netwm name */
|
||||
/* if its not NULL */
|
||||
char *name;
|
||||
|
||||
name = ecore_x_netwm_name_get(bd->client.win);
|
||||
|
@ -318,6 +321,7 @@ e_hints_desktop_config_set(void)
|
|||
void
|
||||
e_hints_window_init(E_Border *bd)
|
||||
{
|
||||
/* FIXME: only call from border_eval() if fetch flag set */
|
||||
e_hints_window_state_get(bd);
|
||||
e_hints_window_type_get(bd);
|
||||
|
||||
|
@ -443,6 +447,7 @@ void e_hints_window_type_set(E_Border *bd)
|
|||
|
||||
void e_hints_window_type_get(E_Border *bd)
|
||||
{
|
||||
/* FIXME: only call from border_eval() if fetch flag set */
|
||||
bd->client.netwm.type = ecore_x_netwm_window_type_get(bd->client.win);
|
||||
}
|
||||
|
||||
|
@ -831,6 +836,7 @@ e_hints_window_state_get(E_Border *bd)
|
|||
{
|
||||
int above, below;
|
||||
|
||||
/* FIXME: each of these is a round trip. need to make it a single fetch */
|
||||
bd->client.netwm.state.modal =
|
||||
ecore_x_netwm_window_state_isset(bd->client.win, ECORE_X_WINDOW_STATE_MODAL);
|
||||
bd->client.netwm.state.sticky =
|
||||
|
|
|
@ -99,12 +99,15 @@ e_intl_language_set(const char *lang)
|
|||
|
||||
/* FIXME: determine if in user or system locale dir */
|
||||
if (_e_intl_language) free(_e_intl_language);
|
||||
if (!lang) lang = getenv("LANGUAGE");
|
||||
if (!lang) lang = getenv("LC_ALL");
|
||||
if (!lang) lang = getenv("LANG");
|
||||
if (lang)
|
||||
{
|
||||
_e_intl_language = strdup(lang);
|
||||
e_util_env_set("LANG", _e_intl_language);
|
||||
if (getenv("LC_ALL")) e_util_env_set("LC_ALL", _e_intl_language);
|
||||
e_util_env_set("LANGUAGE", _e_intl_language);
|
||||
e_util_env_set("LC_ALL", _e_intl_language);
|
||||
if (getenv("LANG")) e_util_env_set("LANG", _e_intl_language);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue