Initial split (non-working)
parent
010fb66cb6
commit
39fd726a51
|
@ -2,6 +2,8 @@
|
||||||
## v0.1
|
## v0.1
|
||||||
* Switched build to CMake
|
* Switched build to CMake
|
||||||
* Completely overhauled code structure
|
* Completely overhauled code structure
|
||||||
|
* Separate code into logical blocks
|
||||||
|
* Purge global variables as much as possible
|
||||||
* Add a desktop entry when installing
|
* Add a desktop entry when installing
|
||||||
based on [desktopentry](https://st.suckless.org/patches/desktopentry/)
|
based on [desktopentry](https://st.suckless.org/patches/desktopentry/)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
#include "selection.h"
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
void selnormalize() {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (sel.type == SEL_REGULAR && sel.ob.y != sel.oe.y) {
|
||||||
|
sel.nb.x = sel.ob.y < sel.oe.y ? sel.ob.x : sel.oe.x;
|
||||||
|
sel.ne.x = sel.ob.y < sel.oe.y ? sel.oe.x : sel.ob.x;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
sel.nb.x = MIN(sel.ob.x, sel.oe.x);
|
||||||
|
sel.ne.x = MAX(sel.ob.x, sel.oe.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
sel.nb.y = MIN(sel.ob.y, sel.oe.y);
|
||||||
|
sel.ne.y = MAX(sel.ob.y, sel.oe.y);
|
||||||
|
|
||||||
|
selsnap(&sel.nb.x, &sel.nb.y, -1);
|
||||||
|
selsnap(&sel.ne.x, &sel.ne.y, +1);
|
||||||
|
|
||||||
|
/* expand selection over line breaks */
|
||||||
|
if (sel.type == SEL_RECTANGULAR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
i = tlinelen(sel.nb.y);
|
||||||
|
if (i < sel.nb.x)
|
||||||
|
sel.nb.x = i;
|
||||||
|
|
||||||
|
if (tlinelen(sel.ne.y) <= sel.ne.x)
|
||||||
|
sel.ne.x = term.col - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void selscroll(int orig, int n) {
|
||||||
|
if (sel.ob.x == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (BETWEEN(sel.nb.y, orig, term.bot) !=
|
||||||
|
BETWEEN(sel.ne.y, orig, term.bot)) {
|
||||||
|
selclear();
|
||||||
|
|
||||||
|
} else if (BETWEEN(sel.nb.y, orig, term.bot)) {
|
||||||
|
sel.ob.y += n;
|
||||||
|
sel.oe.y += n;
|
||||||
|
|
||||||
|
if (sel.ob.y < term.top || sel.ob.y > term.bot || sel.oe.y < term.top ||
|
||||||
|
sel.oe.y > term.bot) {
|
||||||
|
selclear();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
selnormalize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void selclear(void) {
|
||||||
|
if (sel.ob.x == -1)
|
||||||
|
return;
|
||||||
|
sel.mode = SEL_IDLE;
|
||||||
|
sel.ob.x = -1;
|
||||||
|
tsetdirt(sel.nb.y, sel.ne.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void selinit(void) {
|
||||||
|
sel.mode = SEL_IDLE;
|
||||||
|
sel.snap = 0;
|
||||||
|
sel.ob.x = -1;
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef SELECTION_H
|
||||||
|
#define SELECTION_H
|
||||||
|
|
||||||
|
enum selection_mode { SEL_IDLE = 0, SEL_EMPTY = 1, SEL_READY = 2 };
|
||||||
|
enum selection_type { SEL_REGULAR = 1, SEL_RECTANGULAR = 2 };
|
||||||
|
enum selection_snap { SNAP_WORD = 1, SNAP_LINE = 2 };
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int mode;
|
||||||
|
int type;
|
||||||
|
int snap;
|
||||||
|
/*
|
||||||
|
* Selection variables:
|
||||||
|
* nb – normalized coordinates of the beginning of the selection
|
||||||
|
* ne – normalized coordinates of the end of the selection
|
||||||
|
* ob – original coordinates of the beginning of the selection
|
||||||
|
* oe – original coordinates of the end of the selection
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
int x, y;
|
||||||
|
} nb, ne, ob, oe;
|
||||||
|
|
||||||
|
int alt;
|
||||||
|
} Selection;
|
||||||
|
|
||||||
|
void selinit(void);
|
||||||
|
void selstart(int, int, int);
|
||||||
|
void selnormalize();
|
||||||
|
void selscroll(int, int);
|
||||||
|
void selsnap(int *, int *, int);
|
||||||
|
void selclear(void);
|
||||||
|
|
||||||
|
// Global variable for now
|
||||||
|
static Selection sel;
|
||||||
|
|
||||||
|
#endif
|
86
src/st/st.c
86
src/st/st.c
|
@ -17,10 +17,11 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#include "utf8.h"
|
|
||||||
#include "../win.h"
|
#include "../win.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
#include "selection.h"
|
||||||
#include "st.h"
|
#include "st.h"
|
||||||
|
#include "utf8.h"
|
||||||
|
|
||||||
#if defined(__linux)
|
#if defined(__linux)
|
||||||
#include <pty.h>
|
#include <pty.h>
|
||||||
|
@ -88,24 +89,6 @@ typedef struct {
|
||||||
char state;
|
char state;
|
||||||
} TCursor;
|
} TCursor;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int mode;
|
|
||||||
int type;
|
|
||||||
int snap;
|
|
||||||
/*
|
|
||||||
* Selection variables:
|
|
||||||
* nb – normalized coordinates of the beginning of the selection
|
|
||||||
* ne – normalized coordinates of the end of the selection
|
|
||||||
* ob – original coordinates of the beginning of the selection
|
|
||||||
* oe – original coordinates of the end of the selection
|
|
||||||
*/
|
|
||||||
struct {
|
|
||||||
int x, y;
|
|
||||||
} nb, ne, ob, oe;
|
|
||||||
|
|
||||||
int alt;
|
|
||||||
} Selection;
|
|
||||||
|
|
||||||
/* Internal representation of the screen */
|
/* Internal representation of the screen */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int row; /* nb row */
|
int row; /* nb row */
|
||||||
|
@ -200,11 +183,6 @@ static void tstrsequence(uchar);
|
||||||
|
|
||||||
static void drawregion(int, int, int, int);
|
static void drawregion(int, int, int, int);
|
||||||
|
|
||||||
static void selnormalize(void);
|
|
||||||
static void selscroll(int, int);
|
|
||||||
static void selsnap(int *, int *, int);
|
|
||||||
|
|
||||||
|
|
||||||
static char *base64dec(const char *);
|
static char *base64dec(const char *);
|
||||||
static char base64dec_getc(const char **);
|
static char base64dec_getc(const char **);
|
||||||
|
|
||||||
|
@ -212,7 +190,6 @@ static ssize_t xwrite(int, const char *, size_t);
|
||||||
|
|
||||||
/* Globals */
|
/* Globals */
|
||||||
static Term term;
|
static Term term;
|
||||||
static Selection sel;
|
|
||||||
static CSIEscape csiescseq;
|
static CSIEscape csiescseq;
|
||||||
static STREscape strescseq;
|
static STREscape strescseq;
|
||||||
static int iofd = 1;
|
static int iofd = 1;
|
||||||
|
@ -340,12 +317,6 @@ char *base64dec(const char *src) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void selinit(void) {
|
|
||||||
sel.mode = SEL_IDLE;
|
|
||||||
sel.snap = 0;
|
|
||||||
sel.ob.x = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tlinelen(int y) {
|
int tlinelen(int y) {
|
||||||
int i = term.col;
|
int i = term.col;
|
||||||
|
|
||||||
|
@ -401,32 +372,6 @@ void selextend(int col, int row, int type, int done) {
|
||||||
sel.mode = done ? SEL_IDLE : SEL_READY;
|
sel.mode = done ? SEL_IDLE : SEL_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
void selnormalize(void) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (sel.type == SEL_REGULAR && sel.ob.y != sel.oe.y) {
|
|
||||||
sel.nb.x = sel.ob.y < sel.oe.y ? sel.ob.x : sel.oe.x;
|
|
||||||
sel.ne.x = sel.ob.y < sel.oe.y ? sel.oe.x : sel.ob.x;
|
|
||||||
} else {
|
|
||||||
sel.nb.x = MIN(sel.ob.x, sel.oe.x);
|
|
||||||
sel.ne.x = MAX(sel.ob.x, sel.oe.x);
|
|
||||||
}
|
|
||||||
sel.nb.y = MIN(sel.ob.y, sel.oe.y);
|
|
||||||
sel.ne.y = MAX(sel.ob.y, sel.oe.y);
|
|
||||||
|
|
||||||
selsnap(&sel.nb.x, &sel.nb.y, -1);
|
|
||||||
selsnap(&sel.ne.x, &sel.ne.y, +1);
|
|
||||||
|
|
||||||
/* expand selection over line breaks */
|
|
||||||
if (sel.type == SEL_RECTANGULAR)
|
|
||||||
return;
|
|
||||||
i = tlinelen(sel.nb.y);
|
|
||||||
if (i < sel.nb.x)
|
|
||||||
sel.nb.x = i;
|
|
||||||
if (tlinelen(sel.ne.y) <= sel.ne.x)
|
|
||||||
sel.ne.x = term.col - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int selected(int x, int y) {
|
int selected(int x, int y) {
|
||||||
if (sel.mode == SEL_EMPTY || sel.ob.x == -1 ||
|
if (sel.mode == SEL_EMPTY || sel.ob.x == -1 ||
|
||||||
sel.alt != IS_SET(MODE_ALTSCREEN))
|
sel.alt != IS_SET(MODE_ALTSCREEN))
|
||||||
|
@ -561,14 +506,6 @@ char *getsel(void) {
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
void selclear(void) {
|
|
||||||
if (sel.ob.x == -1)
|
|
||||||
return;
|
|
||||||
sel.mode = SEL_IDLE;
|
|
||||||
sel.ob.x = -1;
|
|
||||||
tsetdirt(sel.nb.y, sel.ne.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void die(const char *errstr, ...) {
|
void die(const char *errstr, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
|
@ -970,25 +907,6 @@ void tscrollup(int orig, int n) {
|
||||||
selscroll(orig, -n);
|
selscroll(orig, -n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void selscroll(int orig, int n) {
|
|
||||||
if (sel.ob.x == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (BETWEEN(sel.nb.y, orig, term.bot) !=
|
|
||||||
BETWEEN(sel.ne.y, orig, term.bot)) {
|
|
||||||
selclear();
|
|
||||||
} else if (BETWEEN(sel.nb.y, orig, term.bot)) {
|
|
||||||
sel.ob.y += n;
|
|
||||||
sel.oe.y += n;
|
|
||||||
if (sel.ob.y < term.top || sel.ob.y > term.bot || sel.oe.y < term.top ||
|
|
||||||
sel.oe.y > term.bot) {
|
|
||||||
selclear();
|
|
||||||
} else {
|
|
||||||
selnormalize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void tnewline(int first_col) {
|
void tnewline(int first_col) {
|
||||||
int y = term.c.y;
|
int y = term.c.y;
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,6 @@ enum glyph_attribute {
|
||||||
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
|
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum selection_mode { SEL_IDLE = 0, SEL_EMPTY = 1, SEL_READY = 2 };
|
|
||||||
|
|
||||||
enum selection_type { SEL_REGULAR = 1, SEL_RECTANGULAR = 2 };
|
|
||||||
|
|
||||||
enum selection_snap { SNAP_WORD = 1, SNAP_LINE = 2 };
|
|
||||||
|
|
||||||
|
|
||||||
#define Glyph Glyph_
|
#define Glyph Glyph_
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Rune u; /* character code */
|
Rune u; /* character code */
|
||||||
|
|
|
@ -64,7 +64,7 @@ Rune utf8decodebyte(char p_char, size_t *p_i) {
|
||||||
*
|
*
|
||||||
* @param p_rune rune to encode
|
* @param p_rune rune to encode
|
||||||
* @param p_char char array to encode to
|
* @param p_char char array to encode to
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
size_t utf8encode(Rune p_rune, char *p_char) {
|
size_t utf8encode(Rune p_rune, char *p_char) {
|
||||||
size_t len, i;
|
size_t len, i;
|
||||||
|
@ -88,14 +88,16 @@ char utf8encodebyte(Rune u, size_t i) { return utfbyte[i] | (u & ~utfmask[i]); }
|
||||||
* Check if a given rune is a valid UTF-8 rune
|
* Check if a given rune is a valid UTF-8 rune
|
||||||
*
|
*
|
||||||
* @param p_rune rune to validate
|
* @param p_rune rune to validate
|
||||||
* @param i
|
* @param i
|
||||||
*/
|
*/
|
||||||
size_t utf8validate(Rune *p_rune, size_t i) {
|
size_t utf8validate(Rune *p_rune, size_t i) {
|
||||||
if (!BETWEEN(*p_rune, utfmin[i], utfmax[i]) || BETWEEN(*p_rune, 0xD800, 0xDFFF))
|
if (!BETWEEN(*p_rune, utfmin[i], utfmax[i]) ||
|
||||||
|
BETWEEN(*p_rune, 0xD800, 0xDFFF))
|
||||||
*p_rune = UTF_INVALID;
|
*p_rune = UTF_INVALID;
|
||||||
|
|
||||||
// Count up i until you find a utfmax entry that's greater than *p_rune
|
// Count up i until you find a utfmax entry that's greater than *p_rune
|
||||||
for (i = 1; *p_rune > utfmax[i]; ++i);
|
for (i = 1; *p_rune > utfmax[i]; ++i)
|
||||||
|
;
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#ifndef UTF8_H
|
#ifndef UTF8_H
|
||||||
#define UTF8_H
|
#define UTF8_H
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define UTF_INVALID 0xFFFD
|
#define UTF_INVALID 0xFFFD
|
||||||
#define UTF_SIZE 4
|
#define UTF_SIZE 4
|
||||||
|
|
Reference in New Issue