diff --git a/README.md b/README.md index 378ab8cb..f29a6d79 100644 --- a/README.md +++ b/README.md @@ -1,160 +1,220 @@ -

- Polybar -

+# polybar-dwm-module +![DWM +Module](https://github.com/mihirlad55/polybar-dwm-module/blob/master/dwm-module.png) -

-A fast and easy-to-use tool for creating status bars. -

- -

- - - - - - - - -

- -**Polybar** aims to help users build beautiful and highly customizable status bars -for their desktop environment, without the need of having a black belt in shell scripting. -Here are a few screenshots showing you what it can look like: - -[![sample screenshot](https://i.imgur.com/xvlw9iHt.png)](https://i.imgur.com/xvlw9iH.png) -[![sample screenshot](https://i.imgur.com/cYQOuRrt.png)](https://i.imgur.com/cYQOuRr.png) -[![sample screenshot](https://i.imgur.com/A6spiZZt.png)](https://i.imgur.com/A6spiZZ.png) -[![sample screenshot](https://i.imgur.com/TY5a5r9t.png)](https://i.imgur.com/TY5a5r9.png) - -You can find polybar configs for these example images (and other configs) [here](https://github.com/jaagr/dots/tree/master/.local/etc/themer/themes). - -## Table of Contents - -* [Introduction](#introduction) -* [Getting Help](#getting-help) -* [Contributing](#contributing) -* [Getting started](#getting-started) - * [Installation](#installation) - * [Configuration](#configuration) - * [Running](#running) -* [Community](#community) -* [Contributors](#contributors) -* [License](#license) +**polybar-dwm-module** is a fork of +[polybar](https://github.com/polybar/polybar) which implements a dwm module. -## Introduction +## Requirements +* dwm with the [IPC patch](https://github.com/mihirlad55/dwm-ipc) applied +* [dwmipcpp](https://github.com/mihirlad55/dwmipcpp) C++ client library for + communicating with dwm (included as a submodule). +* [jsoncpp](https://github.com/open-source-parsers/jsoncpp) for polybar and + dwmipcpp (required by module). -The main purpose of **Polybar** is to help users create awesome status bars. -It has built-in functionality to display information about the most commonly used services. -Some of the services included so far: - -- Systray icons -- Window title -- Playback controls and status display for [MPD](https://www.musicpd.org/) using [libmpdclient](https://www.musicpd.org/libs/libmpdclient/) -- [ALSA](https://www.alsa-project.org/main/index.php/Main_Page) and [PulseAudio](https://www.freedesktop.org/wiki/Software/PulseAudio/) volume controls -- Workspace and desktop panel for [bspwm](https://github.com/baskerville/bspwm), [i3](https://github.com/i3/i3), and [dwm](https://dwm.suckless.org) -- Workspace module for [EWMH compliant](https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130320786080) window managers -- Keyboard layout and indicator status -- CPU and memory load indicator -- Battery display -- Network connection details -- Backlight level -- Date and time label -- Time-based shell script execution -- Command output tailing -- User-defined menu tree -- Inter-process messaging -- And more... - -[See the wiki for more details](https://github.com/polybar/polybar/wiki). - -## Getting Help - -If you find yourself stuck, have a look at our [Support](SUPPORT.md) page for resources where you can find help. - -## Contributing - -Read our [contributing guidelines](CONTRIBUTING.md) for how to get started with contributing to polybar. - -## Getting started - - - Packaging status - - -Polybar was already packaged for the distros listed below. -If you can't find your distro here, you will have to [build from source](https://github.com/polybar/polybar/wiki/Compiling). - -If you are using **Debian** (unstable or testing), you can install [polybar](https://tracker.debian.org/pkg/polybar) using `sudo apt install polybar`. -If you are using **Debian** (buster/stable), you need to enable [backports](https://wiki.debian.org/Backports) and then install using `sudo apt -t buster-backports install polybar`. - -If you are using **Arch Linux**, you can install the AUR package [polybar-git](https://aur.archlinux.org/packages/polybar-git/) to get the latest version, or -[polybar](https://aur.archlinux.org/packages/polybar/) for the latest stable release. - -If you are using **Void Linux**, you can install [polybar](https://github.com/void-linux/void-packages/blob/master/srcpkgs/polybar/template) using `xbps-install -S polybar`. - -If you are using **NixOS**, polybar is available in both the stable and unstable channels and can be installed with the command `nix-env -iA nixos.polybar`. - -If you are using **Slackware**, polybar is available from the [SlackBuilds](https://slackbuilds.org/repository/14.2/desktop/polybar/) repository. - -If you are using **Source Mage GNU/Linux**, polybar spell is available in test grimoire and can be installed via `cast polybar`. - -If you are using **openSUSE**, polybar is available from [OBS](https://build.opensuse.org/package/show/X11:Utilities/polybar/) repository. Package is available for openSUSE Leap 15.1, openSUSE Leap 15.2 and Tumbleweed. - -If you are using **FreeBSD**, [polybar](https://svnweb.freebsd.org/ports/head/x11/polybar/) can be installed using `pkg install polybar`. Make sure you are using the `latest` package branch. - -If you are using **Gentoo**, both release and git-master versions are available in the [main](https://packages.gentoo.org/packages/x11-misc/polybar) repository. - -If you are using **Fedora**, you can install [polybar](https://src.fedoraproject.org/rpms/polybar) using `sudo dnf install polybar`. - -### Installation - -The [compiling page](https://github.com/polybar/polybar/wiki/Compiling) on the -wiki describes all steps necessary to build and install polybar. - -### Configuration - -Details on how to setup and configure the bar and each module have been moved to [the wiki](https://github.com/polybar/polybar/wiki/Configuration). - -#### Install the example configuration -Run the following inside the build directory: -~~~ sh -$ make userconfig -~~~ -Or you can copy the example config from `/usr/share/doc/polybar/config` or ` /usr/local/share/doc/polybar/config` (depending on your install parameters) - -#### Launch the example bar - ~~~ sh - $ polybar example - ~~~ - -### Running - -[See the wiki for details on how to run polybar](https://github.com/polybar/polybar/wiki). - -## Community -Want to get in touch? - -* Join our Gitter room at [gitter.im/polybar/polybar](https://gitter.im/polybar/polybar) -* We have our own subreddit at [r/polybar](https://www.reddit.com/r/polybar). -* Chat with us in the `#polybar` IRC channel on the `chat.freenode.net` server. - -## Contributors - -### Owner -* Michael Carlberg [**@jaagr**](https://github.com/jaagr/) - -### Maintainers -* [**@NBonaparte**](https://github.com/NBonaparte) -* Chase Geigle [**@skystrife**](https://github.com/skystrife) -* Patrick Ziegler [**@patrick96**](https://github.com/patrick96) - -### Logo Design by -* [**@Tobaloidee**](https://github.com/Tobaloidee) +The [dwm-anybar patch](https://github.com/mihirlad55/dwm-anybar) is optionally +recommended for a better experience. This patch allows dwm to manage polybar and +fixes some weird quirks that you may experience without it. -### [All Contributors](https://github.com/polybar/polybar/graphs/contributors) +## The DWM Module +The dwm module currently supports the following: +- Labels: + * Display dwm tags + - Separator label between tags + * Display the current layout + * Display the currently focused window title (per monitor) + * Display label when focused window is floating +- Click Handlers: + * Tags: + - Left-click tag to view tag + - Right-click tag to toggle view on tag + - Scroll tags to view different tags (with wrapping, reverse scroll, and + empty tag scroll) + * Layout: + - Left-click to set `secondary-layout` (specified in config) + - Right-click to set previous layout + - Scroll to cycle through layouts (with wrapping and reverse scroll) +- Different formatting for different tag states: + * Focused: selected tag on selected monitor + * Unfocused: selected tag on unselected monitor + * Visible: unselected, but occupied tag on any monitor + * Urgent: Tag with window that has the urgent hint set + * Empty: Unselected and unoccupied tags +- The combined power of polybar + + +## How to Install +First, apply all the patches you want on dwm, saving the IPC patch for last. + +Optionally, apply the [dwm-anybar +patch](https://github.com/mihirlad55/dwm-anybar) and make sure your `config.h` +contains the following +``` +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const int usealtbar = 1; /* 1 means use non-dwm status bar */ +static const char *altbarclass = "Polybar"; /* Alternate bar class name */ +static const char *altbarcmd = "$HOME/bar.sh"; /* Alternate bar launch command */ +``` +If your polybar is to be displayed on the bottom of the monitor, set `topbar` +to `0`. + +Next, apply the [IPC patch](https://github.com/mihirlad55/dwm-ipc). There will +likely be merge conflicts. The IPC patch is mostly additive, so in most conflict +cases, you will be keeping both changes. + +After applying all your patches, make sure you compile and install dwm +``` +$ sudo make install +``` + +Make sure you have `jsoncpp` installed, and any other requirements from +[polybar](https://github.com/polybar/polybar). + +Arch linux users can install the +[`polybar-dwm-module`](https://aur.archlinux.org/packages/polybar-dwm-module/) +package from the AUR. + +Otherwise you can clone, make, and install polybar yourself. Follow the on +screen prompts in the `build.sh` script and enable any additional features you +want. +``` +$ git clone https://github.com/mihirlad55/polybar-dwm-module +$ cd polybar-dwm-module +$ ./build.sh -d +``` + +Configure the bar! You can view `/usr/share/doc/polybar/config` for a sample config that +includes the supported settings for the dwm module. + +**IF YOU APPLIED THE ANYBAR PATCH**, make sure you have +`override-redirect = false` in your polybar config. + +**IF YOU DID NOT APPLY THE ANYBAR PATCH**, make sure you have +`override-redirect = true` in your polybar config. You will have to set the bar +height in your dwm's `config.h` to match polybar's height and make sure +`showbar` is set to `1` in your `config.h`. Also make sure `topbar` is set to +the correct value based on if your polybar is a bottom/top bar. + +## Launching Polybar +There are multiple ways to launch polybar. Whatever way you decide to use, make +sure polybar launches a few seconds after dwm, else dwm's socket will not be +initialized and the module will fail: + +### Anybar Method +The `altbarcmd` variable can be set to the bar launch script. When you apply the +anybar patch, make sure `spawnbar()` occurs in the `setup()` function after +`setupepoll()` and this will ensure that the bar is launched after dwm is ready. +Also make sure that the script checks for running bars before launching more, +else if dwm is restarted, duplicate bars will be launched. + +### Hacky Delay Method +In your `.xsession` script or whatever script launches at startup, add something +like the following: +``` +$(sleep 4s && "$HOME/launch-polybar.sh") & +``` +This will start your polybar script after a 4 second delay which should give dwm +enough time to initialize before polybar tries to connect to dwm. If this +doesn't work, try a longer delay. + +### Autostart Method +Apply the [autostart patch](https://dwm.suckless.org/patches/autostart/). In +your `autostart_blocking.sh`, add your command to launch polybar. + + +## Sample Module Configuration +```ini +... + +modules-left = ... dwm ... + +... + +[module/dwm] +type = internal/dwm +format = +; Path to dwm socket (default: /tmp/dwm.sock) +; socket-path = /tmp/dwm.sock + +; Left-click to view tag, right-click to toggle tag view +enable-tags-click = false +; Scroll to cycle between available tags +enable-tags-scroll = false +; If true and enable-tags-scroll = true, scrolling will view all tags regardless if occupied +tags-scroll-empty = false +; If true and enable-tags-scroll = true, scrolling will cycle through tags backwards +tags-scroll-reverse = false +; If true and enable-tags-scroll = true, wrap active tag when scrolling +tags-scroll-wrap = false +; Left-click to set secondary layout, right-click to switch to previous layout +enable-layout-click = false +; Scroll to cycle between available layouts +enable-layout-scroll = false +; Wrap when scrolling and reaching beginning/end of layouts +layout-scroll-wrap = false +; Reverse scroll direction +layout-scroll-reverse = false + +; If enable-layout-click = true, clicking the layout symbol will switch to this layout +secondary-layout-symbol = [M] + +; Separator in between shown tags +; label-separator = | + +; Title of currently focused window +; Available tokens: +; %title% +label-title = %title% +label-title-padding = 2 +label-title-foreground = ${colors.primary} +label-title-maxlen = 30 + +; Symbol of current layout +; Available tokens: +; %symbol% +label-layout = %symbol% +label-layout-padding = 2 +label-layout-foreground = #000 +label-layout-background = ${colors.primary} + +; Text to show when currently focused window is floating +label-floating = F + +; States: focused, unfocused, visible, urgent, empty +; Available tokens: +; %name% + +; focused = Selected tag on focused monitor +label-focused = %name% +label-focused-background = ${colors.background-alt} +label-focused-underline= ${colors.primary} +label-focused-padding = 2 + +; unfocused = Unselected tag on unselected monitor +label-unfocused = %name% +label-unfocused-padding = 2 + +; visible = Unselected tag, but occupied tag on any monitor +label-visible = %name% +label-visible-background = ${self.label-focused-background} +label-visible-underline = ${self.label-focused-underline} +label-visible-padding = ${self.label-focused-padding} + +; urgent = Unselected tag with window that has urgency hint set +label-urgent = %name% +label-urgent-background = ${colors.alert} +label-urgent-padding = 2 + +; empty = Unselected and unoccupied tag +; This can be set to an empty string to hide empty tags +label-empty = %name% +label-empty-background = ${colors.primary} +label-empty-padding = 2 +``` ## License - -Polybar is licensed under the MIT license. [See LICENSE for more information](https://github.com/polybar/polybar/blob/master/LICENSE). +Polybar is licensed under the MIT license. [See LICENSE for more +information](https://github.com/polybar/polybar/blob/master/LICENSE). diff --git a/dwm-module.png b/dwm-module.png new file mode 100644 index 00000000..4177f100 Binary files /dev/null and b/dwm-module.png differ