{"id":37086488,"url":"https://github.com/u-root/wingo","last_synced_at":"2026-01-14T10:38:18.764Z","repository":{"id":57492600,"uuid":"107433181","full_name":"u-root/wingo","owner":"u-root","description":"A fully-featured window manager written in Go.","archived":false,"fork":true,"pushed_at":"2019-03-10T10:08:36.000Z","size":7154,"stargazers_count":11,"open_issues_count":1,"forks_count":6,"subscribers_count":31,"default_branch":"master","last_synced_at":"2024-06-19T23:10:47.071Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"BurntSushi/wingo","license":"wtfpl","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/u-root.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-10-18T16:19:01.000Z","updated_at":"2023-09-04T17:00:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/u-root/wingo","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/u-root/wingo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fwingo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fwingo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fwingo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fwingo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/u-root","download_url":"https://codeload.github.com/u-root/wingo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fwingo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28417673,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:25:19.714Z","status":"ssl_error","status_checked_at":"2026-01-14T10:22:49.371Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T10:38:18.048Z","updated_at":"2026-01-14T10:38:18.759Z","avatar_url":"https://github.com/u-root.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"This is wingo, a fork of BurntSushi's window manager. The original author\nplace wingo in maintenance mode a while back and has politely informed me\nthat he plans no further development. Since we need changes for NiChrome,\nwe've forked it here.\n\nWingo is an X window manager written in pure Go. All of its dependencies, from\ncommunicating with X up to drawing text on windows, are also in Go. Wingo is\nmostly ICCCM and EWMH compliant (see COMPLIANCE).\n\nIf you have Go installed and configured on your machine, all you need to do is:\n(For Archlinux users, Wingo is in the AUR.)\n\n    go get github.com/BurntSushi/wingo\n\nAnd in your $HOME/.xinitrc:\n\n    exec wingo\n\nOr if you're brave and are using a desktop environment, just run this to\nreplace your current window manager: (Seriously though, save you work. Wingo is\nstill very alpha.)\n\n    wingo --replace\n\n\nHelp\n====\nYou can find me in the #wingo IRC channel on FreeNode.\n\n\nMy triple head setup\n====================\n\n[![Triple head with Wingo](https://github.com/BurntSushi/wingo/wiki/screenshots/thumbs/triple-head.png)](https://github.com/BurntSushi/wingo/wiki/screenshots/triple-head.png)\n\n\nDude... why?\n============\nWingo has two features which, when combined, set it apart from other window\nmanagers (maybe):\n\n1) Support for both floating *and* tiling placement policies. Wingo can be used\n   as a regular floating (stacking) window manager, complete with decorations,\n   maximization, sticky windows, and most other things you might find in a\n   window manager. Wingo can also be switched into a tiling mode where window\n   decorations disappear, and windows are automatically managed via tiling.\n\n2) Workspaces per monitor. In a multi-head setup, each monitor can display its\n   own workspace---independent of the other monitors. This makes changing your\n   view of windows in multi-head setups much easier than in most other window\n   managers, which will only allow you to see one workspace stretched across\n   all of your monitors. Also, since placement policies like floating and\n   tiling affect workspaces, this makes it possible for one monitor to be\n   tiling while another is floating!\n\nWARNING: The major drawback of using a workspaces per monitor model is that it\nviolates an implicit assumption made by EWMH: that one and only one workspace\nmay be viewable at any point in time. As a result, in multi-head setups, pagers\nand taskbars may operate in confusing ways. In a single head setup, they should\ncontinue to operate normally. Wingo provides prompts that allow you to\nadd/remove workspaces and select clients that may alleviate the need for pagers\nor taskbars.\n\n\nConfiguration\n=============\nWingo is extremely configurable. This includes binding any of a vast number of\ncommands to key or mouse presses, theming your window decorations and setting\nup hooks that will fire depending upon a set of match conditions.\n\nAll configuration is done using an INI like file format with support for simple\nvariable substitution (which makes theming a bit simpler).\nNo XML. No recompiling. No scripting.\n\nA fresh set of configuration files can be added to `$HOME/.config/wingo` with\n\n    wingo --write-config\n\nEach configuration file is heavily documented.\n\nConfiguring key/mouse bindings and hooks uses a central command system called\nGribble. For example, one can add a workspace named \"cromulent\" with this\ncommand:\n\n    AddWorkspace \"cromulent\"\n\nBut that's not very flexible, right? It'd be nice if you could specify the name\nof workspace on the fly... For this, simply use the \"Input\" command as an\nargument to AddWorkspace, which shows a graphical prompt and allows you to type\nin a name:\n\n    AddWorkspace (Input \"Enter your workspace name:\")\n\nThe text entered into the input box will be passed to the AddWorkspace command.\n\nPlease see the HOWTO-COMMANDS file for more info. We've barely scratched the\nsurface.\n\n\nScripting Wingo\n===============\nSo I lied earlier. You can kind of script Wingo by using its IPC mechanism.\nYou'll need to make sure that wingo-cmd is installed:\n\n    go get github.com/BurntSushi/wingo/wingo-cmd\n\nWhile Wingo is running, you can send any command you like:\n\n    wingo-cmd 'AddWorkspace \"embiggen\"'\n\nOr perhaps you can't remember how to use the AddWorkspace command:\n\n    wingo-cmd --usage AddWorkspace\n\nWhich will print the parameters, their types and a description of the command.\n\nWant to pipe some information to another program? No problem, since commands\ncan return stuff!\n\n    wingo-cmd GetWorkspace\n\nAnd you can even make commands repeat themselves every X milliseconds, which is\nideal for use with something like dzen to show the name of the currently active\nwindow:\n\n    wingo-cmd --poll 500 'GetClientName (GetActive)' | dzen2\n\nFinally, you can see a list of all commands, their parameters and their usage:\n(even if Wingo isn't running)\n\n    wingo-cmd --list-usage\n\n(Wingo actually can provide enough information for ambitious hackers to script\ntheir own layouts in whatever programming language they like without ever\nhaving to deal with X at all. Assuming it has support for connecting to unix\ndomain sockets. Or you could just use a shell with 'wingo-cmd' if you're into\nthat kind of tomfoolery.)\n\nWorkspaces\n==========\nHaving some set number of workspaces labeled 1, 2, 3, 4, ... is a thing of the\npast. While Wingo won't stop you from using such a simplistic model, it will\negg you on to try something else: dynamic workspaces.\n\nDynamic workspaces takes advantage of two things: workspace names and\nadding/removing workspaces as you need them.\n\nThis is something that I find useful since I'm typically working on multiple\nprojects, and my needs change as I work on them. For example, when working on\nWingo, I might add the \"wingo\" workspace, along with the \"xephyr\" workspace and\nthe \"gribble\" workspace. When I'm done, I can remove those and add other\nworkspaces for my next project. Or I can leave those workspaces intact for\nwhen I come back to them later.\n\nWith Wingo, such a workflow is natural because you're no longer confined to\n\"removing only the last workspace\" or some other such nonsense. Plus, adding a\nworkspace *requires* that you name it---so workspaces always carry some\nsemantic meaning.\n\n(N.B. I don't mean to imply that this model is new, just uncommon; particularly\n      among floating window managers. I've personally taken the model from\n      xmonad-contrib's DynamicWorkspaces module.)\n\n\nTiling layouts\n==============\nRight now, only simple tiling layouts are available. (Vertical and Horizontal.)\nMostly because those are the layouts that I primarily use. I'll be adding more\nas they are demanded.\n\n\nUmmm... manual tiling?\n======================\nI'd actually love to add this to Wingo. It's slightly more complex than\nautomatic tiling layouts, because it introduces the concept of containers,\nwhich is something that Wingo knows nothing about. Namely, a container can hold\nzero or more windows and an empty container may have focus.\n\n\nWhy doesn't Wingo have..?\n=========================\nTags\n----\nAnother popular workspace model (particularly among tiling window managers) is\ntagging a window with one or more workspaces.\n\nNot only do I find this needlessly complex, but it doesn't really make sense in\na model where more than one workspace can be visible in multi-head setups.\n\nShaded windows\n--------------\nThis is in Openbox, but not Wingo. Honestly, I just never use it. I'm not\nreally opposed to them, though.\n\nTabbed windows\n--------------\nThe thought of programming the decorations for this scares me. This, like\nmanual tiling, would also require that Wingo have a notion of containers (which\nit doesn't).\n\nCompositing\n-----------\nBandwidth allotment exceeded. Seriously.\n\nIf an ambitious person wanted to run with it, that's fine, but there are\nserious hurdles. The most pertinent one is mixing OpenGL with the pure X Go\nBinding. I am not sure how to do it.\n\nOne could use the X RENDER extension, but I think everyone hates that.\n\nWayland\n-------\nI have done a non-trivial amount of research into Wayland (but not a big\namount) and there are serious hurdles to overcome before Go can work with the\nWayland protocol in a practical way. Namely, while a pure Go binding could be\nwritten easily enough, it would be forced into software compositing---which\ncould be too slow. In order to do hardware compositing, I think you need OpenGL\n(specifically, EGL), which links against the libwayland libraries. (Yeah,\nthat's a recursive dependency. Wooho.)\n\nPlus, in order to use Wayland, Wingo would need a compositing backend (along\nwith every other non-compositing X11 window manager). This is also not an easy\ntask.\n\nSupposedly there are some ideas for plans floating around that would let\nnon-compositing X window managers to \"plug into\" the Wayland reference\ncompositor (Weston). When this will be possible (or even *if* it will be\npossible with a window manager written in Go) remains to be seen.\n\nIf I am in err (and this is quite likely; my OpenGL knowledge is limited),\nplease ping me.\n\n\nDependencies\n============\nYou really should be using the 'go' tool to install Wingo, and therefore\nshouldn't care about dependencies. But I'll list them anyway---with many thanks\nto the authors (well, the ones that aren't me anyway).\n\n* go                  http://golang.org\n* graphics-go         http://code.google.com/p/graphics-go\n* freetype-go         http://code.google.com/p/freetype-go\n* ansi                http://github.com/str1ngs/ansi\n* go-bindata          http://github.com/jteeuwen/go-bindata (build dependency)\n* gribble             http://github.com/BurntSushi/gribble\n* xgb                 http://github.com/BurntSushi/xgb\n* xgbutil             http://github.com/BurntSushi/xgbutil\n* xdg                 http://github.com/BurntSushi/xdg\n\n\nInspiration\n===========\nWingo is *heavily* inspired by Openbox and Xmonad. Basically, Openbox's\nfloating semantics (although most window managers are the same in this regard)\nand Xmonad's automatic tiling style plus its workspace model (workspaces per\nmonitor). I've also adopted Xmonad's \"greedy\" workspace switching and embedded\nthe concepts from the \"DynamicWorkspaces\" contrib library into the Gribble\ncommand system.\n\n\nGo your own way\n===============\nWingo is actually split up into *many* sub-packages. It is possible (but not\nnecessarily likely) that you could pick out some of these sub-packages and use\nthem in your own window manager. The packages of particular interest are\nprobably the ones that do the most nitty gritty X stuff---especially relating\nto drawing windows. Here's a quick run down of those:\n\ncursors\n-------\nSets up some plain old X cursors. Not very interesting.\n\nprompt\n------\nProvides several different kinds of prompt windows that can take user input.\nThese should actually work in an existing window manager. (See the examples in\nthe package directory.) Prompt requires both the 'render' and 'text' Wingo\npackages.\n\nrender\n------\nRenders some very basic shapes and gradients to X windows.\n\ntext\n----\nRenders text to windows. Also provides a special window type that can act as a\ntext box for user input.\n\nOthers\n------\nThe only other package worth mentioning is 'frame'. It's probably too\nmonolithic to be used in another window manager (unless you really like Wingo's\ndecorations), but it's possible that it could serve as a half-decent template\nfor your own frames.\n\nThe rest of the sub-packages (excluding xclient and wm, since they are very\nWingo specific) could also be used, particularly since only minimal Client\ninterfaces are required. However, most of them aren't that complex and\ntherefore probably aren't worth it. And the ones that do have some complexity\n(maybe 'heads' and 'workspace') aren't packages that I'm particularly proud of.\n\nAlso, if you're wanting to make a Go window manager, my xgbutil package\n(separate from Wingo) will be a big help. Feel free to ping me.\n\n\nMy past X work\n==============\nThere's too much. The highlights are pytyle and Openbox Multihead.\n\nFor more: http://burntsushi.net/x11/\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fu-root%2Fwingo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fu-root%2Fwingo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fu-root%2Fwingo/lists"}