From 4d77df252de4e781acf4938a1d949060474598be Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 9 Mar 2020 10:12:19 -0400 Subject: [PATCH] removed EWMH remnants --- client.c | 13 --- disp.c | 103 +----------------- ewmh.c | 325 +------------------------------------------------------ lwm | Bin 56428 -> 0 bytes lwm.c | 3 +- lwm.h | 19 +--- manage.c | 6 +- 7 files changed, 7 insertions(+), 462 deletions(-) delete mode 100755 lwm diff --git a/client.c b/client.c index 9189d38..61bf15e 100644 --- a/client.c +++ b/client.c @@ -136,7 +136,6 @@ Client_Add(Window w, Window root) { c->internal_state = INormal; c->name = 0; c->cursor = ENone; - c->wtype = WTypeNone; c->flags |= F_ACCEPT_FOCUS; c->next = clients; @@ -174,8 +173,6 @@ Client_Remove(Client *c) { if (c->name != 0) free(c->name); free(c); - - ewmh_set_client_list(screen); } @@ -301,7 +298,6 @@ Client_OpaquePrimitive(Client *c, Edge edge) { start_x = ox; start_y = oy; mode = wm_reshaping; - ewmh_set_client_list(c->screen); } void @@ -311,7 +307,6 @@ Client_Lower(Client *c) XLowerWindow(dpy, c->window); if (c->framed) XLowerWindow(dpy, c->parent); - ewmh_set_client_list(c->screen); } void @@ -331,8 +326,6 @@ Client_Raise(Client *c) if (trans->framed) XRaiseWindow(dpy, trans->parent); XRaiseWindow(dpy, trans->window); } - - ewmh_set_client_list(c->screen); } void @@ -389,8 +382,6 @@ extern void Client_Focus(Client *c, Time time) { if (current) { Client_SetActive(current, 0, 0L); - XDeleteProperty(dpy, current->screen->root, - ewmh_atom[_NET_ACTIVE_WINDOW]); } if (!c && current) { @@ -401,10 +392,6 @@ Client_Focus(Client *c, Time time) { current = c; if (c) { Client_SetActive(current, 1, time); - XChangeProperty(dpy, current->screen->root, - ewmh_atom[_NET_ACTIVE_WINDOW], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *)¤t->window, 1); } } diff --git a/disp.c b/disp.c index e9f2c87..7d06329 100644 --- a/disp.c +++ b/disp.c @@ -251,7 +251,6 @@ maprequest(XEvent *ev) { Client_SetState(c, NormalState); break; } - ewmh_set_client_list(c->screen); } static void @@ -410,109 +409,9 @@ static void clientmessage(XEvent *ev) { Client * c; XClientMessageEvent * e = &ev->xclient; - c = Client_Get(e->window); if (c == 0) return; - if (e->message_type == ewmh_atom[_NET_ACTIVE_WINDOW] && - e->format == 32) { - /* An EWMH enabled application has asked for this client - * to be made the active window. The window is raised, and - * focus given if the focus mode is click (focusing on a - * window other than the one the pointer is in makes no - * sense when the focus mode is enter). - */ - XMapWindow(dpy, c->parent); - Client_Raise(c); - return; - } - if (e->message_type == ewmh_atom[_NET_CLOSE_WINDOW] && - e->format == 32) { - Client_Close(c); - return; - } - if (e->message_type == ewmh_atom[_NET_MOVERESIZE_WINDOW] && - e->format == 32) { - XEvent ev; - - /* FIXME: ok, so this is a bit of a hack */ - ev.xconfigurerequest.window = e->window; - ev.xconfigurerequest.x = e->data.l[1]; - ev.xconfigurerequest.y = e->data.l[2]; - ev.xconfigurerequest.width = e->data.l[3]; - ev.xconfigurerequest.height = e->data.l[4]; - ev.xconfigurerequest.value_mask = 0; - if (e->data.l[0] & (1 << 8)) - ev.xconfigurerequest.value_mask |= CWX; - if (e->data.l[0] & (1 << 9)) - ev.xconfigurerequest.value_mask |= CWY; - if (e->data.l[0] & (1 << 10)) - ev.xconfigurerequest.value_mask |= CWWidth; - if (e->data.l[0] & (1 << 11)) - ev.xconfigurerequest.value_mask |= CWHeight; - configurereq(&ev); - return; - } - if (e->message_type == ewmh_atom[_NET_WM_MOVERESIZE] && - e->format == 32) { - Edge edge = E_LAST; - EWMHDirection direction = e->data.l[2]; - - /* before we can do any resizing, make the window visible */ - XMapWindow(dpy, c->parent); - Client_Raise(c); - /* FIXME: we're ignorning x_root, y_root and button! */ - switch (direction) { - case DSizeTopLeft: - edge = ETopLeft; - break; - case DSizeTop: - edge = ETop; - break; - case DSizeTopRight: - edge = ETopRight; - break; - case DSizeRight: - edge = ERight; - break; - case DSizeBottomRight: - edge = EBottomRight; - break; - case DSizeBottom: - edge = EBottom; - break; - case DSizeBottomLeft: - edge = EBottomLeft; - break; - case DSizeLeft: - edge = ELeft; - break; - case DMove: - edge = ENone; - break; - case DSizeKeyboard: - /* FIXME: don't know how to deal with this */ - edge = E_LAST; - break; - case DMoveKeyboard: - edge = E_LAST; - break; - default: - edge = E_LAST; - fprintf(stderr, "%s: received _NET_WM_MOVERESIZE" - " with bad direction", argv0); - break; - } - switch (edge) { - case E_LAST: - break; - case ENone: - Client_Move(c); - break; - default: - Client_ReshapeEdge(c, edge); - break; - } - } + // TODO: Should handle some messages here... } static void diff --git a/ewmh.c b/ewmh.c index 54f1b74..6b0b696 100644 --- a/ewmh.c +++ b/ewmh.c @@ -29,215 +29,17 @@ #include "lwm.h" #include "ewmh.h" -Atom ewmh_atom[EWMH_ATOM_LAST]; -Atom utf8_string; - -void -ewmh_init(void) { - /* build half a million EWMH atoms */ - ewmh_atom[_NET_SUPPORTED] = - XInternAtom(dpy, "_NET_SUPPORTED", False); - ewmh_atom[_NET_CLIENT_LIST] = - XInternAtom(dpy, "_NET_CLIENT_LIST", False); - ewmh_atom[_NET_CLIENT_LIST_STACKING] = - XInternAtom(dpy, "_NET_CLIENT_LIST_STACKING", False); - ewmh_atom[_NET_NUMBER_OF_DESKTOPS] = - XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False); - ewmh_atom[_NET_DESKTOP_GEOMETRY] = - XInternAtom(dpy, "_NET_DESKTOP_GEOMETRY", False); - ewmh_atom[_NET_DESKTOP_VIEWPORT] = - XInternAtom(dpy, "_NET_DESKTOP_VIEWPORT", False); - ewmh_atom[_NET_CURRENT_DESKTOP] = - XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False); - ewmh_atom[_NET_ACTIVE_WINDOW] = - XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - ewmh_atom[_NET_WORKAREA] = - XInternAtom(dpy, "_NET_WORKAREA", False); - ewmh_atom[_NET_SUPPORTING_WM_CHECK] = - XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - ewmh_atom[_NET_CLOSE_WINDOW] = - XInternAtom(dpy, "_NET_CLOSE_WINDOW", False); - ewmh_atom[_NET_MOVERESIZE_WINDOW] = - XInternAtom(dpy, "_NET_MOVERESIZE_WINDOW", False); - ewmh_atom[_NET_WM_MOVERESIZE] = - XInternAtom(dpy, "_NET_WM_MOVERESIZE", False); - ewmh_atom[_NET_WM_NAME] = - XInternAtom(dpy, "_NET_WM_NAME", False); - ewmh_atom[_NET_WM_WINDOW_TYPE] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - ewmh_atom[_NET_WM_STATE] = - XInternAtom(dpy, "_NET_WM_STATE", False); - ewmh_atom[_NET_WM_ALLOWED_ACTIONS] = - XInternAtom(dpy, "_NET_WM_ALLOWED_ACTIONS", False); - ewmh_atom[_NET_WM_STRUT] = - XInternAtom(dpy, "_NET_WM_STRUT", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_DESKTOP] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DESKTOP", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_DOCK] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_TOOLBAR] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_TOOLBAR", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_MENU] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_MENU", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_UTILITY] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_UTILITY", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_SPLASH] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_SPLASH", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_DIALOG] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - ewmh_atom[_NET_WM_WINDOW_TYPE_NORMAL] = - XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_NORMAL", False); - ewmh_atom[_NET_WM_STATE_SKIP_TASKBAR] = - XInternAtom(dpy, "_NET_WM_STATE_SKIP_TASKBAR", False); - ewmh_atom[_NET_WM_STATE_SKIP_PAGER] = - XInternAtom(dpy, "_NET_WM_STATE_SKIP_PAGER", False); - ewmh_atom[_NET_WM_STATE_HIDDEN] = - XInternAtom(dpy, "_NET_WM_STATE_HIDDEN", False); - ewmh_atom[_NET_WM_STATE_FULLSCREEN] = - XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - ewmh_atom[_NET_WM_ACTION_MOVE] = - XInternAtom(dpy, "_NET_WM_ACTION_MOVE", False); - ewmh_atom[_NET_WM_ACTION_RESIZE] = - XInternAtom(dpy, "_NET_WM_ACTION_RESIZE", False); - ewmh_atom[_NET_WM_ACTION_FULLSCREEN] = - XInternAtom(dpy, "_NET_WM_ACTION_FULLSCREEN", False); - ewmh_atom[_NET_WM_ACTION_CLOSE] = - XInternAtom(dpy, "_NET_WM_ACTION_CLOSE", False); - utf8_string = XInternAtom(dpy, "UTF8_STRING", False); -} - -void -ewmh_init_screens(void) { - int i; - unsigned long data[4]; - - /* announce EWMH compatibility on all acreens */ - for (i = 0; i < screen_count; i++) { - screens[i].ewmh_set_client_list = False; - screens[i].ewmh_compat = XCreateSimpleWindow(dpy, - screens[i].root, - -200, -200, 1, 1, - 0, 0, 0); - XChangeProperty(dpy, screens[i].ewmh_compat, - ewmh_atom[_NET_WM_NAME], - utf8_string, 8, PropModeReplace, - (unsigned char*)"lwm", 3); - - /* set root window properties */ - XChangeProperty(dpy, screens[i].root, - ewmh_atom[_NET_SUPPORTED], - XA_ATOM, 32, PropModeReplace, - (unsigned char *)ewmh_atom, EWMH_ATOM_LAST); - - XChangeProperty(dpy, screens[i].root, - ewmh_atom[_NET_SUPPORTING_WM_CHECK], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *)&screens[i].ewmh_compat, 1); - - data[0] = 1; - XChangeProperty(dpy, screens[i].root, - ewmh_atom[_NET_NUMBER_OF_DESKTOPS], - XA_CARDINAL, 32, PropModeReplace, - (unsigned char*)data, 1); - - data[0] = screens[i].display_width; - data[1] = screens[i].display_height; - XChangeProperty(dpy, screens[i].root, - ewmh_atom[_NET_DESKTOP_GEOMETRY], - XA_CARDINAL, 32, PropModeReplace, - (unsigned char*)data, 2); - - data[0] = 0; - data[1] = 0; - XChangeProperty(dpy, screens[i].root, - ewmh_atom[_NET_DESKTOP_VIEWPORT], - XA_CARDINAL, 32, PropModeReplace, - (unsigned char*)data, 2); - - data[0] = 0; - XChangeProperty(dpy, screens[i].root, - ewmh_atom[_NET_CURRENT_DESKTOP], - XA_CARDINAL, 32, PropModeReplace, - (unsigned char*)data, 1); - - ewmh_set_client_list(&screens[i]); - } -} - -EWMHWindowType -ewmh_get_window_type(Window w) { - Atom rt; - Atom *type; - int fmt; - unsigned long n; - unsigned long extra; - int i; - EWMHWindowType ret; - - i = XGetWindowProperty(dpy, w, - ewmh_atom[_NET_WM_WINDOW_TYPE], - 0, 100, False, XA_ATOM, &rt, &fmt, &n, &extra, - (unsigned char **)&type); - if (i != Success || type == NULL) - return WTypeNone; - ret = WTypeNone; - for (; n; n--) { - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_DESKTOP]) { - ret = WTypeDesktop; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_DOCK]) { - ret = WTypeDock; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_TOOLBAR]) { - ret = WTypeToolbar; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_MENU]) { - ret = WTypeMenu; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_UTILITY]) { - ret = WTypeUtility; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_SPLASH]) { - ret = WTypeSplash; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_DIALOG]) { - ret = WTypeDialog; - break; - } - if (type[n - 1] == - ewmh_atom[_NET_WM_WINDOW_TYPE_NORMAL]) { - ret = WTypeNormal; - break; - } - } - XFree(type); - return ret; -} - - Bool ewmh_get_window_name(Client *c) { - Atom rt; + Atom rt, utf8_string; char *name; int fmt; unsigned long n; unsigned long extra; int i; + utf8_string = XInternAtom(dpy, "UTF8_STRING", False); i = XGetWindowProperty(dpy, c->window, - ewmh_atom[_NET_WM_NAME], + XInternAtom(dpy, "_NET_WM_NAME", False), 0, 100, False, utf8_string, &rt, &fmt, &n, &extra, (unsigned char **)&name); if (i != Success || name == NULL) @@ -246,124 +48,3 @@ Bool ewmh_get_window_name(Client *c) { XFree(name); return True; } - -Bool -ewmh_hasframe(Client *c) { - switch (c->wtype) { - case WTypeDesktop: - case WTypeDock: - case WTypeMenu: - case WTypeSplash: - return False; - default: - return True; - } -} - -static Bool -new_state(unsigned long action, Bool current) -{ - enum Action {remove, add, toggle}; - - switch (action) { - case remove: - return False; - case add: - return True; - case toggle: - if (current == True) return False; else return True; - } - fprintf(stderr,"%s: bad action in _NET_WM_STATE (%d)\n", - argv0, (int) action); - return current; -} - -void -ewmh_set_allowed(Client *c) -{ -/* FIXME: this is dumb - the allowed actions should be calculuated - * but for now, anything goes. - */ - Atom action[4]; - - action[0] = ewmh_atom[_NET_WM_ACTION_MOVE]; - action[1] = ewmh_atom[_NET_WM_ACTION_RESIZE]; - action[2] = ewmh_atom[_NET_WM_ACTION_FULLSCREEN]; - action[3] = ewmh_atom[_NET_WM_ACTION_CLOSE]; - XChangeProperty(dpy, c->window, ewmh_atom[_NET_WM_ALLOWED_ACTIONS], - XA_ATOM, 32, PropModeReplace, (unsigned char *)action, 4); -} - -static Bool -valid_for_client_list(ScreenInfo *screen, Client *c) { - if (c->screen != screen) return False; - if (c->state == WithdrawnState) return False; - return True; -} - -/* -* update_client_list updates the properties on the root window used by -* task lists and pagers. -* -* it should be called whenever the window stack is modified, or when clients -* are hidden or unhidden. -*/ -void -ewmh_set_client_list(ScreenInfo *screen) { - int no_clients=0; - Window *client_list=NULL; - Window *stacked_client_list=NULL; - Client *c; - - if (screen == NULL || screen->ewmh_set_client_list == True) return; - screen->ewmh_set_client_list = True; - for (c = Client_List(); c; c = c->next) { - if (valid_for_client_list(screen, c) == True) no_clients++; - } - if (no_clients > 0) { - int i; - Window dw1; - Window dw2; - Window *wins; - unsigned int win; - unsigned int nwins; - - client_list = malloc(sizeof(Window) * no_clients); - i = no_clients - 1; /* array starts with oldest */ - for (c = Client_List(); c; c = c->next) { - if (valid_for_client_list(screen, c) == True) { - client_list[i] = c->window; - i--; - if (i < 0) break; - } - } - - stacked_client_list = malloc(sizeof(Window) * no_clients); - i = 0; - XQueryTree(dpy, screen->root, &dw1, &dw2, &wins, &nwins); - for (win = 0; win < nwins; win++) { - c = Client_Get(wins[win]); - if (!c) continue; - if (valid_for_client_list(screen, c) == True) { - stacked_client_list[i] = c->window; - i++; - if (i >= no_clients) break; - } - } - if ( nwins > 0 ) XFree(wins); - - } - XChangeProperty(dpy, screen->root, - ewmh_atom[_NET_CLIENT_LIST], - XA_WINDOW, 32, PropModeReplace, - (unsigned char*)client_list, no_clients); - XChangeProperty(dpy, screen->root, - ewmh_atom[_NET_CLIENT_LIST_STACKING], - XA_WINDOW, 32, PropModeReplace, - (unsigned char*)stacked_client_list, no_clients); - if (no_clients > 0 ) { - free(client_list); - free(stacked_client_list); - } - screen->ewmh_set_client_list = False; -} diff --git a/lwm b/lwm deleted file mode 100755 index b02fcae26d1ba14a9ca9560cc344f0ac365e9f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56428 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 diff --git a/lwm.c b/lwm.c index 64359ec..713de18 100644 --- a/lwm.c +++ b/lwm.c @@ -87,7 +87,6 @@ main(int argc, char *argv[]) { wm_take_focus = XInternAtom(dpy, "WM_TAKE_FOCUS", False); wm_colormaps = XInternAtom(dpy, "WM_COLORMAP_WINDOWS", False); compound_text = XInternAtom(dpy, "COMPOUND_TEXT", False); - ewmh_init(); /* * Get fonts for our titlebar and our popup window. We try to @@ -115,7 +114,6 @@ main(int argc, char *argv[]) { } initScreens(); - ewmh_init_screens(); /* * Initialisation is finished, but we start off not interacting with the @@ -222,6 +220,7 @@ initScreens(void) { /* Find out how many screens we've got, and allocate space for their info. */ screen_count = ScreenCount(dpy); + printf("screens: %d\n", screen_count); screens = (ScreenInfo *) malloc(screen_count * sizeof(ScreenInfo)); /* Go through the screens one-by-one, initialising them. */ diff --git a/lwm.h b/lwm.h index 8bba70b..9789bcc 100644 --- a/lwm.h +++ b/lwm.h @@ -59,17 +59,6 @@ typedef enum { DSizeKeyboard, DMoveKeyboard } EWMHDirection; -/** -* EWMH window type. See section 5.6 of the EWMH specification (1.2). -* WTypeNone indicates that no EWMH window type as been set and MOTIF -* hints should be used instead. -*/ -typedef enum { - WTypeDesktop, WTypeDock, WTypeToolbar, - WTypeMenu, WTypeUtility, WTypeSplash, - WTypeDialog, WTypeNormal, WTypeNone -} EWMHWindowType; - /** * Screen information. */ @@ -92,6 +81,7 @@ struct ScreenInfo { /* Client flags for EWMH protocols and window behavior */ enum { +// F_FRAMED = (1 << 0), F_ACCEPT_FOCUS = (1 << 0), F_EWMH_DELETE = (1 << 1), F_EWMH_TAKE_FOCUS = (1 << 2), @@ -112,7 +102,6 @@ typedef struct Client { Edge cursor; /* indicates which cursor is being used for parent window */ IState internal_state; ScreenInfo * screen; - EWMHWindowType wtype; } Client; /* @@ -191,11 +180,5 @@ extern void manage(Client *, int); extern void getMousePosition(int *, int *); /* ewmh.c */ -extern Atom ewmh_atom[]; extern void ewmh_init(void); -extern void ewmh_init_screens(void); -extern EWMHWindowType ewmh_get_window_type(Window w); extern Bool ewmh_get_window_name(Client *c); -extern Bool ewmh_hasframe(Client *c); -extern void ewmh_set_allowed(Client *c); -extern void ewmh_set_client_list(ScreenInfo *screen); diff --git a/manage.c b/manage.c index 9558033..efa7165 100644 --- a/manage.c +++ b/manage.c @@ -50,12 +50,8 @@ manage(Client * c, int mapped) static int auto_x = 100; static int auto_y = 100; - /* get the EWMH window type, as this might overrule some hints */ - c->wtype = ewmh_get_window_type(c->window); - /* set EWMH allowable actions, now we intend to manage this window */ - ewmh_set_allowed(c); /* is this window to have a frame? */ - c->framed = ewmh_hasframe(c); + c->framed = True; /* * Get the hints, window name, and normal hints (see ICCCM -- 2.52.0