1
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2
# Copyright 2012 Canonical
3
# Author: Thomi Richards
5
# This program is free software: you can redistribute it and/or modify it
6
# under the terms of the GNU General Public License version 3, as published
7
# by the Free Software Foundation.
10
from compizconfig import Plugin, Setting
12
from autopilot.globals import global_context
13
from autopilot.keybindings import KeybindingsHelper
14
from autopilot.utilities import get_desktop_viewport, get_desktop_geometry
17
class WorkspaceManager(KeybindingsHelper):
18
"""Class to manage switching to different workspaces."""
21
super(WorkspaceManager, self).__init__()
22
self.refresh_workspace_information()
25
def num_workspaces(self):
26
"""The number of workspaces configured."""
27
return self._workspaces_wide * self._workspaces_high
30
def current_workspace(self):
31
"""The current workspace number. 0 <= x < num_workspaces."""
32
vx,vy = get_desktop_viewport()
33
return self._coordinates_to_vp_number(vx, vy)
35
def refresh_workspace_information(self):
36
"""Re-read information about available workspaces from compiz and X11."""
37
self._workspaces_wide = self._get_compiz_option("core", "hsize")
38
self._workspaces_high = self._get_compiz_option("core", "vsize")
39
self._desktop_width, self.desktop_height = get_desktop_geometry()
40
self._viewport_width = self._desktop_width / self._workspaces_wide
41
self._viewport_height = self.desktop_height / self._workspaces_high
43
def switch_to(self, workspace_num):
44
"""Switch to the workspace specified.
46
ValueError is raised if workspace_num is outside 0<= workspace_num < num_workspaces.
49
if workspace_num < 0 or workspace_num >= self.num_workspaces:
50
raise ValueError("Workspace number must be between 0 and %d" % self.num_workspaces)
52
current_row, current_col = self._vp_number_to_row_col(self.current_workspace)
53
target_row, target_col = self._vp_number_to_row_col(workspace_num)
54
lefts = rights = ups = downs = 0
55
if current_col > target_col:
56
lefts = current_col - target_col
58
rights = target_col - current_col
59
if current_row > target_row:
60
ups = current_row - target_row
62
downs = target_row - current_row
64
for i in range(lefts):
65
self.keybinding("workspace/move_left")
66
for i in range(rights):
67
self.keybinding("workspace/move_right")
69
self.keybinding("workspace/move_up")
70
for i in range(downs):
71
self.keybinding("workspace/move_down")
74
def _coordinates_to_vp_number(self, vx, vy):
75
"""Translate viewport coordinates to a viewport number."""
76
row,col = self._coordinates_to_row_col(vx, vy)
77
return (row * self._workspaces_wide) + col
79
def _coordinates_to_row_col(self, vx, vy):
80
"""Translate viewport coordinates to viewport row,col."""
81
row = vy / self._viewport_height
82
col = vx / self._viewport_width
85
def _vp_number_to_row_col(self, vp_number):
86
"""Translate a viewport number to a viewport row/col."""
87
row = vp_number / self._workspaces_wide
88
col = vp_number % self._workspaces_wide
91
def _get_compiz_option(self, plugin_name, setting_name):
92
plugin = Plugin(global_context, plugin_name)
93
setting = Setting(plugin, setting_name)