summaryrefslogtreecommitdiff
path: root/patch/riodraw.c
diff options
context:
space:
mode:
Diffstat (limited to 'patch/riodraw.c')
-rw-r--r--patch/riodraw.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/patch/riodraw.c b/patch/riodraw.c
new file mode 100644
index 0000000..c430f5c
--- /dev/null
+++ b/patch/riodraw.c
@@ -0,0 +1,104 @@
+/* drag out an area using slop and resize the selected window to it. */
+int
+riodraw(Client *c, const char slopstyle[])
+{
+ int i;
+ char str[100];
+ char strout[100];
+ char tmpstring[30] = {0};
+ char slopcmd[100] = "slop -f x%xx%yx%wx%hx ";
+ int firstchar = 0;
+ int counter = 0;
+
+ strcat(slopcmd, slopstyle);
+ FILE *fp = popen(slopcmd, "r");
+
+ while (fgets(str, 100, fp) != NULL)
+ strcat(strout, str);
+
+ pclose(fp);
+
+ if (strlen(strout) < 6)
+ return 0;
+
+ for (i = 0; i < strlen(strout); i++){
+ if (!firstchar) {
+ if (strout[i] == 'x')
+ firstchar = 1;
+ continue;
+ }
+
+ if (strout[i] != 'x')
+ tmpstring[strlen(tmpstring)] = strout[i];
+ else {
+ riodimensions[counter] = atoi(tmpstring);
+ counter++;
+ memset(tmpstring,0,strlen(tmpstring));
+ }
+ }
+
+ if (riodimensions[0] <= -40 || riodimensions[1] <= -40 || riodimensions[2] <= 50 || riodimensions[3] <= 50) {
+ riodimensions[3] = -1;
+ return 0;
+ }
+
+ if (c) {
+ rioposition(c, riodimensions[0], riodimensions[1], riodimensions[2], riodimensions[3]);
+ return 0;
+ }
+
+ return 1;
+}
+
+void
+rioposition(Client *c, int x, int y, int w, int h)
+{
+ Monitor *m;
+ if ((m = recttomon(x, y, w, h)) && m != c->mon) {
+ detach(c);
+ detachstack(c);
+ c->mon = m;
+ c->tags = m->tagset[m->seltags];
+ attach(c);
+ attachstack(c);
+ selmon = m;
+ focus(c);
+ }
+
+ c->isfloating = 1;
+ if (riodraw_borders)
+ resizeclient(c, x, y, w - (c->bw * 2), h - (c->bw * 2));
+ else
+ resizeclient(c, x - c->bw, y - c->bw, w, h);
+ drawbar(c->mon);
+ arrange(c->mon);
+
+ riodimensions[3] = -1;
+ riopid = 0;
+}
+
+/* drag out an area using slop and resize the selected window to it */
+void
+rioresize(const Arg *arg)
+{
+ Client *c = (arg && arg->v ? (Client*)arg->v : selmon->sel);
+ if (c)
+ riodraw(c, slopresizestyle);
+}
+
+/* Spawn a new window and drag out an area using slop to position it while the window is
+ * initialising in the background. */
+void
+riospawn(const Arg *arg)
+{
+ riopid = spawncmd(arg);
+ riodraw(NULL, slopspawnstyle);
+}
+
+void
+riospawnsync(const Arg *arg)
+{
+ if (riodraw(NULL, slopspawnstyle))
+ riopid = spawncmd(arg);
+}
+