summaryrefslogtreecommitdiff
path: root/workspace.lua
blob: 537345d7dce48d2809b2af683eac4b32a81ac2c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
local M = {}

local awful = require("awful")
local desktop = require("desktop")
local object = require("gears.object")

local Workspace = {}

function Workspace:add_desktop(name, nb_pages)
    idx = #self.desktops + 1
    self.desktops[idx] = desktop.new(idx, name, nb_pages, self.layouts[1])
    return idx
end

function Workspace:_apply_state()
    orig_focus = mouse.screen

    for s = 1, screen.count() do
        if self.screen_state[s] then
            awful.tag.viewnone(s)

            desk = self.screen_state[s].desktop
            page = self.desktops[desk].pages[self.screen_state[s].page]
            awful.tag.setscreen(page, s)
        end
    end
    for s = 1, screen.count() do
        state = self.screen_state[s]
        if state then
            desk_idx = state.desktop
            desk     = self.desktops[desk_idx]
            page_idx = state.page
            page     = desk.pages[page_idx]
            print("workspace displaying: " .. s .. " => " .. desk_idx .. "/" .. page_idx)

            awful.tag.viewonly(page)

            desk:emit_signal("page:view", s, page_idx)
        end
    end

    awful.screen.focus(orig_focus)
end

function Workspace:view(screen, desktop, page_idx)
    print("workspace: " .. screen .. ": view " .. desktop .. "/" .. (page_idx or "nil"))
    -- the page currently displayed on the target screen
    old = {}
    if self.screen_state[screen] then
        old.desk     = self.screen_state[screen].desktop
        old.page_idx = self.screen_state[screen].page
        old.page     = self.desktops[old.desk].pages[page_old_idx]
        print(screen .. " now showing " .. old.desk .. "/" .. old.page_idx)
    end

    -- the page to display on the target screen
    page_idx = self.desktops[desktop]:show(screen, page_idx)
    if page_idx then
        page_new = self.desktops[desktop].pages[page_idx]
    end

    -- the screen on which the new page is currently displayed (if any)
    screen_cur = nil
    if page_new and page_new.selected then
        screen_cur = awful.tag.getscreen(page_new)
        print("page " .. page_idx .. " now displayed on " .. screen_cur)
    end

    if old.page ~= page_new or page_new == nil then
        self.screen_state[screen] = { page = page_idx, desktop = desktop }
        if desktop ~= old.desk then
            self.signals:emit_signal("desktop:view", screen, desktop)
        end

        if screen_cur then
            desk_prev = self.screen_state[screen_cur].desktop
            old.page_idx = self.desktops[old.desk]:show(screen_cur, old.page_idx)

            self.screen_state[screen_cur] = { page = old.page_idx, desktop = old.desk }
            if desk_prev ~= old.desk then
                self.signals:emit_signal("desktop:view", screen_cur, old.desk)
            end
        end


        self:_apply_state()
    end
end

function Workspace:view_relative(offset, screen)
    screen = screen or mouse.screen
    print("view relative " .. offset .. " on " .. screen)

    state = self.screen_state[screen]
    if state then
        desk = state.desktop
        print("state " .. state.page .. " res " .. (state.page + offset) % 10)
        page = 1 + ((state.page - 1 + offset) % #self.desktops[desk].pages)
        print("desk " .. desk .. " " .. #self.desktops[desk].pages)
        print("view relative switch to " .. page)

        self:view(screen, desk, page)
    end
end

function Workspace:move_client(client, desk, page)
    print("move to " .. desk .. "/" .. page)
    awful.client.movetotag(self.desktops[desk].pages[page], client)
end

function Workspace:new(layouts)
    local o = setmetatable({}, self)
    self.__index = self

    o.desktops     = {}
    o.screen_state = {}
    o.layouts      = layouts

    o.signals   = object()
    o.signals:add_signal("desktop:view")

    return o
end

M.Workspace = Workspace

return M