diff --git a/netwm.txt b/netwm.txt index 8d73a3ed3..a2ee665d4 100644 --- a/netwm.txt +++ b/netwm.txt @@ -1,6 +1,11 @@ -_NET_ACTIVE_WINDOW [ ] -_NET_CLIENT_LIST [ ] -_NET_CLIENT_LIST_STACKING [ ] +/* + * Not all of these are hints, just copied out + * everything with _NET in it from the spec. + */ + +_NET_ACTIVE_WINDOW [?] /* Listen to active window requests */ +_NET_CLIENT_LIST [X] +_NET_CLIENT_LIST_STACKING [X] _NET_CLOSE_WINDOW [ ] _NET_CURRENT_DESKTOP [ ] _NET_DESKTOP_GEOMETRY [ ] @@ -17,7 +22,7 @@ _NET_RESTACK_WINDOW [ ] _NET_SHOWING_DESKTOP [ ] _NET_SUPPORTED [X] _NET_SUPPORTING_WM_CHECK [X] -_NET_VIRTUAL_ROOTS [ ] +_NET_VIRTUAL_ROOTS [X] _NET_WM_ACTION_CHANGE_DESKTOP [ ] _NET_WM_ACTION_CLOSE [ ] _NET_WM_ACTION_FULLSCREEN [ ] @@ -31,7 +36,7 @@ _NET_WM_ACTION_STICK [ ] _NET_WM_ALLOWED_ACTIONS [ ] _NET_WM_BOTTOMLEFT [ ] _NET_WM_BOTTOMRIGHT [ ] -_NET_WM_DESKTOP [ ] +_NET_WM_DESKTOP [?] /* Remove this property on unmap */ _NET_WM_HANDLED_ICONS [ ] _NET_WM_ICON [ ] _NET_WM_ICON_GEOMETRY [ ] @@ -48,27 +53,24 @@ _NET_WM_MOVERESIZE_SIZE_RIGHT [ ] _NET_WM_MOVERESIZE_SIZE_TOP [ ] _NET_WM_MOVERESIZE_SIZE_TOPLEFT [ ] _NET_WM_MOVERESIZE_SIZE_TOPRIGHT [ ] -_NET_WM_NAME [ ] +_NET_WM_NAME [X] _NET_WM_ORIENTATION_HORZ [ ] _NET_WM_ORIENTATION_VERT [ ] -_NET_WM_PID [ ] +_NET_WM_PID [X] _NET_WM_PING [ ] -_NET_WM_STATE [ ] -_NET_WM_STATE_ABOVE [ ] -_NET_WM_STATE_ADD [ ] -_NET_WM_STATE_BELOW [ ] +_NET_WM_STATE [X] +_NET_WM_STATE_ABOVE [X] +_NET_WM_STATE_BELOW [X] _NET_WM_STATE_DEMANDS_ATTENTION [ ] -_NET_WM_STATE_FULLSCREEN [ ] -_NET_WM_STATE_HIDDEN [ ] -_NET_WM_STATE_MAXIMIZED_HORZ [ ] -_NET_WM_STATE_MAXIMIZED_VERT [ ] +_NET_WM_STATE_FULLSCREEN [X] +_NET_WM_STATE_HIDDEN [X] +_NET_WM_STATE_MAXIMIZED_HORZ [X] +_NET_WM_STATE_MAXIMIZED_VERT [X] _NET_WM_STATE_MODAL [ ] -_NET_WM_STATE_REMOVE [ ] -_NET_WM_STATE_SHADED [ ] +_NET_WM_STATE_SHADED [X] _NET_WM_STATE_SKIP_PAGER [ ] _NET_WM_STATE_SKIP_TASKBAR [ ] -_NET_WM_STATE_STICKY [ ] -_NET_WM_STATE_TOGGLE [ ] +_NET_WM_STATE_STICKY [X] _NET_WM_STRUT [ ] _NET_WM_STRUT_PARTIAL [ ] _NET_WM_SYNC_REQUEST [ ] diff --git a/src/bin/e_border.c b/src/bin/e_border.c index f7bbda2f3..202c54d78 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -37,6 +37,7 @@ static int _e_border_cb_window_shape(void *data, int ev_type, void *ev); static int _e_border_cb_window_focus_in(void *data, int ev_type, void *ev); static int _e_border_cb_window_focus_out(void *data, int ev_type, void *ev); static int _e_border_cb_window_state(void *data, int ev_type, void *ev); +static int _e_border_cb_desktop_change(void *data, int ev_type, void *ev); static int _e_border_cb_client_message(void *data, int ev_type, void *ev); static void _e_border_cb_signal_move_start(void *data, Evas_Object *obj, const char *emission, const char *source); @@ -159,6 +160,7 @@ e_border_init(void) handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _e_border_cb_window_focus_in, NULL)); handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _e_border_cb_window_focus_out, NULL)); handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_WINDOW_STATE, _e_border_cb_window_state, NULL)); + handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_DESKTOP_CHANGE, _e_border_cb_desktop_change, NULL)); handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _e_border_cb_client_message, NULL)); ecore_x_passive_grab_replay_func_set(_e_border_cb_grab_replay, NULL); @@ -291,8 +293,6 @@ 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.netwm.fetch.pid = 1; - bd->client.netwm.fetch.desktop = 1; bd->client.border.changed = 1; bd->client.w = att->w; @@ -379,8 +379,6 @@ void e_border_desk_set(E_Border *bd, E_Desk *desk) { E_Event_Border_Desk_Set *ev; - int deskx, desky; - unsigned int deskpos[2]; E_OBJECT_CHECK(bd); E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE); @@ -390,17 +388,14 @@ e_border_desk_set(E_Border *bd, E_Desk *desk) bd->desk = desk; e_border_zone_set(bd, desk->zone); + e_hints_window_desktop_set(bd); + ev = calloc(1, sizeof(E_Event_Border_Desk_Set)); ev->border = bd; e_object_ref(E_OBJECT(bd)); ev->desk = desk; e_object_ref(E_OBJECT(desk)); ecore_event_add(E_EVENT_BORDER_DESK_SET, ev, _e_border_event_border_desk_set_free, NULL); - - e_desk_xy_get(desk, &deskx, &desky); - deskpos[0] = deskx; - deskpos[1] = desky; - ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_DESK, deskpos, 2); } void @@ -1789,17 +1784,6 @@ _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_NET_WM_PID) - { - bd->client.netwm.fetch.pid = 1; - bd->changed = 1; - } - else if (e->atom == ECORE_X_ATOM_NET_WM_DESKTOP) - { - bd->client.netwm.fetch.desktop = 1; - bd->changed = 1; - } -// bd->client.border.changed = 1; return 1; } @@ -1967,7 +1951,12 @@ _e_border_cb_window_state(void *data, int ev_type, void *ev) e = ev; bd = e_border_find_by_client_window(e->win); - if (!bd) + if (bd) + { + for (i = 0; i < 2; i++) + e_hints_window_state_update(bd, e->state[i], e->action); + } + else { for (i = 0; i < 2; i++) { @@ -2005,10 +1994,37 @@ _e_border_cb_window_state(void *data, int ev_type, void *ev) } } } + return 1; +} + +static int +_e_border_cb_desktop_change(void *data, int ev_type, void *ev) +{ + E_Border *bd; + Ecore_X_Event_Desktop_Change *e; + + e = ev; + if (e->desk < 0) return 1; + bd = e_border_find_by_client_window(e->win); + if (bd) + { + if (bd->client.netwm.desktop == 0xffffffff) + e_border_stick(bd); + else if (e->desk < (bd->zone->desk_x_count * bd->zone->desk_y_count)) + { + E_Desk *desk; + int x, y; + + y = e->desk / bd->zone->desk_x_count; + x = e->desk - (y * bd->zone->desk_x_count); + + desk = e_desk_at_xy_get(bd->zone, x, y); + e_border_desk_set(bd, desk); + } + } else { - for (i = 0; i < 2; i++) - e_hints_window_state_update(bd, e->state[i], e->action); + ecore_x_netwm_desktop_set(e->win, e->desk); } return 1; } @@ -2839,18 +2855,6 @@ _e_border_eval(E_Border *bd) } bd->client.mwm.fetch.hints = 0; } - if (bd->client.netwm.fetch.pid) - { - if (!ecore_x_netwm_pid_get(bd->client.win, &bd->client.netwm.pid)) - bd->client.netwm.pid = -1; - bd->client.netwm.fetch.pid = 0; - } - if (bd->client.netwm.fetch.desktop) - { - if (!ecore_x_netwm_desktop_get(bd->client.win, &bd->client.netwm.desktop)) - bd->client.netwm.desktop = -1; - bd->client.netwm.fetch.desktop = 0; - } if (bd->changes.shape) { diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 41020f4a6..a3dfff4ab 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -148,11 +148,7 @@ struct _E_Border struct { pid_t pid; unsigned int desktop; - struct { - unsigned int pid : 1; - unsigned int desktop : 1; - } fetch; - + /* NetWM Window state */ struct { unsigned char modal : 1; diff --git a/src/bin/e_container.c b/src/bin/e_container.c index 3d6626c37..7125f5726 100644 --- a/src/bin/e_container.c +++ b/src/bin/e_container.c @@ -592,6 +592,7 @@ e_container_window_lower(E_Container *con, Ecore_X_Window win, int layer) 0, 0, 0, 0, 0, con->layers[pos].win, ECORE_X_WINDOW_STACK_ABOVE); } + void e_container_border_raise(E_Border *bd) { @@ -620,6 +621,8 @@ e_container_border_raise(E_Border *bd) bd->zone->container->layers[pos - 1].clients = evas_list_append(bd->zone->container->layers[pos - 1].clients, bd); + + e_hints_client_stacking_set(); } void @@ -650,6 +653,8 @@ e_container_border_lower(E_Border *bd) bd->zone->container->layers[pos].clients = evas_list_prepend(bd->zone->container->layers[pos].clients, bd); + + e_hints_client_stacking_set(); } void diff --git a/src/bin/e_hints.c b/src/bin/e_hints.c index c3ae01f39..5c8c54087 100644 --- a/src/bin/e_hints.c +++ b/src/bin/e_hints.c @@ -24,91 +24,33 @@ e_hints_init(void) // on finding this out when it shoudl be irrelevant! stupid FUCKS. ecore_x_netwm_wm_identify(roots[i], win, "KWin"); // ecore_x_netwm_wm_identify(roots[i], win, "Enlightenment"); - /* Set what we support */ + + /* Set what hints we support */ + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_ACTIVE_WINDOW, 1); + 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_SUPPORTED, 1); ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, 1); - /* - ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS; - ECORE_X_ATOM_NET_VIRTUAL_ROOTS; - ECORE_X_ATOM_NET_DESKTOP_NAMES; - ECORE_X_ATOM_NET_DESKTOP_GEOMETRY; - ECORE_X_ATOM_NET_DESKTOP_VIEWPORT; - ECORE_X_ATOM_NET_DESKTOP_LAYOUT; - ECORE_X_ATOM_NET_WORKAREA; + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_VIRTUAL_ROOTS, 1); - ECORE_X_ATOM_NET_CURRENT_DESKTOP; - ECORE_X_ATOM_NET_SHOWING_DESKTOP; + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_NAME, 1); - ECORE_X_ATOM_NET_CLIENT_LIST; - ECORE_X_ATOM_NET_CLIENT_LIST_STACKING; - ECORE_X_ATOM_NET_ACTIVE_WINDOW; - - ECORE_X_ATOM_NET_WM_NAME; - ECORE_X_ATOM_NET_WM_VISIBLE_NAME; - ECORE_X_ATOM_NET_WM_ICON_NAME; - ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME; - ECORE_X_ATOM_NET_WM_DESKTOP; - ECORE_X_ATOM_NET_WM_STRUT; - ECORE_X_ATOM_NET_WM_STRUT_PARTIAL; - ECORE_X_ATOM_NET_WM_ICON_GEOMETRY; - ECORE_X_ATOM_NET_WM_ICON; - ECORE_X_ATOM_NET_WM_PID; - ECORE_X_ATOM_NET_WM_HANDLED_ICONS; - ECORE_X_ATOM_NET_WM_USER_TIME; - - ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS; - ECORE_X_ATOM_NET_WM_ACTION_MOVE; - ECORE_X_ATOM_NET_WM_ACTION_RESIZE; - ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE; - ECORE_X_ATOM_NET_WM_ACTION_SHADE; - ECORE_X_ATOM_NET_WM_ACTION_STICK; - ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ; - ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT; - ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN; - ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP; - ECORE_X_ATOM_NET_WM_ACTION_CLOSE; - - ECORE_X_ATOM_NET_WM_WINDOW_TYPE; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG; - ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL; - -*/ ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_MODAL, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_STICKY, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_SHADED, 1); - /* - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER, 1); - */ - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_HIDDEN, 1); - ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN, 1); 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_ATOM_NET_WM_STATE_DEMANDS_ATTENTION; - - ECORE_X_ATOM_NET_WM_WINDOW_OPACITY; - - ECORE_X_ATOM_NET_FRAME_EXTENTS; - ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS; - - ECORE_X_ATOM_NET_WM_PING; - ECORE_X_ATOM_NET_WM_SYNC_REQUEST; - */ + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_HIDDEN, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_SHADED, 1); + ecore_x_netwm_supported(roots[i], ECORE_X_ATOM_NET_WM_STATE_STICKY, 1); } free(roots); } } +/* FIXME, this should set the list in map order, not stack order */ void e_hints_client_list_set(void) { @@ -344,7 +286,27 @@ e_hints_window_init(E_Border *bd) bd->layer = 150; else bd->layer = 100; - e_container_border_raise(bd); + e_border_raise(bd); + + if (!ecore_x_netwm_desktop_get(bd->client.win, &bd->client.netwm.desktop)) + bd->client.netwm.desktop = 0; + if (!ecore_x_netwm_pid_get(bd->client.win, &bd->client.netwm.pid)) + bd->client.netwm.pid = -1; + + if (bd->client.netwm.desktop == 0xffffffff) + e_border_stick(bd); + else if ((bd->client.netwm.desktop >= 0) + && (bd->client.netwm.desktop < (bd->zone->desk_x_count * bd->zone->desk_y_count))) + { + E_Desk *desk; + int x, y; + + y = bd->client.netwm.desktop / bd->zone->desk_x_count; + x = bd->client.netwm.desktop - (y * bd->zone->desk_x_count); + + desk = e_desk_at_xy_get(bd->zone, x, y); + e_border_desk_set(bd, desk); + } if (bd->client.netwm.state.sticky) e_border_stick(bd); @@ -360,6 +322,10 @@ e_hints_window_init(E_Border *bd) * show it! */ else if (bd->desk == e_desk_current_get(bd->zone)) e_border_show(bd); + + /* Update stacking */ + e_hints_client_list_set(); + e_hints_client_stacking_set(); } void @@ -989,7 +955,7 @@ ecore_x_netwm_window_state_set(win, ECORE_X_WINDOW_STATE_SKIP_PAGER, on); void e_hints_window_icon_name_get(E_Border *bd) { - char *name; + char *name; name = ecore_x_netwm_icon_name_get(bd->client.win); if (bd->client.icccm.icon_name) @@ -997,3 +963,21 @@ e_hints_window_icon_name_get(E_Border *bd) bd->client.icccm.icon_name = name; bd->changed = 1; } + +void +e_hints_window_desktop_set(E_Border *bd) +{ + unsigned int deskpos[2]; + unsigned int current; + + current = (bd->desk->y * bd->zone->desk_x_count) + bd->desk->x; + if (bd->client.netwm.desktop != current) + { + deskpos[0] = bd->desk->x; + deskpos[1] = bd->desk->y; + ecore_x_window_prop_card32_set(bd->client.win, E_ATOM_DESK, deskpos, 2); + + ecore_x_netwm_desktop_set(bd->client.win, current); + bd->client.netwm.desktop = current; + } +} diff --git a/src/bin/e_hints.h b/src/bin/e_hints.h index 4b56b418a..ab30566c4 100644 --- a/src/bin/e_hints.h +++ b/src/bin/e_hints.h @@ -40,6 +40,8 @@ EAPI void e_hints_window_sticky_set(E_Border *bd, int on); EAPI void e_hints_window_stacking_set(E_Border *bd, E_Stacking stacking); EAPI void e_hints_window_icon_name_get(E_Border *bd); + +EAPI void e_hints_window_desktop_set(E_Border *bd); #endif #endif diff --git a/src/bin/e_main.c b/src/bin/e_main.c index ac783f489..ab5419c72 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -644,6 +644,11 @@ _e_main_screens_init(void) return 0; } } + + /* Init border stacking */ + e_hints_client_list_set(); + e_hints_client_stacking_set(); + free(roots); ecore_x_sync(); return 1;