[HN Gopher] TinyWM - A tiny window manager in around 50 lines of C
       ___________________________________________________________________
        
       TinyWM - A tiny window manager in around 50 lines of C
        
       Author : metadat
       Score  : 142 points
       Date   : 2022-10-25 14:20 UTC (8 hours ago)
        
 (HTM) web link (incise.org)
 (TXT) w3m dump (incise.org)
        
       | rbanffy wrote:
       | This kind of software really needs some screenshots.
        
         | forgotpwd16 wrote:
         | Not much to show. Running startx with .xinitrc containing:
         | xterm &       glxgears &       exec /usr/bin/tinywm
         | 
         | you get: https://files.catbox.moe/m0ejwr.png (pointer isn't
         | shown but it's there)
        
         | johannes1234321 wrote:
         | From looking at the code there isn't much to screenshot. It
         | doesn't seem to add decorations to the windows, just allows
         | sizing and positioning. So a screenshot would show some windows
         | from other applications without a frame. All value is in the
         | source code showing principles.
         | 
         | (I might have missed something)
        
           | teucris wrote:
           | The absence of frames or other elements is extremely valuable
           | to understanding what the window manager does/does not have
           | control over.
        
         | skyyler wrote:
         | It's like 50 lines, just imagine what it would look like :P
         | 
         | It doesn't look like it's drawing any title bars or borders or
         | decorations of any kind.
        
           | teucris wrote:
           | If I'm not already very familiar with X, how am I supposed to
           | know that?
        
             | mlyle wrote:
             | The purpose of this code is not to provide a useful WM.
             | 
             | It's to illustrate the minimum, in case you want to play
             | with it and become very familiar with X.
        
               | ranger_danger wrote:
               | How to draw my own window decorations is exactly what I'd
               | be interested in learning.
        
               | Avshalom wrote:
               | Twm, dwm or aewm might be good places to start for that
        
             | guerrilla wrote:
             | Every line of code has paragraphs of text describing what
             | it does.
        
       | Jasper_ wrote:
       | Probably worth pointing out that while this will appear to work,
       | it's certainly not ICCCM [0] compatible, so a lot of toolkits and
       | applications that assume ICCCM compatibility will break.
       | 
       | [0] https://www.x.org/releases/current/doc/xorg-
       | docs/icccm/icccm... , one of the standards for how WMs and X11
       | applications should communicate.
        
       | auraham wrote:
       | Wonder how hard could it be to add tiling support?
        
         | Beltalowda wrote:
         | You don't even strictly _need_ it in the WM, as you can resize
         | windows from other programs, even shell script with xdotool
         | etc, although xdotool /shell quickly becomes somewhat unwieldy
         | I once wrote a "tiling WM" like this. It actually worked fairly
         | well, and I kind of liked the modularity of it.
         | 
         | At any rate, I dug up the old thing:
         | https://pastebin.com/i91yD96F - I also had some other scripts
         | to control window placement, movement, etc. I once planned to
         | rewrite it to a "real" language and combine it with a "slightly
         | less tiny wm" as a full release, but never really got around to
         | it, and I also don't really use tiling any more (I just have
         | one full-screen window all the time).
        
         | ihatepython wrote:
         | Not very hard as long as you don't care about drawing window
         | frames.
        
       | [deleted]
        
       | mobilio wrote:
       | Repost:
       | 
       | https://news.ycombinator.com/item?id=994794
       | https://news.ycombinator.com/item?id=17765446
        
       | guenthert wrote:
       | Can I make a wish? I would like a wm which sends SIGSTOP to
       | processes which window I minimized and SIGCONT when I un-minimize
       | it.
       | 
       | For processes which use multiple windows, I'd be OK with all
       | being minimized when one is to allow above functionality.
       | 
       | There was a time when it was desirable to make room on the
       | visible desktop while keeping long running processes running, but
       | today we have lots of desktop real-estate and few legitimate long
       | running processes, instead web pages leaching CPU cycles (I look
       | at you, github!).
        
       | TrisMcC wrote:
       | From looking at the Issues on GitHub, it seems that someone
       | ported it to XCB:
       | 
       | https://github.com/rtyler/tinywm-ada/blob/master/tinywm-xcb....
        
         | cestith wrote:
         | Also, as the repo name suggests, the Xlib version is ported to
         | Ada in there.
        
       | quirino wrote:
       | I used this as a starting point when playing around with writing
       | my own WM, was very surprised with how little there is to it
        
         | TillE wrote:
         | Even without the comments, it's so great to have concise, fully
         | functional sample code when you're trying to understand how
         | something works.
         | 
         | I love any time I can spend 2 minutes reading code instead of
         | 20 minutes piecing together the basics from documentation.
        
       | inetknght wrote:
       | So... why C instead of at least C++ or an even better memory safe
       | language?
        
         | Beltalowda wrote:
         | Because then it's no longer minimal. And as mentioned there's a
         | Python version.
         | 
         | This isn't a "real program", as such. It's a demo or "rainy
         | Sunday fun to figure out a bit how X11 works".
        
           | inetknght wrote:
           | > _Because then it 's no longer minimal._
           | 
           | C "might" be minimal but it brings with it a whole lot of
           | dangerous baggage. Other languages can be just as minimal
           | without the baggage.
           | 
           | > _This isn 't a "real program", as such. It's a demo_
           | 
           | I didn't mean to imply anything different. I was just curious
           | why C was used in the modern day where we (all?) know that C
           | is a language that _should not_ be used for demoing because
           | less experienced devs will think they can use C too and
           | continue to create dangerous code
        
             | Beltalowda wrote:
             | > why C was used in the modern day                 /*
             | TinyWM is written by Nick Welch <mack@incise.org>, 2005.
             | *        * This software is in the public domain        *
             | and is provided AS IS, with NO WARRANTY. \*/
             | 
             | > we (all?) know that C is a language that _should not_ be
             | used for demoing because less experienced devs will think
             | they can use C too and continue to create dangerous code
             | 
             | That seems rather patronizing.
             | 
             | I have no great love for C; it has sharp edges for sure,
             | but it can be used just fine for a great many things even
             | today. I've written a bunch of C programs because it's
             | simple, straight-forward, "just works" (mostly), and I'm
             | not writing OpenSSL or a network daemon so if I have an
             | occasional buffer overflow it's not even a big deal.
        
         | cestith wrote:
         | The page linked offers a Python version calling into Python's
         | Xlib binding python-xlib. It's the third code box down, after
         | the bare C version and the heavily commented C version.
         | 
         | Xlib itself is in C.
        
       | chris_armstrong wrote:
       | That's really minimal, even for x11: it doesn't even do
       | reparenting and setting up window borders or xdamage/xfixes
       | compositing
        
       | tabtab wrote:
       | It looks like X Window does most the of rendering, correct?
       | (based on header: "#include <X11/Xlib.h>")
        
         | avhon1 wrote:
         | Yes, that's sorta fundamental to how X works. Window managers
         | aren't at all responsible for drawing the contents of the
         | windows.
        
       | esjeon wrote:
       | Wayland version of TinyWM:
       | https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master...
        
         | abhorrence wrote:
         | I'm really keen to hear from someone who knows a bunch about X
         | and WL to hear why there's such a huge difference in line count
         | here. Is this analogous to OpenGL vs Vulkan where WL is a much
         | lighter layer than X is?
        
           | yamtaddle wrote:
           | Yeah Wayland takes like 90% of the features of X and goes
           | "you're on your own, window managers / desktop environments!"
           | and if you complain they just say that's out of spec, working
           | as intended, wontfix.
           | 
           | It's like the exact opposite of what the Linux desktop
           | needed.
        
             | corndoge wrote:
             | Links to further reading would be appreciated!
        
               | zokier wrote:
               | What Wayland really is a way for multiple applications to
               | get access to and share dri/drm and evdev (kernel
               | interfaces for putting stuff on screen and getting input
               | respectively), nothing less and not much more. To enable
               | that Wayland defines an IPC channel which is designed for
               | extensibility, and there are some defined extensions to
               | cover more desktop-like usecases (clipboards and
               | whatnot). Some extensions are more widely supported by
               | different compositors than others.
               | 
               | For links, this docs page listing many (all?) wl
               | extensions kinda gives you an idea what wayland core does
               | not handle, and also what in general is available through
               | wayland: https://wayland.app/protocols/
        
               | yamtaddle wrote:
               | https://wiki.gentoo.org/wiki/Wayland
               | 
               | Found that pretty quickly and it doesn't go down a point-
               | by-point feature comparison but gives you some idea of
               | what's up in the "introduction" where it notes that
               | Wayland doesn't include things like keymapping
               | functionality, so that's all up to each compositor to
               | implement. Excerpt:
               | 
               | > From a user's point of view, Wayland is nothing more
               | than a framework. In particular, Wayland itself does not
               | implement any display server that should correspond to
               | the Xorg server. In Wayland, compositors are display
               | servers, implemented by various projects. A compositor
               | also serves as X's window manager (and X's compositor).
               | 
               | > This means users first have to choose a compositor, and
               | via that compositor they "configure the server", i.e. set
               | screen resolutions, input and video drivers options, etc.
               | 
               | > [...]
               | 
               | > Some lack of specification results in chaos more or
               | less. For example one common complaint as of 2021 is that
               | key remapping is absent in the Wayland protocol - in
               | Wayland there is nothing that corresponds to xmodmap of
               | X. Each compositor offers, if any, their own way to remap
               | keys.
               | 
               | > The situation however is not totally random - many
               | compositors depend on the library "wlroots", which
               | abstracts such common tasks, and is aimed to be
               | impartial. First started as a subproject of the
               | compositor Sway, it now is used by many compositors.
               | Exceptions include mutter and KWin, i.e. GNOME and KDE,
               | and Weston.
               | 
               | TL;DR minor WM/DE projects have circled around wlroots as
               | a life-raft to fill in the missing functionality, while
               | major ones have gone their own way, resulting in
               | extremely basic functionality potentially being wildly
               | different (and having a different set of bugs and quirks
               | and how-to-configure-and-use-it) depending on which
               | compositor you're running, or even simply being absent on
               | some.
               | 
               | [EDIT]
               | 
               | Unsurprisingly, Gentoo's cousin distro (if you will),
               | Arch, has an even better page on it:
               | 
               | https://wiki.archlinux.org/title/Wayland
               | 
               | Note especially the part where it's possible for a given
               | compositor not to work with certain graphics hardware,
               | while others will. _That 's_ how little help Wayland
               | gives to desktop environments and window managers. To get
               | the equivalent of Xorg you'd have to get everyone to
               | agree on a single fairly-big and featureful compositor
               | and only use that.
               | 
               | Or, good lord, look at the display manager support table.
               | LOL.
        
             | yoyohello13 wrote:
             | Wayland is the protocol. It isn't analogous to X, so they
             | really shouldn't be compared. Comparing Xorg to something
             | like WLRoots makes more sense.
        
           | FreeFull wrote:
           | TinyWM doesn't include an X server implementation, while
           | TinyWL is a full wayland compositor (although most of the
           | heavy lifting is done by wlroots)
        
           | nickstinemates wrote:
           | Also not discussed - the wayland version implements a lot
           | more features, comments, and boilerplate. The one in OP is
           | 178 lines with comments and features basic window control.
        
             | lampington wrote:
             | It would be really interesting to see a Wayland version
             | with equivalent functionally to the X one to get some idea
             | of what the real difference is in complexity.
        
           | tjdetwiler wrote:
           | With x you're just bringing a window manager that plugs into
           | the x-server. With wayland there's no standard 'window
           | manager' plugin to arbitrary wayland servers. So the wayland
           | example is doing more things (lots is handled by wlroots
           | though).
        
         | [deleted]
        
         | [deleted]
        
       ___________________________________________________________________
       (page generated 2022-10-25 23:00 UTC)