diff --git a/netwm.txt b/netwm.txt index f95dcd482..9c3d318e4 100644 --- a/netwm.txt +++ b/netwm.txt @@ -7,13 +7,16 @@ * E can have multiple virtual roots AND multiple desktops AND several * zones when using xinerama */ +/* + * T = For taskbar + */ _NET_ACTIVE_WINDOW [?] /* Listen to active window requests */ _NET_CLIENT_LIST [X] _NET_CLIENT_LIST_STACKING [X] _NET_CLOSE_WINDOW [P] _NET_CURRENT_DESKTOP [P] -_NET_DESKTOP_GEOMETRY [?] /* Listen to _NET_DESKTOP_GEOMETRY requests */ +_NET_DESKTOP_GEOMETRY [P] _NET_DESKTOP_LAYOUT [P] _NET_DESKTOP_NAMES [ ] _NET_DESKTOP_VIEWPORT [P] @@ -37,10 +40,10 @@ _NET_WM_ACTION_RESIZE [ ] _NET_WM_ACTION_SHADE [ ] _NET_WM_ACTION_STICK [ ] _NET_WM_ALLOWED_ACTIONS [ ] -_NET_WM_DESKTOP [?] /* Remove this property on unmap */ -_NET_WM_HANDLED_ICONS [ ] +_NET_WM_DESKTOP [ ] +_NET_WM_HANDLED_ICONS [T] _NET_WM_ICON [X] -_NET_WM_ICON_GEOMETRY [ ] +_NET_WM_ICON_GEOMETRY [T] _NET_WM_ICON_NAME [X] _NET_WM_MOVERESIZE [ ] _NET_WM_NAME [X] @@ -63,11 +66,11 @@ _NET_WM_STATE_FULLSCREEN [X] _NET_WM_STATE_ABOVE [X] _NET_WM_STATE_BELOW [X] _NET_WM_STATE_DEMANDS_ATTENTION [ ] -_NET_WM_STRUT [ ] -_NET_WM_STRUT_PARTIAL [ ] +_NET_WM_STRUT [X] +_NET_WM_STRUT_PARTIAL [X] _NET_WM_SYNC_REQUEST [ ] _NET_WM_SYNC_REQUEST_COUNTER [ ] -_NET_WM_USER_TIME [ ] +_NET_WM_USER_TIME [X] _NET_WM_VISIBLE_ICON_NAME [X] /* E uses _NET_WM_ICON_NAME, doesn't need to set this */ _NET_WM_VISIBLE_NAME [X] /* E uses _NET_WM_NAME, doesn't need to set this */ /* Do we have to do anything special with these, except @@ -81,4 +84,4 @@ _NET_WM_WINDOW_TYPE_UTILITY [X] _NET_WM_WINDOW_TYPE_SPLASH [X] _NET_WM_WINDOW_TYPE_DIALOG [X] _NET_WM_WINDOW_TYPE_NORMAL [X] -_NET_WORKAREA [ ] +_NET_WORKAREA [X] diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 1e4fbf64d..663cdd2f2 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -355,6 +355,20 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map) { bd->client.netwm.fetch.icon = 1; } + else if (atoms[i] == ECORE_X_ATOM_NET_WM_USER_TIME) + { + bd->client.netwm.fetch.user_time = 1; + } + else if (atoms[i] == ECORE_X_ATOM_NET_WM_STRUT) + { + printf("ECORE_X_ATOM_NET_WM_STRUT\n"); + bd->client.netwm.fetch.strut = 1; + } + else if (atoms[i] == ECORE_X_ATOM_NET_WM_STRUT_PARTIAL) + { + printf("ECORE_X_ATOM_NET_WM_STRUT_PARTIAL\n"); + bd->client.netwm.fetch.strut = 1; + } } free(atoms); } @@ -1971,6 +1985,21 @@ _e_border_cb_window_property(void *data, int ev_type, void *ev) bd->client.netwm.fetch.icon = 1; bd->changed = 1; } + else if (e->atom == ECORE_X_ATOM_NET_WM_USER_TIME) + { + bd->client.netwm.fetch.user_time = 1; + bd->changed = 1; + } + else if (e->atom == ECORE_X_ATOM_NET_WM_STRUT) + { + bd->client.netwm.fetch.strut = 1; + bd->changed = 1; + } + else if (e->atom == ECORE_X_ATOM_NET_WM_STRUT_PARTIAL) + { + bd->client.netwm.fetch.strut = 1; + bd->changed = 1; + } */ return 1; } @@ -2944,6 +2973,44 @@ _e_border_eval(E_Border *bd) bd->changes.icon = 1; bd->client.netwm.fetch.icon = 0; } + if (bd->client.netwm.fetch.user_time) + { + ecore_x_netwm_user_time_get(bd->client.win, &bd->client.netwm.user_time); + + bd->client.netwm.fetch.user_time = 0; + } + if (bd->client.netwm.fetch.strut) + { + if (!ecore_x_netwm_strut_partial_get(bd->client.win, + &bd->client.netwm.strut.left, + &bd->client.netwm.strut.right, + &bd->client.netwm.strut.top, + &bd->client.netwm.strut.bottom, + &bd->client.netwm.strut.left_start_y, + &bd->client.netwm.strut.left_end_y, + &bd->client.netwm.strut.right_start_y, + &bd->client.netwm.strut.right_end_y, + &bd->client.netwm.strut.top_start_x, + &bd->client.netwm.strut.top_end_x, + &bd->client.netwm.strut.bottom_start_x, + &bd->client.netwm.strut.bottom_end_x)) + { + ecore_x_netwm_strut_get(bd->client.win, + &bd->client.netwm.strut.left, &bd->client.netwm.strut.right, + &bd->client.netwm.strut.top, &bd->client.netwm.strut.bottom); + + bd->client.netwm.strut.left_start_y = 0; + bd->client.netwm.strut.left_end_y = 0; + bd->client.netwm.strut.right_start_y = 0; + bd->client.netwm.strut.right_end_y = 0; + bd->client.netwm.strut.top_start_x = 0; + bd->client.netwm.strut.top_end_x = 0; + bd->client.netwm.strut.bottom_start_x = 0; + bd->client.netwm.strut.bottom_end_x = 0; + } + + bd->client.netwm.fetch.strut = 0; + } if (bd->changes.icon) { if (bd->icon_object) diff --git a/src/bin/e_border.h b/src/bin/e_border.h index cbb61bdaa..b8a17c853 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -168,6 +168,21 @@ struct _E_Border int height; int size; } icon; + unsigned int user_time; + struct { + int left; + int right; + int top; + int bottom; + int left_start_y; + int left_end_y; + int right_start_y; + int right_end_y; + int top_start_x; + int top_end_x; + int bottom_start_x; + int bottom_end_x; + } strut; /* NetWM Window state */ struct { @@ -189,6 +204,8 @@ struct _E_Border unsigned char name : 1; unsigned char icon_name : 1; unsigned char icon : 1; + unsigned char user_time : 1; + unsigned char strut : 1; /* No, fetch on new_client, shouldn't be changed after map. unsigned char pid : 1; */ diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index ad371d2b8..60932c75a 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -43,8 +43,6 @@ e_hints_init(void) ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_CLIENT_LIST, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_CLIENT_LIST_STACKING, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_DESKTOP_GEOMETRY, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_FRAME_EXTENTS, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_SUPPORTED, 1); @@ -68,6 +66,10 @@ e_hints_init(void) ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_ABOVE, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_BELOW, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STRUT, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STRUT_PARTIAL, 1); + + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_USER_TIME, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_VISIBLE_NAME, 1); @@ -80,6 +82,7 @@ e_hints_init(void) ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WORKAREA, 1); } free(roots); } @@ -108,7 +111,6 @@ e_hints_e16_comms_pretend(E_Manager *man) void e_hints_manager_init(E_Manager *man) { - ecore_x_netwm_desk_size_set(man->root, man->w, man->h); e_hints_e16_comms_pretend(man); } @@ -1033,7 +1035,9 @@ e_hints_window_desktop_set(E_Border *bd) deskpos[1] = bd->desk->y; ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_DESK, deskpos, 2); +#if 0 ecore_x_netwm_desktop_set(bd->client.win, current); +#endif bd->client.netwm.desktop = current; } }