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:
Carsten Haitzler 2005-05-28 13:22:15 +00:00
parent bf701a2010
commit a0bab24802
5 changed files with 107 additions and 13 deletions

View File

@ -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;
}

View File

@ -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,

View File

@ -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;

View File

@ -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 =

View File

@ -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
{