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));
}