santigimeno / node-ewmh

Implementation of the Extended Window Manager Hints (EWMH)
ISC License
18 stars 1 forks source link

Error: Could not set SubstructureRedirect to root window event_mask #21

Open RossComputerGuy opened 5 years ago

RossComputerGuy commented 5 years ago
Error
    at XClient.req_proxy [as ChangeWindowAttributes] (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/xcore.js:189:30)
    at /home/spaceboyross/RDE/src/panel/node_modules/ewmh/lib/ewmh.js:16:15
    at ReadFixedRequest.callback (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/xcore.js:545:21)
    at ReadFixedRequest.execute (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/unpackstream.js:41:10)
    at UnpackStream.resume (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/unpackstream.js:165:30)
    at UnpackStream.write (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/unpackstream.js:102:10)
    at Socket.<anonymous> (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/xcore.js:88:21)
    at emitOne (events.js:115:13)
    at Socket.emit (events.js:210:7)
    at addChunk (_stream_readable.js:250:12)
events.js:182
      throw er; // Unhandled 'error' event
      ^

Error: Could not set SubstructureRedirect to root window event_mask
    at /home/spaceboyross/RDE/src/panel/node_modules/ewmh/lib/ewmh.js:19:29
    at ReadFixedRequest.callback (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/xcore.js:490:39)
    at ReadFixedRequest.execute (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/unpackstream.js:41:10)
    at UnpackStream.resume (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/unpackstream.js:165:30)
    at UnpackStream.write (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/unpackstream.js:102:10)
    at Socket.<anonymous> (/home/spaceboyross/RDE/src/panel/node_modules/x11/lib/xcore.js:88:21)
    at emitOne (events.js:115:13)
    at Socket.emit (events.js:210:7)
    at addChunk (_stream_readable.js:250:12)
    at readableAddChunk (_stream_readable.js:237:11)
santigimeno commented 5 years ago

Hey, can you post sample code that reproduces the issue?

RossComputerGuy commented 5 years ago

NTK is used.

        ntk.createClient((err,app) => {
            if(err) throw err;
            this[SYMS["app"]] = app;
            this[SYMS["win"]] = app.createWindow({ width: this.width, height: this.height, x: this.x, y: this.y, title: "RDE Panel" });
            this[SYMS["win"]].map();
            this[SYMS["ewmh"]] = new EWMH(app.X,app.display.screen[this[SYMS["opts"]].screen].root);
            this[SYMS["ewmh"]].set_class(this[SYMS["win"]].id,["panel"],err => {
                if(err) throw err;
            });
        });
santigimeno commented 5 years ago

Is another WM already running in the same xserver?

RossComputerGuy commented 5 years ago

Yes, I'm running OpenBox

santigimeno commented 5 years ago

That seems to be the problem. I don't know exactly what are you trying to accomplish but only one X11 client can set SubstructureRedirect mask in a specific window, and I guess openbox has set the mask in the root window. /cc @sidorares

RossComputerGuy commented 5 years ago

I'm trying to make a panel/dock.

sidorares commented 5 years ago

yes, only one client can own SubstructureRedirect. If somebody already started WM you'll need to make it quit before you start new one. There is a "polite way to do that" ( this is what some wm's offer under --replace command line key ). To do that, you try to request selection for WM_S0 ( 0 screen number ) and other wm should notice it's lost selection and quit

https://github.com/bbidulock/icewm/blob/77196178450accf0a959155c94ec8c1c401633a8/src/wmapp.cc#L98-L105

RossComputerGuy commented 5 years ago

The replace key didn't fix it.

sidorares commented 5 years ago

There is no "replace" key built in to node-x11 or node-ewmh library

You need to kill your WM or follow standard "hey other WM please let me replace you" protocol, that is you need to create a window and acquire WM_S0 selection to that window.

RossComputerGuy commented 5 years ago

The replace key in my window manager, that's what I was meaning.

sidorares commented 5 years ago

But you are launching your script after some other WM already started, right? So it's your script responsibility to try to replace wm, not that other WM

RossComputerGuy commented 5 years ago

Yeah, after OpenBox has started because my DE is RDE. Killing my WM stops the DE which stops X.

sidorares commented 5 years ago

You can't have both OpenBox running and request SubstructureRedirect for root window

RossComputerGuy commented 5 years ago

Is there a way to bypass the SubstructureRedirect request?

sidorares commented 5 years ago

Is there a way to bypass the SubstructureRedirect request?

Not sure what do you mean by bypassing. SubstructureRedirect is what gives WM full control over child windows position/mapping etc. Without doing that you can't do real wm.

On the other hand if what you doing is not full wm (panel or something similer) you don't need SubstructureRedirect

RossComputerGuy commented 5 years ago

I was meaning like an option to disable SubstructureRedirect because I'm using this in RDE's toolkit and panel.

sidorares commented 5 years ago

Still not clear to me. Which code tries to get SubstructureRedirect ?

RossComputerGuy commented 5 years ago

None or new EWMH(app.X,app.display.screen[this[SYMS["opts"]].screen].root)

sidorares commented 5 years ago

can you show panel source code?

santigimeno commented 5 years ago

Okay, I think I now remember. It's been a long time without using this module. node-ewmh as it is now, it's meant to help implementing the Extended Window Manager Hints to a window manager implementation. So one of the first things it does is trying to set the SubstructureRedirect in the root window. So yes, to use this module you have to avoid any other x11 client to have that mask value set.

RossComputerGuy commented 5 years ago

https://github.com/Ross-Technologies/RDE-Panel

santigimeno commented 5 years ago

Why do you need node-ewmh? If it's only to set the WM_CLASS property in a window, then use https://github.com/santigimeno/node-x11-prop#set-property and avoid all the problems.

RossComputerGuy commented 5 years ago

Well, that's how far I got when I started getting the error, I dunno what else I should have node-ewmh do.

santigimeno commented 5 years ago

I would say if you're not implementing a window manager which you're not, I would not use node-ewmh.

santigimeno commented 5 years ago

Or you can always modify it so it suits your use case.