Class for interaction with screens
Methods
Public Class
Public Instance
Public Class methods
current -> Subtlext::Screen
Get current active Screen
Subtlext::Screen.current => #<Subtlext::Screen:xxx>
[show source]
VALUE subextScreenSingCurrent(VALUE self) { int rx = 0, ry = 0, x = 0, y = 0; unsigned int mask = 0; unsigned long nworkareas = 0, npanels = 0; long *workareas = NULL, *panels = NULL; VALUE screen = Qnil; Window root = None, win = None; subextSubtlextConnect(NULL); ///< Implicit open connection /* Get current screen */ XQueryPointer(display, DefaultRootWindow(display), &root, &win, &rx, &ry, &x, &y, &mask); /* Fetch data */ workareas = (long *)subSharedPropertyGet(display, DefaultRootWindow(display), XA_CARDINAL, XInternAtom(display, "_NET_WORKAREA", False), &nworkareas); panels = (long *)subSharedPropertyGet(display, DefaultRootWindow(display), XA_CARDINAL, XInternAtom(display, "SUBTLE_SCREEN_PANELS", False), &npanels); /* Get workarea list */ if(workareas && panels) { int i; for(i = 0; i < nworkareas / 4; i++) { /* Check if coordinates are in screen rects including panel size */ if(rx >= workareas[i * 4 + 0] && rx < workareas[i * 4 + 0] + workareas[i * 4 + 2] && ry >= (workareas[i * 4 + 1] - panels[i * 2 + 0]) && ry < (workareas[i * 4 + 1] + workareas[i * 4 + 3] + panels[i * 2 + 1])) { VALUE geometry = Qnil; /* Create new screen */ screen = subextScreenInstantiate(i); geometry = subextGeometryInstantiate(workareas[i * 4 + 0], workareas[i * 4 + 1], workareas[i * 4 + 2], workareas[i * 4 + 3]); rb_iv_set(screen, "@geometry", geometry); } } } if(workareas) free(workareas); if(panels) free(panels); return screen; }
find(value) -> Subtlext::Screen or nil
Find Screen by a given value which can be of following type:
fixnum |
Array id |
Subtlext::Geometry |
Subtlext::Screen.find(1) => #<Subtlext::Screen:xxx> Subtlext::Screen[1] => #<Subtlext::Screen:xxx> Subtlext::Screen.find(Subtlext::Geometry(10, 10, 100, 100) => #<Subtlext::Screen:xxx>
[show source]
VALUE subextScreenSingFind(VALUE self, VALUE value) { VALUE screen = Qnil; /* Check object type */ switch(rb_type(value)) { case T_FIXNUM: { VALUE screens = ScreenList(); screen = rb_ary_entry(screens, FIX2INT(value)); } break; case T_OBJECT: { VALUE klass = rb_const_get(mod, rb_intern("Geometry")); /* Check object instance */ if(rb_obj_is_instance_of(value, klass)) { unsigned long nworkareas = 0; long *workareas = NULL; subextSubtlextConnect(NULL); ///< Implicit open connection /* Get workarea list */ if((workareas = (long *)subSharedPropertyGet(display, DefaultRootWindow(display), XA_CARDINAL, XInternAtom(display, "_NET_WORKAREA", False), &nworkareas))) { int i; XRectangle geom = { 0 }; subextGeometryToRect(value, &geom); for(i = 0; i < nworkareas / 4; i++) { /* Check if coordinates are in screen rects */ if(geom.x >= workareas[i * 4 + 0] && geom.x < workareas[i * 4 + 0] + workareas[i * 4 + 2] && geom.y >= workareas[i * 4 + 1] && geom.y < workareas[i * 4 + 1] + workareas[i * 4 + 3]) { VALUE geometry = Qnil; /* Create new screen */ screen = subextScreenInstantiate(i); geometry = subextGeometryInstantiate( workareas[i * 4 + 0], workareas[i * 4 + 1], workareas[i * 4 + 2], workareas[i * 4 + 3]); rb_iv_set(screen, "@geometry", geometry); break; } } free(workareas); } } } break; default: rb_raise(rb_eArgError, "Unexpected value type `%s'", rb_obj_classname(value)); } return screen; }
list -> Array
Get Array of all Screen
Subtlext::Screen.list => [#<Subtlext::Screen:xxx>, #<Subtlext::Screen:xxx>] Subtlext::Screen.list => []
[show source]
VALUE subextScreenSingList(VALUE self) { return ScreenList(); }
new(id) -> Subtlext::Screen
Create a new Screen object
screen = Subtlext::Screen.new(0) => #<Subtlext::Screen:xxx>
[show source]
VALUE subextScreenInit(VALUE self, VALUE id) { if(!FIXNUM_P(id) || 0 > FIX2INT(id)) rb_raise(rb_eArgError, "Unexpected value-type `%s'", rb_obj_classname(id)); /* Init object */ rb_iv_set(self, "@id", id); rb_iv_set(self, "@geometry", Qnil); subextSubtlextConnect(NULL); ///< Implicit open connection return self; }
Public Instance methods
<=>(other) -> -1, 0 or 1
Whether both objects have the same value. Returns -1, 0 or 1 when self is less than, equal to or grater than other. (based on id)
object1 <=> object2 => 0
[show source]
static VALUE SubtlextEqualSpaceId(VALUE self, VALUE other) { return SubtlextSpaceship(self, other, "@id"); }
==(other) -> True or False
Whether both objects have the same values (based on id)
object1 == object2 => true
[show source]
static VALUE SubtlextEqualId(VALUE self, VALUE other) { return SubtlextEqual(self, other, "@id", False); }
screen? -> true or false
[show source]
VALUE subextScreenAskCurrent(VALUE self) { /* Check ruby object */ rb_check_frozen(self); return rb_equal(self, subextScreenSingCurrent(Qnil)); }
eql?(other) -> True or False
Whether both objects have the same values and types (based on id)
object1.eql? object2 => true
[show source]
static VALUE SubtlextEqualTypedId(VALUE self, VALUE other) { return SubtlextEqual(self, other, "@id", True); }
hash -> Hash
Convert this object to hash.
puts object.hash => 1746246187916025425
[show source]
static VALUE SubtlextHash(VALUE self) { VALUE str = Qnil, id = rb_intern("to_str"); /* Convert to string */ if(rb_respond_to(self, id)) str = rb_funcall(self, id, 0, Qnil); return T_STRING == rb_type(str) ? INT2FIX(rb_str_hash(str)) : Qnil; }
screen -> Subtlext::Screen
Jump to this Screen
screen.jump => #<Subtlext::Screen:xxx>
[show source]
VALUE subextScreenJump(VALUE self) { VALUE id = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@id", id); subextSubtlextConnect(NULL); ///< Implicit open connection /* Send message */ data.l[0] = FIX2INT(id); subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_SCREEN_JUMP", data, 32, True); return self; }
to_str -> String
Convert Screen object to String
puts screen => "0x0+800+600"
[show source]
VALUE subextScreenToString(VALUE self) { VALUE geom = Qnil; /* Check ruby object */ GET_ATTR(self, "@geometry", geom); return subextGeometryToString(geom); }
update -> Subtlext::Screen
Update Screen properties
screen.update => #<Subtlext::Screen:xxx>
[show source]
VALUE subextScreenUpdate(VALUE self) { VALUE id = Qnil, screens = Qnil, screen = Qnil; /* Check ruby object */ GET_ATTR(self, "@id", id); /* Find screen */ if((screens = ScreenList()) && RTEST(screen = rb_ary_entry(screens, FIX2INT(id)))) { VALUE geometry = rb_iv_get(screen, "@geometry"); rb_iv_set(self, "@geometry", geometry); } else rb_raise(rb_eStandardError, "Invalid screen id `%d'", (int)FIX2INT(id)); return self; }
view -> Subtlext::View
Get active view for screen
screen.view => #<Subtlext::View:xxx>
[show source]
VALUE subextScreenViewReader(VALUE self) { VALUE ret = Qnil; int nnames = 0; char **names = NULL; unsigned long *screens = NULL; subextSubtlextConnect(NULL); ///< Implicit open connection /* Fetch data */ names = subSharedPropertyGetStrings(display, DefaultRootWindow(display), XInternAtom(display, "_NET_DESKTOP_NAMES", False), &nnames); screens = (unsigned long *)subSharedPropertyGet(display, DefaultRootWindow(display), XA_CARDINAL, XInternAtom(display, "SUBTLE_SCREEN_VIEWS", False), NULL); /* Check results */ if(names && screens) { int id = 0, vid = 0; if(0 <= (id = FIX2INT(rb_iv_get(self, "@id")))) { if(0 <= (vid = screens[id]) && vid < nnames) { ret = subextViewInstantiate(names[vid]); if(!NIL_P(ret)) rb_iv_set(ret, "@id", INT2FIX(vid)); } } } if(names) XFreeStringList(names); if(screens) free(screens); return ret; }
view=(fixnum) -> Fixnum
view=(symbol) -> Symbol
view=(object) -> Subtlext::View
Set active view for screen
screen.view = :www => nil screen.view = Subtlext::View[0] => nil
[show source]
VALUE subextScreenViewWriter(VALUE self, VALUE value) { VALUE vid = Qnil, view = Qnil, sid = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ GET_ATTR(self, "@id", sid); subextSubtlextConnect(NULL); ///< Implicit open connection /* Check instance type */ if(rb_obj_is_instance_of(value, rb_const_get(mod, rb_intern("View")))) view = value; else view = subextViewSingFirst(Qnil, value); GET_ATTR(view, "@id", vid); /* Send message */ data.l[0] = FIX2LONG(vid); data.l[1] = CurrentTime; data.l[2] = FIX2LONG(sid); subSharedMessage(display, DefaultRootWindow(display), "_NET_CURRENT_DESKTOP", data, 32, True); return value; }