From a0bab24802c3773e34d5ad75b010d2c2ed09b498 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 28 May 2005 13:22:15 +0000 Subject: [PATCH] fix shaped windows - event loop put some fixme's in for netwm.. too many round trips -especially on map SVN revision: 14987 --- src/bin/e_atoms.c | 1 + src/bin/e_border.c | 77 ++++++++++++++++++++++++++++++++++++++++++++-- src/bin/e_border.h | 29 ++++++++++++----- src/bin/e_hints.c | 6 ++++ src/bin/e_intl.c | 7 +++-- 5 files changed, 107 insertions(+), 13 deletions(-) diff --git a/src/bin/e_atoms.c b/src/bin/e_atoms.c index 28264f590..aeedcd92f 100644 --- a/src/bin/e_atoms.c +++ b/src/bin/e_atoms.c @@ -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; } diff --git a/src/bin/e_border.c b/src/bin/e_border.c index c06d216eb..23eae1ad4 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -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, diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 0a1efe36c..05a79feeb 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -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; diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index aa970aaa5..9e01961b0 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -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 = diff --git a/src/bin/e_intl.c b/src/bin/e_intl.c index 1d5343e1a..d21ded5c0 100644 --- a/src/bin/e_intl.c +++ b/src/bin/e_intl.c @@ -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 {