# Copyright (C) 2007-2014 various contributors (see AUTHORS) # # This file is part of Python-EFL. # # Python-EFL is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # # Python-EFL is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this Python-EFL. If not, see . cdef class Window: def __init__(self, Window parent=None, int x=0, int y=0, int w=1, int h=1, input=False, argb=False, override_redirect=False): """Create a new X window. :param parent: window to use as parent, or None to use the root window. :param x: horizontal position. :param y: vertical position. :param w: horizontal size. :param h: vertical size. :param input: if should be an input-only window or not. :param argb: if window should be ARGB. :param override_redirect: if override redirect attribute must be set. """ cdef Ecore_X_Window p_xid, xid if parent is None: p_xid = 0 else: p_xid = parent.xid if not input and not argb and not override_redirect: xid = ecore_x_window_new(p_xid, x, y, w, h) elif argb: if not override_redirect: xid = ecore_x_window_argb_new(p_xid, x, y, w, h) else: xid = ecore_x_window_override_argb_new(p_xid, x, y, w, h) elif input: xid = ecore_x_window_input_new(p_xid, x, y, w, h) elif override_redirect: xid = ecore_x_window_override_new(p_xid, x, y, w, h) else: raise ValueError("not able to create window!") self._set_xid(xid) cdef int _set_xid(self, Ecore_X_Window xid) except 0: if self.xid == 0: self.xid = xid return 1 else: raise ValueError("object already wraps an X Window.") def __str__(self): cdef int x, y, w, h, visible cdef unsigned int parent ecore_x_window_geometry_get(self.xid, &x, &y, &w, &h) parent = ecore_x_window_parent_get(self.xid) visible = ecore_x_window_visible_get(self.xid) return "%s(xid=%#x, parent=%#x, x=%d, y=%d, w=%d, h=%d, visible=%s)" % \ (self.__class__.__name__, self.xid, parent, x, y, w, h, bool(visible)) def __repr__(self): cdef int x, y, w, h cdef unsigned int parent ecore_x_window_geometry_get(self.xid, &x, &y, &w, &h) parent = ecore_x_window_parent_get(self.xid) return "%s(%#x, xid=%#x, parent=%#x, x=%d, y=%d, w=%d, h=%d)" % \ (self.__class__.__name__, self, self.xid, parent, x, y, w, h) def __richcmp__(self, other, int op): if op == 2: # equal if self is other: return 1 else: return self.xid == int(other) else: return 0 def __int__(self): return self.xid def __long__(self): return self.xid def delete(self): "Deletes the current window." if self.xid != 0: ecore_x_window_free(self.xid) self.xid = 0 def delete_request_send(self): "Sends a delete request to this window." ecore_x_window_delete_request_send(self.xid) def root_get(self): ":rtype: Window" cdef Ecore_X_Window xid xid = ecore_x_window_root_get(self.xid) return Window_from_xid(xid) def reparent(self, Window new_parent=None, int x=0, int y=0): """Moves this window to within another window at a given position. :param new_parent: window to use as parent, or None to use the root window. :param x: horizontal position within the new parent. :param y: vertical position within the new parent. """ cdef Ecore_X_Window p_xid if new_parent is None: p_xid = 0 else: p_xid = new_parent.xid ecore_x_window_reparent(self.xid, p_xid, x, y) def parent_set(self, Window new_parent=None): """Set window parent. :param new_parent: window to use as parent, or None to use the root window. :see: same as :py:meth:`reparent` with both x and y being 0. """ cdef Ecore_X_Window p_xid if new_parent is None: p_xid = 0 else: p_xid = new_parent.xid ecore_x_window_reparent(self.xid, p_xid, 0, 0) def parent_get(self): ":rtype: Window" cdef Ecore_X_Window xid xid = ecore_x_window_parent_get(self.xid) return Window_from_xid(xid) property parent: def __set__(self, value): self.parent_set(value) def __get__(self): return self.parent_get() def show(self): """Shows this window. Synonymous to "mapping" a window in X Window System terminology. """ ecore_x_window_show(self.xid) def hide(self): """Hides a window. Synonymous to "unmapping" a window in X Window System terminology. """ ecore_x_window_hide(self.xid) def visible_set(self, value): if value: self.show() else: self.hide() def visible_get(self): ":rtype: bool" return bool(ecore_x_window_visible_get(self.xid)) def focus(self): "Give focus to this windows." ecore_x_window_focus(self.xid) def focus_at_time(self, Ecore_X_Time time): """Sets the focus this window at a specific time. :param time: time specification, see :py:meth:`current_time_get`. """ ecore_x_window_focus_at_time(self.xid, time) def ignore_set(self, int setting): ecore_x_window_ignore_set(self.xid, bool(setting)) def raise_(self): "Raises this window." ecore_x_window_raise(self.xid) def lower(self): "Lowers this window." ecore_x_window_lower(self.xid) def move(self, int x, int y): """Set window position. :param x: horizontal. :param y: vertical. """ ecore_x_window_move(self.xid, x, y) def pos_set(self, int x, int y): """Set window position. :param x: horizontal. :param y: vertical. .. note:: alias for :py:meth:`move` """ ecore_x_window_move(self.xid, x, y) def pos_get(self): ":rtype: tuple of int" cdef int x, y, w, h ecore_x_window_geometry_get(self.xid, &x, &y, &w, &h) return (x, y) property pos: def __set__(self, spec): self.pos_set(*spec) def __get__(self): return self.pos_get() def resize(self, int w, int h): """Set window size. :param w: horizontal. :param h: vertical. """ ecore_x_window_resize(self.xid, w, h) def size_set(self, int w, int h): """Set window size. :param w: horizontal. :param h: vertical. .. note:: alias for :py:meth:`resize` """ ecore_x_window_resize(self.xid, w, h) def size_get(self): ":rtype: tuple of int" cdef int w, h ecore_x_window_size_get(self.xid, &w, &h) return (w, h) property size: def __set__(self, spec): self.size_set(*spec) def __get__(self): return self.size_get() def move_resize(self, int x, int y, int w, int h): """Set both position and size. :param x: horizontal position. :param y: vertical position. :param w: horizontal size. :param h: vertical size. """ ecore_x_window_move_resize(self.xid, x, y, w, h) def geometry_set(self, int x, int y, int w, int h): """Set both position and size. :param x: horizontal position. :param y: vertical position. :param w: horizontal size. :param h: vertical size. """ ecore_x_window_move_resize(self.xid, x, y, w, h) def geometry_get(self): ":rtype: tuple of int" cdef int x, y, w, h ecore_x_window_geometry_get(self.xid, &x, &y, &w, &h) return (x, y, w, h) property geometry: def __set__(self, spec): self.geometry_set(*spec) def __get__(self): return self.geometry_get() def border_width_set(self, int width): """Sets the width of the border of this window. :param width: border width, in pixels. """ ecore_x_window_border_width_set(self.xid, width) def border_width_get(self): ":rtype: int" return ecore_x_window_border_width_get(self.xid) property border_width: def __set__(self, spec): self.border_width_set(*spec) def __get__(self): return self.border_width_get() def depth_get(self): ":rtype: int" return ecore_x_window_depth_get(self.xid) property depth: def __get__(self): return self.depth_get() def configure(self, int mask, int x, int y, int w, int h, int border_width, Window sibling, int stack_mode): cdef Ecore_X_Window sibling_xid if sibling is None: sibling_xid = 0 else: sibling_xid = sibling.xid ecore_x_window_configure(self.xid, mask, x, y, w, h, border_width, sibling_xid, stack_mode) def cursor_show(self): ecore_x_window_cursor_show(self.xid, 1) def cursor_hide(self): ecore_x_window_cursor_show(self.xid, 0) def cursor_set(self, Ecore_X_Cursor cursor): ecore_x_window_cursor_set(self.xid, cursor) def pointer_warp(self, int x, int y): ecore_x_pointer_warp(self.xid, x, y) def pointer_xy_get(self): cdef int x, y ecore_x_pointer_xy_get(self.xid, &x, &y); return (x, y) def defaults_set(self): """Sets the default properties for the given window. The default properties set for the window are WM_CLIENT_MACHINE and _NET_WM_PID. """ ecore_x_window_defaults_set(self.xid) def killall_children(self): "Kill all clients with subwindows under this window." ecore_x_killall(self.xid) def kill(self): "Kill this specific client" ecore_x_kill(self.xid) def background_color_set(self, int r, int g, int b): """Set background color. :param r: red (0...65536, 16 bits) :param g: green (0...65536, 16 bits) :param b: blue (0...65536, 16 bits) """ ecore_x_window_background_color_set(self.xid, r, g, b) def area_clear(self, int x, int y, int w, int h): "Paints the specified area with background's color or pixmap." ecore_x_window_area_clear(self.xid, x, y, w, h) def area_expose(self, int x, int y, int w, int h): "Like :py:meth:`area_clear`, but generates exposures." ecore_x_window_area_expose(self.xid, x, y, w, h) def override_set(self, int setting): ecore_x_window_override_set(self.xid, bool(setting)) def argb_get(self): ":rtype: bool" return bool(ecore_x_window_argb_get(self.xid)) def gravity_set(self, int gravity): ecore_x_window_gravity_set(self.xid, gravity) def pixel_gravity_set(self, int gravity): ecore_x_window_pixel_gravity_set(self.xid, gravity) def event_mask_set(self, int mask): ecore_x_event_mask_set(self.xid, mask) def event_mask_unset(self, int mask): ecore_x_event_mask_unset(self.xid, mask) def icccm_hints_set(self, int accepts_focus, int initial_state, int icon_pixmap, int icon_mask, int icon_window, int window_group, int is_urgent): """Set ICCCM window hints. :param accepts_focus: if window accepts focus or not. :param initial_state: one of ECORE_X_WINDOW_STATE_HINT_*. :param icon_pixmap: pixmap id to be used as icon. :param icon_mask: pixmap id to be used as icon mask. :param icon_window: window id to be used as icon. :param window_group: window id representing the group. :param is_urgent: if window is urgent or not. """ ecore_x_icccm_hints_set(self.xid, accepts_focus, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent) def icccm_hints_get(self): """Get ICCCM window hints. :see: :py:meth:`icccm_hints_set` :return: tuple with: accepts_focus, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent """ cdef Eina_Bool accepts_focus, is_urgent cdef int initial_state, icon_pixmap, icon_mask, \ icon_window, window_group ecore_x_icccm_hints_get(self.xid, &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent) return (bool(accepts_focus), initial_state, icon_pixmap, icon_mask, icon_window, window_group, bool(is_urgent)) def type_set(self, int type): ecore_x_netwm_window_type_set(self.xid, type) def state_set(self, states): # building list cdef Ecore_X_Window_State *_states _states = PyMem_Malloc(len(states) * sizeof(Ecore_X_Window_State)) for i in xrange(len(states)): _states[i] = states[i] ecore_x_netwm_window_state_set(self.xid, _states, len(states)) PyMem_Free(_states) def keyboard_grab(self): return bool(ecore_x_keyboard_grab(self.xid)) def Window_from_xid(unsigned long xid): """Create a Python wrapper for given window id. :param xid: window id. :rtype: L{Window} """ cdef Window w w = Window.__new__(Window) w._set_xid(xid) return w