diff --git a/src/bin/e_atoms.c b/src/bin/e_atoms.c index 72207d22d..1575186a1 100644 --- a/src/bin/e_atoms.c +++ b/src/bin/e_atoms.c @@ -14,6 +14,7 @@ EAPI Ecore_X_Atom E_ATOM_HIDDEN = 0; EAPI Ecore_X_Atom E_ATOM_BORDER_SIZE = 0; EAPI Ecore_X_Atom E_ATOM_WINDOW_STATE = 0; EAPI Ecore_X_Atom E_ATOM_WINDOW_STATE_CENTERED = 0; +EAPI Ecore_X_Atom E_ATOM_DESKTOP_FILE = 0; /* externally accessible functions */ EAPI int @@ -29,11 +30,12 @@ e_atoms_init(void) "__E_WINDOW_HIDDEN", "__E_WINDOW_BORDER_SIZE", "__E_ATOM_WINDOW_STATE", - "__E_ATOM_WINDOW_STATE_CENTERED" + "__E_ATOM_WINDOW_STATE_CENTERED", + "__E_ATOM_DESKTOP_FILE" }; - Ecore_X_Atom atoms[10]; + Ecore_X_Atom atoms[11]; - ecore_x_atoms_get(atom_names, 10, atoms); + ecore_x_atoms_get(atom_names, 11, atoms); E_ATOM_MANAGED = atoms[0]; E_ATOM_CONTAINER = atoms[1]; E_ATOM_ZONE = atoms[2]; @@ -44,6 +46,7 @@ e_atoms_init(void) E_ATOM_BORDER_SIZE = atoms[7]; E_ATOM_WINDOW_STATE = atoms[8]; E_ATOM_WINDOW_STATE_CENTERED = atoms[9]; + E_ATOM_DESKTOP_FILE = atoms[10]; return 1; } diff --git a/src/bin/e_atoms.h b/src/bin/e_atoms.h index 47ce422bc..f7fef172d 100644 --- a/src/bin/e_atoms.h +++ b/src/bin/e_atoms.h @@ -17,6 +17,7 @@ extern EAPI Ecore_X_Atom E_ATOM_MAPPED; extern EAPI Ecore_X_Atom E_ATOM_SHADE_DIRECTION; extern EAPI Ecore_X_Atom E_ATOM_HIDDEN; extern EAPI Ecore_X_Atom E_ATOM_BORDER_SIZE; +extern EAPI Ecore_X_Atom E_ATOM_DESKTOP_FILE; /* extra e window states */ /* if we add more states, we need to fix diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 439b6f09a..daae8557a 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -7368,7 +7368,8 @@ _e_border_eval(E_Border *bd) if ((bd->client.icccm.name) && (bd->client.icccm.class)) bd->desktop = efreet_util_desktop_wm_class_find(bd->client.icccm.name, bd->client.icccm.class); - if (bd->desktop) efreet_desktop_ref(bd->desktop); + /* already refd by desktop_wm_class_find */ + /* if (bd->desktop) efreet_desktop_ref(bd->desktop); */ } if (!bd->desktop) { @@ -7376,6 +7377,19 @@ _e_border_eval(E_Border *bd) bd->client.netwm.pid); if (bd->desktop) efreet_desktop_ref(bd->desktop); } + if (!bd->desktop && bd->client.icccm.name) + { + /* this works for most cases as fallback. useful when app is + run from a shell */ + bd->desktop = efreet_util_desktop_exec_find(bd->client.icccm.name); + } + + if (bd->desktop) + { + ecore_x_window_prop_string_set(bd->client.win, E_ATOM_DESKTOP_FILE, + bd->desktop->orig_path); + } + bd->icon_object = e_border_icon_add(bd, bd->bg_evas); if ((bd->focused) && (bd->icon_object)) edje_object_signal_emit(bd->icon_object, "e,state,focused", "e"); diff --git a/src/bin/e_manager.c b/src/bin/e_manager.c index 1c4e8a3d7..04fabffb7 100644 --- a/src/bin/e_manager.c +++ b/src/bin/e_manager.c @@ -256,6 +256,8 @@ e_manager_manage_windows(E_Manager *man) 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 */ @@ -282,6 +284,14 @@ e_manager_manage_windows(E_Manager *man) 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) @@ -292,6 +302,7 @@ e_manager_manage_windows(E_Manager *man) * 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; } } }