def in_axis_geometry(geometry, axis, workarea=None): """Return geometry stretched in given axis.""" workarea = workarea or WM.workarea_geometry if axis == 'x': return Geometry(geometry.x, workarea.y, geometry.width, workarea.height) elif axis == 'y': return Geometry(workarea.x, geometry.y, workarea.width, geometry.height)
def __init__(self, win, position, gravity, size, width, height, cycle): self.win_id = win.id self.args = (position, gravity, size, width, height ) # TODO: remove me!? self.gravity = gravity workarea = WM.workarea_geometry self.position = absolute_position(workarea, position) self.sizes = absolute_size(win, workarea, size, width, height) dummy = DummyWindow(win, self.position, self.sizes, self.gravity) max_geo = expand_window(dummy, dummy.gravity, sticky=False, vertical_first=cycle) widths = [] for width in self.sizes.width: if max_geo.width - width >= 0 and \ self.position.x - width * position.x >= max_geo.x and \ self.position.x + width * (1 - position.x) <= max_geo.x2: widths.append(width) heights = [] for height in self.sizes.height: if max_geo.height - height >= 0 and \ self.position.y - height * position.y >= max_geo.y and \ self.position.y + height * (1 - position.y) <= max_geo.y2: heights.append(height) width = max(widths) height = max(heights) self.sizes_iterator = Size(get_iterator(self.sizes.width, width), get_iterator(self.sizes.height, height)) [self.sizes_iterator.height, self.sizes_iterator.width][cycle].next() self.previous = Geometry(self.position.x, self.position.y, width, height, self.gravity)
def test_geometry_normal_window(self): # initial geometry geometry = self.win.geometry self.assertEqualGeometry(geometry, WIN_X, WIN_Y, WIN_WIDTH, WIN_HEIGHT) # set same geometry self.win.set_geometry(geometry) geometry = self.win.geometry self.assertEqualGeometry(geometry, WIN_X, WIN_Y, WIN_WIDTH, WIN_HEIGHT) # set new geometry self.win.set_geometry(Geometry(50, 75, 138, 45)) geometry = self.win.geometry self.assertEqualGeometry(geometry, 50, 75, 138, 45) # set position to (0, 0) self.win.set_geometry(Geometry(0, 0, 138, 45)) geometry = self.win.geometry self.assertEqualGeometry(geometry, 0, 0, 138, 45)
def test_constructor(self): geo = Geometry(100, 150, 20, 30) self.assertEqual(geo.x2, 120) self.assertEqual(geo.y2, 180) # relative to gravity geo = Geometry(100, 150, 20, 30, Gravity(1, 1)) self.assertEqual(geo.x2, 100) self.assertEqual(geo.y2, 150) self.assertEqual(geo.x, 80) self.assertEqual(geo.y, 120) # conversion to int geo = Geometry(1.1, 2.9, 10.5, 15.2) self.assertEqual(geo.x, 1) self.assertEqual(geo.y, 2) self.assertEqual(geo.width, 10) self.assertEqual(geo.height, 15)
def test_fullscreen(self): desktop_geometry = Geometry(0, 0, DESKTOP_WIDTH, DESKTOP_HEIGHT) win_geometry = self.win.geometry self.assertFalse(State.FULLSCREEN in self.win.state) geometry = self.win.geometry self.assertNotEqual(geometry, desktop_geometry) extents = self.win.extents self.assertNotEqual(extents, Xlib_mock.EXTENTS_FULLSCREEN) # set fullscreen self.win.fullscreen(1) self.assertTrue(State.FULLSCREEN in self.win.state) geometry = self.win.geometry self.assertEqual(geometry, desktop_geometry) extents = self.win.extents self.assertEqual(extents, Xlib_mock.EXTENTS_FULLSCREEN) # unset fullscreen self.win.fullscreen(0) self.assertFalse(State.FULLSCREEN in self.win.state) geometry = self.win.geometry self.assertNotEqual(geometry, desktop_geometry) self.assertEqual(win_geometry, geometry) extents = self.win.extents self.assertNotEqual(extents, Xlib_mock.EXTENTS_FULLSCREEN) # toggle back and forth self.win.fullscreen(2) self.assertTrue(State.FULLSCREEN in self.win.state) self.win.fullscreen(2) self.assertFalse(State.FULLSCREEN in self.win.state)
def in_direction_geometry(geometry, direction, inclusive=False, workarea=None): """Return geometry in given direction from the given geometry. If inclusive is True include given geometry. """ workarea = workarea or WM.workarea_geometry if direction.is_middle: return workarea def in_axis(axis, top_left, bottom_right): """Return pair of x/y and width/height.""" xy, xy2, size = ATTRGETTERS[axis] new_xy = xy(workarea) new_size = size(workarea) if top_left: if inclusive: new_size = xy2(geometry) - new_xy else: new_size = xy(geometry) - new_xy if bottom_right: if inclusive: new_xy = xy(geometry) else: new_xy = xy2(geometry) new_size = xy2(workarea) - new_xy return new_xy, new_size x, width = in_axis('x', direction.is_left, direction.is_right) y, height = in_axis('y', direction.is_top, direction.is_bottom) return Geometry(x, y, width, height)
def __init__(self, window, position, size, gravity): self.extents = window.extents self.desktop = window.desktop self.id = window.id self.geometry = Geometry(position.x, position.y, min(size.width), min(size.height), gravity)
def next(self, cycle): """Return new window geometry.""" if cycle == CYCLE_WIDTH: width = self.sizes_iterator.width.next() height = self.previous.height if cycle == CYCLE_HEIGHT: width = self.previous.width height = self.sizes_iterator.height.next() self.previous = Size(width, height) return Geometry(self.position.x, self.position.y, width, height, self.gravity)
def test_set_position(self): geo = Geometry(0, 0, 100, 200) self.assertEqual(geo.x, 0) self.assertEqual(geo.y, 0) # set postion geo.set_position(10, 10) self.assertEqual(geo.x, 10) self.assertEqual(geo.y, 10) # set position relative to gravity geo.set_position(10, 10, Gravity(0, 0)) self.assertEqual(geo.x, 10) self.assertEqual(geo.y, 10) geo.set_position(110, 210, Gravity(1, 1)) self.assertEqual(geo.x, 10) self.assertEqual(geo.y, 10) geo.set_position(60, 110, Gravity(0.5, 0.5)) self.assertEqual(geo.x, 10) self.assertEqual(geo.y, 10)
def test_nearest_screen_geometry_2(self): self.display.xinerama_query_screens = lambda: Xlib_mock.ScreensQuery( (0, 0, 640, 400), (640, 0, 960, 200)) screen = self.WM.nearest_screen_geometry(Geometry(630, 390, 700, 500)) self.assertEqual(screen, Geometry(0, 0, 640, 400))
def test_workarea_geometry(self): # No panels! self.assertEqual(self.WM.workarea_geometry, Geometry(0, 0, DESKTOP_WIDTH, DESKTOP_HEIGHT))
def assertEqualGeometry(self, geometry, x, y, width, height): other = Geometry(x, y, width, height) self.assertEqual(geometry, other)
def test_intersection_outside(self): self.assertEqual(Geometry(0, 0, 3, 3) & Geometry(1, 1, 1, 1), Geometry(1, 1, 1, 1))
def test_intersection_ne_sw_corners_overlap(self): self.assertEqual(Geometry(0, 1, 2, 2) & Geometry(1, 0, 2, 2), Geometry(1, 1, 1, 1))
def test_intersection_n_s_sides_touch(self): self.assertEqual(Geometry(0, 1, 1, 1) & Geometry(0, 0, 1, 1), Geometry(0, 1, 1, 0))
def test_intersection_ne_sw_corners_touch(self): self.assertEqual(Geometry(0, 1, 1, 1) & Geometry(1, 0, 1, 1), Geometry(1, 1, 0, 0))
def test_intersection_no_overlap(self): self.assertEqual(Geometry(0, 0, 1, 1) & Geometry(2, 0, 1, 1), None)