/* ClientFlagsToggle {{{ */ static VALUE ClientFlagsToggle(VALUE self, char *type, int flag) { int iflags = 0; VALUE win = Qnil, flags = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@win", win); GET_ATTR(self, "@flags", flags); subextSubtlextConnect(NULL); ///< Implicit open connection /* Update flags */ iflags = FIX2INT(flags); if(iflags & flag) iflags &= ~flag; else iflags |= flag; rb_iv_set(self, "@flags", INT2FIX(iflags)); /* Send message */ data.l[0] = XInternAtom(display, "_NET_WM_STATE_TOGGLE", False); data.l[1] = XInternAtom(display, type, False); subSharedMessage(display, NUM2LONG(win), "_NET_WM_STATE", data, 32, True); return self; } /* }}} */
VALUE subextSubletSend(VALUE self, VALUE value) { VALUE id = Qnil; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@id", id); /* Check object type */ if(T_STRING == rb_type(value)) { char *list = NULL; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Store data */ list = strdup(RSTRING_PTR(value)); subSharedPropertySetStrings(display, DefaultRootWindow(display), XInternAtom(display, "SUBTLE_DATA", False), &list, 1); free(list); data.l[0] = FIX2INT(id); subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_SUBLET_DATA", data, 32, True); } else rb_raise(rb_eArgError, "Unexpected value-type `%s'", rb_obj_classname(value)); return self; } /* }}} */
VALUE subSubletUpdate(VALUE self) { int id = -1; VALUE name = Qnil; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@name", name); /* Check results */ if(-1 != ((id = subSubtlextFindString("SUBTLE_SUBLET_LIST", RSTRING_PTR(name), NULL, SUB_MATCH_EXACT)))) { SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Send message */ data.l[0] = id; subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_SUBLET_UPDATE", data, 32, True); } else rb_raise(rb_eStandardError, "Failed finding sublet"); return Qnil; } /* }}} */
/* SubtleSend {{{ */ static VALUE SubtleSend(char *message) { SubMessageData data = { { 0, 0, 0, 0, 0 } }; subSubtlextConnect(NULL); ///< Implicit open connection subSharedMessage(display, DefaultRootWindow(display), message, data, 32, True); return Qnil; } /* }}} */
VALUE subextViewSave(VALUE self) { int id = -1; VALUE name = Qnil; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@name", name); subextSubtlextConnect(NULL); ///< Implicit open connection /* Create view if needed */ if(-1 == (id = subextSubtlextFindString("_NET_DESKTOP_NAMES", RSTRING_PTR(name), NULL, SUB_MATCH_EXACT))) { SubMessageData data = { { 0, 0, 0, 0, 0 } }; snprintf(data.b, sizeof(data.b), "%s", RSTRING_PTR(name)); subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_VIEW_NEW", data, 8, True); id = subextSubtlextFindString("_NET_DESKTOP_NAMES", RSTRING_PTR(name), NULL, SUB_MATCH_EXACT); } /* Guess view id */ if(-1 == id) { int nnames = 0; char **names = NULL; /* Get names of views */ if((names = subSharedPropertyGetStrings(display, DefaultRootWindow(display), XInternAtom(display, "_NET_DESKTOP_NAMES", False), &nnames))) { id = nnames; ///< New id should be last if(names) XFreeStringList(names); } } /* Set properties */ rb_iv_set(self, "@id", INT2FIX(id)); return self; } /* }}} */
VALUE subextSubletVisibilityHide(VALUE self) { VALUE id = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@id", id); data.l[0] = FIX2LONG(id); data.l[1] = SUB_EWMH_HIDDEN; subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_SUBLET_FLAGS", data, 32, True); return self; } /* }}} */
VALUE subextSubletUpdate(VALUE self) { VALUE id = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@id", id); /* Send message */ data.l[0] = FIX2INT(id); subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_SUBLET_UPDATE", data, 32, True); return self; } /* }}} */
VALUE subextViewJump(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); data.l[2] = -1; subSharedMessage(display, DefaultRootWindow(display), "_NET_CURRENT_DESKTOP", data, 32, True); return self; } /* }}} */
VALUE subextViewKill(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_VIEW_KILL", data, 32, True); rb_obj_freeze(self); ///< Freeze object return Qnil; } /* }}} */
/* ClientRestack {{{ */ VALUE ClientRestack(VALUE self, int detail) { VALUE win = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@win", win); subextSubtlextConnect(NULL); ///< Implicit open connection /* Send message */ data.l[0] = 2; ///< Claim to be a pager data.l[1] = NUM2LONG(win); data.l[2] = detail; subSharedMessage(display, DefaultRootWindow(display), "_NET_RESTACK_WINDOW", data, 32, True); return self; } /* }}} */
/* ClientFlagsSet {{{ */ static VALUE ClientFlagsSet(VALUE self, int flag, int toggle) { int iflags = flag; VALUE win = Qnil; SubMessageData data = { { 0, 0, 0, 0, 0 } }; /* Check ruby object */ rb_check_frozen(self); GET_ATTR(self, "@win", win); /* Toggle flags */ if(toggle) { VALUE flags = Qnil; GET_ATTR(self, "@flags", flags); iflags = FIX2INT(flags); if(iflags & flag) iflags &= ~flag; else iflags |= flag; } /* Assemble message */ data.l[0] = NUM2LONG(win); data.l[1] = iflags; subSharedMessage(display, DefaultRootWindow(display), "SUBTLE_CLIENT_FLAGS", data, 32, True); rb_iv_set(self, "@flags", INT2FIX(iflags)); return self; } /* }}} */
VALUE subGravityUpdate(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"); subGeometryToRect(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 = subGeometryInstantiate(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); } rb_iv_set(self, "@id", INT2FIX(id)); return Qnil; } /* }}} */