Move remaining selection mode logic into selextend
[st.git] / st.c
diff --git a/st.c b/st.c
index ec747cc..b7e215e 100644 (file)
--- a/st.c
+++ b/st.c
 #include <time.h>
 #include <unistd.h>
 #include <libgen.h>
-#include <fontconfig/fontconfig.h>
 #include <wchar.h>
 
-/* X11 */
-#include <X11/cursorfont.h>
-#include <X11/Xft/Xft.h>
-
 #include "st.h"
 #include "win.h"
 
@@ -145,6 +140,7 @@ static void tscrollup(int, int);
 static void tscrolldown(int, int);
 static void tsetattr(int *, int);
 static void tsetchar(Rune, Glyph *, int, int);
+static void tsetdirt(int, int);
 static void tsetscroll(int, int);
 static void tswapscreen(void);
 static void tsetmode(int, int, int *, int);
@@ -170,13 +166,12 @@ static char *base64dec(const char *);
 static ssize_t xwrite(int, const char *, size_t);
 
 /* Globals */
-TermWindow win;
 Term term;
-Selection sel;
 int cmdfd;
 pid_t pid;
 int oldbutton   = 3; /* button event on startup: 3 = release */
 
+static Selection sel;
 static CSIEscape csiescseq;
 static STREscape strescseq;
 static int iofd = 1;
@@ -371,13 +366,9 @@ base64dec(const char *src)
 void
 selinit(void)
 {
-       clock_gettime(CLOCK_MONOTONIC, &sel.tclick1);
-       clock_gettime(CLOCK_MONOTONIC, &sel.tclick2);
        sel.mode = SEL_IDLE;
        sel.snap = 0;
        sel.ob.x = -1;
-       sel.primary = NULL;
-       sel.clipboard = NULL;
 }
 
 int
@@ -394,6 +385,52 @@ tlinelen(int y)
        return i;
 }
 
+void
+selstart(int col, int row, int snap)
+{
+       selclear();
+       sel.mode = SEL_EMPTY;
+       sel.type = SEL_REGULAR;
+       sel.snap = snap;
+       sel.oe.x = sel.ob.x = col;
+       sel.oe.y = sel.ob.y = row;
+       selnormalize();
+
+       if (sel.snap != 0)
+               sel.mode = SEL_READY;
+       tsetdirt(sel.nb.y, sel.ne.y);
+}
+
+void
+selextend(int col, int row, int type, int done)
+{
+       int oldey, oldex, oldsby, oldsey, oldtype;
+
+       if (!sel.mode)
+               return;
+       if (done && sel.mode == SEL_EMPTY) {
+               selclear();
+               return;
+       }
+
+       oldey = sel.oe.y;
+       oldex = sel.oe.x;
+       oldsby = sel.nb.y;
+       oldsey = sel.ne.y;
+       oldtype = sel.type;
+
+       sel.alt = IS_SET(MODE_ALTSCREEN);
+       sel.oe.x = col;
+       sel.oe.y = row;
+       selnormalize();
+       sel.type = type;
+
+       if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type)
+               tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey));
+
+       sel.mode = done ? SEL_IDLE : SEL_READY;
+}
+
 void
 selnormalize(void)
 {
@@ -425,7 +462,8 @@ selnormalize(void)
 int
 selected(int x, int y)
 {
-       if (sel.mode == SEL_EMPTY)
+       if (sel.mode == SEL_EMPTY || sel.ob.x == -1 ||
+                       sel.alt != IS_SET(MODE_ALTSCREEN))
                return 0;
 
        if (sel.type == SEL_RECTANGULAR)
@@ -676,7 +714,6 @@ void
 ttynew(char *line, char *out, char **args)
 {
        int m, s;
-       struct winsize w = {term.row, term.col, 0, 0};
 
        if (out) {
                term.mode |= MODE_PRINT;
@@ -697,7 +734,7 @@ ttynew(char *line, char *out, char **args)
        }
 
        /* seems to work fine on linux, openbsd and freebsd */
-       if (openpty(&m, &s, NULL, NULL, &w) < 0)
+       if (openpty(&m, &s, NULL, NULL, NULL) < 0)
                die("openpty failed: %s\n", strerror(errno));
 
        switch (pid = fork()) {
@@ -1683,11 +1720,8 @@ csihandle(void)
        case ' ':
                switch (csiescseq.mode[1]) {
                case 'q': /* DECSCUSR -- Set Cursor Style */
-                       DEFAULT(csiescseq.arg[0], 1);
-                       if (!BETWEEN(csiescseq.arg[0], 0, 6)) {
+                       if (xsetcursor(csiescseq.arg[0]))
                                goto unknown;
-                       }
-                       win.cursor = csiescseq.arg[0];
                        break;
                default:
                        goto unknown;
@@ -1751,7 +1785,7 @@ strhandle(void)
 
                                dec = base64dec(strescseq.args[2]);
                                if (dec) {
-                                       xsetsel(dec, CurrentTime);
+                                       xsetsel(dec);
                                        xclipcopy();
                                } else {
                                        fprintf(stderr, "erresc: invalid base64\n");