Class for Client placement
Methods
Public Class
Public Instance
Public Instance Aliases
to_s | -> | to_str |
Aliases |
Public Class methods
Find Gravity by a given value which can be of following type:
Fixnum |
Array index of the |
String |
Regexp match against name of Gravities, returns a Gravity on single match or an Array on multiple matches. |
Symbol |
Either :all for an array of all Views or any string for an exact match. |
Subtlext::Gravity.find(1) => [#<Subtlext::Gravity:xxx>] Subtlext::Gravity.find("subtle") => [#<Subtlext::Gravity:xxx>] Subtlext::Gravity[".*"] => [#<Subtlext::Gravity:xxx>, #<Subtlext::Gravity:xxx>] Subtlext::Gravity["subtle"] => [] Subtlext::Gravity[:center] => [#<Subtlext::Gravity:xxx>]
VALUE subextGravitySingFind(VALUE self, VALUE value) { return GravityFind(value, False); }
Find first Gravity by a given value which can be of following type:
Fixnum |
Array index of the |
String |
Regexp match against name of Gravities, returns a Gravity on single match or an Array on multiple matches. |
Symbol |
Either :all for an array of all Views or any string for an exact match. |
Subtlext::Gravity.first(1) => #<Subtlext::Gravity:xxx> Subtlext::Gravity.first("subtle") => #<Subtlext::Gravity:xxx>
VALUE subextGravitySingFirst(VALUE self, VALUE value) { return GravityFind(value, True); }
Get an array of all Gravities based on the
SUBTLE_GRAVITIY_LIST
property list.
Subtlext::Gravity.list => [#<Subtlext::Gravity:xxx>, #<Subtlext::Gravity:xxx>] Subtlext::Gravity.list => []
VALUE subextGravitySingList(VALUE self) { return subextSubtlextFindObjectsGeometry("SUBTLE_GRAVITY_LIST", "Gravity", NULL, 0, False); }
Create a new Gravity object locally without calling save automatically.
The Gravity won't be useable until save is called.
gravity = Subtlext::Gravity.new("center", 0, 0, 100, 100) => #<Subtlext::Gravity:xxx>
VALUE subextGravityInit(int argc, VALUE *argv, VALUE self) { VALUE data[5] = { Qnil }, geom = Qnil; rb_scan_args(argc, argv, "14", &data[0], &data[1], &data[2], &data[3], &data[4]); /* Check gravity name */ if(T_STRING != rb_type(data[0])) rb_raise(rb_eArgError, "Invalid value type"); /* Delegate arguments */ if(RTEST(data[1])) { VALUE klass = Qnil; klass = rb_const_get(mod, rb_intern("Geometry")); geom = rb_funcall2(klass, rb_intern("new"), argc - 1, argv + 1); } /* Init object */ rb_iv_set(self, "@id", Qnil); rb_iv_set(self, "@name", data[0]); rb_iv_set(self, "@geometry", geom); subextSubtlextConnect(NULL); ///< Implicit open connection return self; }
Public Instance methods
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
static VALUE SubtlextEqualSpaceId(VALUE self, VALUE other) { return SubtlextSpaceship(self, other, "@id"); }
Whether both objects have the same values (based on id)
object1 == object2 => true
static VALUE SubtlextEqualId(VALUE self, VALUE other) { return SubtlextEqual(self, other, "@id", False); }
Get an array of Clients that have this Gravity.
gravity.clients => [#<Subtlext::Client:xxx>, #<Subtlext::Client:xxx>] tag.clients => []
VALUE subextGravityClients(VALUE self) { int i, nclients = 0; Window *clients = NULL; VALUE id = Qnil, klass = Qnil, meth = Qnil, array = Qnil, c = Qnil; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@id", id); subextSubtlextConnect(NULL); ///< Implicit open connection /* Fetch data */ klass = rb_const_get(mod, rb_intern("Client")); meth = rb_intern("new"); array = rb_ary_new(); clients = subextSubtlextWindowList("_NET_CLIENT_LIST", &nclients); /* Check results */ if(clients) { for(i = 0; i < nclients; i++) { unsigned long *gravity = NULL; /* Get window gravity */ gravity = (unsigned long *)subSharedPropertyGet(display, clients[i], XA_CARDINAL, XInternAtom(display, "SUBTLE_CLIENT_GRAVITY", False), NULL); /* Check if there are common tags or window is stick */ if(gravity && FIX2INT(id) == *gravity && !NIL_P(c = rb_funcall(klass, meth, 1, INT2FIX(i)))) { rb_iv_set(c, "@win", LONG2NUM(clients[i])); subextClientUpdate(c); rb_ary_push(array, c); } if(gravity) free(gravity); } free(clients); } return array; }
Whether both objects have the same values and types (based on id)
object1.eql? object2 => true
static VALUE SubtlextEqualTypedId(VALUE self, VALUE other) { return SubtlextEqual(self, other, "@id", True); }
VALUE subextGravityGeometryReader(VALUE self) { VALUE geometry = Qnil, name = Qnil; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@name", name); /* Load on demand */ if(NIL_P((geometry = rb_iv_get(self, "@geometry")))) { XRectangle geom = { 0 }; GravityFindId(RSTRING_PTR(name), NULL, &geom); geometry = subextGeometryInstantiate(geom.x, geom.y, geom.width, geom.height); rb_iv_set(self, "@geometry", geometry); } return geometry; }
gravity.geometry = 0, 0, 100, 100 => 0 gravity.geometry = [ 0, 0, 100, 100 ] => [ 0, 0, 100, 100 ] gravity.geometry = { x: 0, y: 0, width: 100, height: 100 } => { x: 0, y: 0, width: 100, height: 100 } gravity.geometry = "0x0+100+100" => "0x0+100+100" gravity.geometry = Subtlext::Geometry(0, 0, 100, 100) => #<Subtlext::Geometry:xxx>
VALUE subextGravityGeometryWriter(int argc, VALUE *argv, VALUE self) { VALUE klass = Qnil, geom = Qnil; /* Check ruby object */ rb_check_frozen(self); subextSubtlextConnect(NULL); ///< Implicit open connection /* Delegate arguments */ klass = rb_const_get(mod, rb_intern("Geometry")); geom = rb_funcall2(klass, rb_intern("new"), argc, argv); /* Update geometry */ if(RTEST(geom)) rb_iv_set(self, "@geometry", geom); return geom; }
Get the Gravity Geometry for given Screen in pixel values.
gravity.geometry_for(screen) => #<Subtlext::Geometry:xxx>
VALUE subextGravityGeometryFor(VALUE self, VALUE value) { VALUE geom = Qnil; /* Check object instance */ if(rb_obj_is_instance_of(value, rb_const_get(mod, rb_intern("Screen")))) { XRectangle real = { 0 }, geom_grav = { 0 }, geom_screen = { 0 }; GravityToRect(self, &geom_grav); GravityToRect(value, &geom_screen); /* Calculate real values for screen */ real.width = geom_screen.width * geom_grav.width / 100; real.height = geom_screen.height * geom_grav.height / 100; real.x = geom_screen.x + (geom_screen.width - real.width) * geom_grav.x / 100; real.y = geom_screen.y + (geom_screen.height - real.height) * geom_grav.y / 100; geom = subextGeometryInstantiate(real.x, real.y, real.width, real.height); } else rb_raise(rb_eArgError, "Unexpected value-type `%s'", rb_obj_classname(value)); return geom; }
Convert this object to hash.
puts object.hash => 1746246187916025425
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; }
Remove this Gravity from subtle and freeze this object.
gravity.kill => nil
VALUE subextGravityKill(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_GRAVITY_KILL", data, 32, True); rb_obj_freeze(self); ///< Freeze object return Qnil; }
Save new Gravity object.
gravity.save => nil
VALUE subextGravitySave(VALUE self) { int id = -1; XRectangle geom = { 0 }; char *name = NULL; VALUE match = Qnil; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@name", match); /* Find gravity */ if(-1 == (id = GravityFindId(RSTRING_PTR(match), &name, &geom))) { SubMessageData data = { { 0, 0, 0, 0, 0 } }; VALUE geometry = rb_iv_get(self, "@geometry"); if(NIL_P(geometry = rb_iv_get(self, "@geometry"))) rb_raise(rb_eStandardError, "No geometry given"); subextGeometryToRect(geometry, &geom); ///< Get values /* Create new gravity */ snprintf(data.b, sizeof(data.b), "%hdx%hd+%hd+%hd#%s", geom.x, geom.y, geom.width, geom.height, RSTRING_PTR(match)); subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_GRAVITY_NEW", data, 8, True); id = GravityFindId(RSTRING_PTR(match), NULL, NULL); } else ///< Update gravity { VALUE geometry = Qnil; geometry = subextGeometryInstantiate(geom.x, geom.y, geom.width, geom.height); rb_iv_set(self, "@name", rb_str_new2(name)); rb_iv_set(self, "@gravity", geometry); free(name); } /* Guess gravity id */ if(-1 == id) { int ngravities = 0; char **gravities = NULL; gravities = subSharedPropertyGetStrings(display, DefaultRootWindow(display), XInternAtom(display, "SUBTLE_GRAVITY_LIST", False), &ngravities); id = ngravities; ///< New id should be last XFreeStringList(gravities); } /* Set properties */ rb_iv_set(self, "@id", INT2FIX(id)); return self; }
Set the tiling mode for gravity
gravity.tiling = :vert => :vert gravity.tiling = :horz => :horz gravity.tiling = nil => nil
VALUE subextGravityTilingWriter(VALUE self, VALUE value) { int flags = 0; VALUE id = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@id", id); /* Check value type */ switch(rb_type(value)) { case T_SYMBOL: if(CHAR2SYM("horz") == value) flags = SUB_EWMH_HORZ; else if(CHAR2SYM("vert") == value) flags = SUB_EWMH_VERT; break; case T_NIL: break; default: rb_raise(rb_eArgError, "Unexpected value-type `%s'", rb_obj_classname(value)); } /* Assemble message */ data.l[0] = FIX2INT(id); data.l[1] = flags; subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_GRAVITY_FLAGS", data, 32, True); return value; }
Convert this Gravity object to string.
puts gravity => "TopLeft"
VALUE subextGravityToString(VALUE self) { VALUE name = Qnil; /* Check ruby object */ GET_ATTR(self, "@name", name); return name; }
Convert this Gravity object to symbol.
puts gravity.to_sym => :center
VALUE subextGravityToSym(VALUE self) { VALUE name = Qnil; /* Check ruby object */ GET_ATTR(self, "@name", name); return CHAR2SYM(RSTRING_PTR(name)); }