Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added sharedtags-greedyview to recipes #126

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
115 changes: 115 additions & 0 deletions recipes/sharedtags-greedyview
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# Helper for multiple monitors (based on xrandr)

The [[sharedtags-greedyview.lua|sharedtags-greedyview.lua]] script implements the xmonad default
behaviour in which tags are handled for multiple monitors, namely:
* A list of tags is shared between all screens
* Selecting a tag shows it on the screen that is focused, regardless of the previous screen of the tag (greedyview)
* If the selected tag was already visible on the other screen, swap tags between screens

# Credit

I forked the script from https://github.com/Elv13/awesome-sharedtags and only added a few lines to implement the
swapping behaviour described above.

# Setup

The process of setting up this script is as follows:

1. Create a file called `sharedtags-greedyview.lua` in your file system (preferably in
awesome's folder) with the [[script|xrandr.lua]] content.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why xrandr.lua?


2. Import the script in your `rc.lua`

```lua
local sharedtags = require("sharedtags-greedyview")
```

3. Create the tags using the `sharedtags()` method, instead of the original
ones created with `awful.tag()`. They should be created at the file level,
i.e. outside of any function.

```lua
local tags = sharedtags({
{ name = "main", layout = awful.layout.layouts[2] },
{ name = "www", layout = awful.layout.layouts[10] },
{ name = "game", layout = awful.layout.layouts[1] },
{ name = "misc", layout = awful.layout.layouts[2] },
{ name = "chat", screen = 2, layout = awful.layout.layouts[2] },
{ layout = awful.layout.layouts[2] },
{ screen = 2, layout = awful.layout.layouts[2] }
})
```
4. Remove or uncomment the code which creates the tags when a screen is
connected, in the `connect_for_each_screen` callback.

```lua
awful.screen.connect_for_each_screen(function(s)
-- Each screen has its own tag table.
--awful.tag({ "1", "2", "3", "4", "5", "6", "7", "8", "9" }, s, awful.layout.layouts[1])

-- Here is a good place to add tags to a newly connected screen, if desired:
--sharedtags.viewonly(tags[4], s)
end)
```
5. The code for handling tags and clients needs to be changed to use the
library and pick the correct tag.

```lua
for i = 1, 9 do
globalkeys = gears.table.join(globalkeys,
-- View tag only.
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = tags[i]
if tag then
sharedtags.viewonly(tag, screen)
end
end,
{description = "view tag #"..i, group = "tag"}),
-- Toggle tag display.
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = tags[i]
if tag then
sharedtags.viewtoggle(tag, screen)
end
end,
{description = "toggle tag #" .. i, group = "tag"}),
-- Move client to tag.
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local tag = tags[i]
if tag then
client.focus:move_to_tag(tag)
end
end
end,
{description = "move focused client to tag #"..i, group = "tag"}),
-- Toggle tag on focused client.
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local tag = tags[i]
if tag then
client.focus:toggle_tag(tag)
end
end
end,
{description = "toggle focused client on tag #" .. i, group = "tag"})
)
end
```
6. Lastly, any rules referencing the screen and tag should use the newly
created `tags` array instead.

```lua
awful.rules.rules = {
-- Set Firefox to always map on tag number 2.
{ rule = { class = "Firefox" },
properties = { tag = tags[2] } }, -- or tags["www"] to map it to the name instead
}
```
7. Restart or reload *awesome*.