pinosaur
/
st.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Implement most ICCCM rules for selection handling.
[st.git]
/
st.c
diff --git
a/st.c
b/st.c
index
39d3fee
..
6bfa834
100644
(file)
--- a/
st.c
+++ b/
st.c
@@
-359,7
+359,7
@@
static void csidump(void);
static void csihandle(void);
static void csiparse(void);
static void csireset(void);
static void csihandle(void);
static void csiparse(void);
static void csireset(void);
-static int eschandle(uchar
ascii
);
+static int eschandle(uchar);
static void strdump(void);
static void strhandle(void);
static void strparse(void);
static void strdump(void);
static void strhandle(void);
static void strparse(void);
@@
-406,8
+406,9
@@
static void ttyread(void);
static void ttyresize(void);
static void ttysend(char *, size_t);
static void ttywrite(const char *, size_t);
static void ttyresize(void);
static void ttysend(char *, size_t);
static void ttywrite(const char *, size_t);
-static void tstrsequence(uchar
c
);
+static void tstrsequence(uchar);
+static inline ushort sixd_to_16bit(int);
static void xdraws(char *, Glyph, int, int, int, int);
static void xhints(void);
static void xclear(int, int, int, int);
static void xdraws(char *, Glyph, int, int, int, int);
static void xhints(void);
static void xclear(int, int, int, int);
@@
-418,12
+419,11
@@
static int xsetcolorname(int, const char *);
static int xgeommasktogravity(int);
static int xloadfont(Font *, FcPattern *);
static void xloadfonts(char *, double);
static int xgeommasktogravity(int);
static int xloadfont(Font *, FcPattern *);
static void xloadfonts(char *, double);
-static int xloadfontset(Font *);
static void xsettitle(char *);
static void xresettitle(void);
static void xsetpointermotion(int);
static void xseturgency(int);
static void xsettitle(char *);
static void xresettitle(void);
static void xsetpointermotion(int);
static void xseturgency(int);
-static void xsetsel(char *);
+static void xsetsel(char *
, Time
);
static void xtermclear(int, int, int, int);
static void xunloadfont(Font *);
static void xunloadfonts(void);
static void xtermclear(int, int, int, int);
static void xunloadfont(Font *);
static void xunloadfonts(void);
@@
-449,9
+449,11
@@
static void selinit(void);
static void selnormalize(void);
static inline bool selected(int, int);
static char *getsel(void);
static void selnormalize(void);
static inline bool selected(int, int);
static char *getsel(void);
-static void selcopy(
void
);
+static void selcopy(
Time
);
static void selscroll(int, int);
static void selsnap(int, int *, int *, int);
static void selscroll(int, int);
static void selsnap(int, int *, int *, int);
+static int x2col(int);
+static int y2row(int);
static void getbuttoninfo(XEvent *);
static void mousereport(XEvent *);
static void getbuttoninfo(XEvent *);
static void mousereport(XEvent *);
@@
-640,7
+642,7
@@
utf8validate(long *u, size_t i) {
return i;
}
return i;
}
-
static
void
+void
selinit(void) {
memset(&sel.tclick1, 0, sizeof(sel.tclick1));
memset(&sel.tclick2, 0, sizeof(sel.tclick2));
selinit(void) {
memset(&sel.tclick1, 0, sizeof(sel.tclick1));
memset(&sel.tclick2, 0, sizeof(sel.tclick2));
@@
-653,7
+655,7
@@
selinit(void) {
sel.xtarget = XA_STRING;
}
sel.xtarget = XA_STRING;
}
-
static
int
+int
x2col(int x) {
x -= borderpx;
x /= xw.cw;
x2col(int x) {
x -= borderpx;
x /= xw.cw;
@@
-661,7
+663,7
@@
x2col(int x) {
return LIMIT(x, 0, term.col-1);
}
return LIMIT(x, 0, term.col-1);
}
-
static
int
+int
y2row(int y) {
y -= borderpx;
y /= xw.ch;
y2row(int y) {
y -= borderpx;
y /= xw.ch;
@@
-669,7
+671,7
@@
y2row(int y) {
return LIMIT(y, 0, term.row-1);
}
return LIMIT(y, 0, term.row-1);
}
-
static
int tlinelen(int y) {
+int tlinelen(int y) {
int i = term.col;
if(term.line[y][i - 1].mode & ATTR_WRAP)
int i = term.col;
if(term.line[y][i - 1].mode & ATTR_WRAP)
@@
-681,7
+683,7
@@
static int tlinelen(int y) {
return i;
}
return i;
}
-
static
void
+void
selnormalize(void) {
int i;
selnormalize(void) {
int i;
@@
-708,7
+710,7
@@
selnormalize(void) {
sel.ne.x = term.col - 1;
}
sel.ne.x = term.col - 1;
}
-
static inline
bool
+bool
selected(int x, int y) {
if(sel.type == SEL_RECTANGULAR)
return BETWEEN(y, sel.nb.y, sel.ne.y)
selected(int x, int y) {
if(sel.type == SEL_RECTANGULAR)
return BETWEEN(y, sel.nb.y, sel.ne.y)
@@
-982,8
+984,8
@@
getsel(void) {
}
void
}
void
-selcopy(
void
) {
- xsetsel(getsel());
+selcopy(
Time t
) {
+ xsetsel(getsel()
, t
);
}
void
}
void
@@
-995,7
+997,7
@@
selnotify(XEvent *e) {
XSelectionEvent *xsev;
ofs = 0;
XSelectionEvent *xsev;
ofs = 0;
- xsev =
(XSelectionEvent *)e
;
+ xsev =
&e->xselection
;
if (xsev->property == None)
return;
do {
if (xsev->property == None)
return;
do {
@@
-1081,6
+1083,9
@@
selrequest(XEvent *e) {
xev.selection = xsre->selection;
xev.target = xsre->target;
xev.time = xsre->time;
xev.selection = xsre->selection;
xev.target = xsre->target;
xev.time = xsre->time;
+ if (xsre->property == None)
+ xsre->property = xsre->target;
+
/* reject */
xev.property = None;
/* reject */
xev.property = None;
@@
-1123,11
+1128,13
@@
selrequest(XEvent *e) {
}
void
}
void
-xsetsel(char *str) {
+xsetsel(char *str
, Time t
) {
free(sel.primary);
sel.primary = str;
free(sel.primary);
sel.primary = str;
- XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, CurrentTime);
+ XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t);
+ if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win)
+ selclear(0);
}
void
}
void
@@
-1144,7
+1151,7
@@
brelease(XEvent *e) {
selclear(NULL);
} else {
getbuttoninfo(e);
selclear(NULL);
} else {
getbuttoninfo(e);
- selcopy();
+ selcopy(
e->xbutton.time
);
}
sel.mode = 0;
tsetdirt(sel.nb.y, sel.ne.y);
}
sel.mode = 0;
tsetdirt(sel.nb.y, sel.ne.y);
@@
-2390,7
+2397,7
@@
tputtab(int n) {
for(--x; x > 0 && !term.tabs[x]; --x)
/* nothing */ ;
}
for(--x; x > 0 && !term.tabs[x]; --x)
/* nothing */ ;
}
- t
moveto(x, term.c.y
);
+ t
erm.c.x = LIMIT(x, 0, term.col-1
);
}
void
}
void
@@
-2648,7
+2655,6
@@
tputc(char *c, int len) {
c = "\357\277\275"; /* UTF_INVALID */
width = 1;
}
c = "\357\277\275"; /* UTF_INVALID */
width = 1;
}
- control = ISCONTROLC1(unicodep);
ascii = unicodep;
}
ascii = unicodep;
}
@@
-2663,7
+2669,7
@@
tputc(char *c, int len) {
* character.
*/
if(term.esc & ESC_STR) {
* character.
*/
if(term.esc & ESC_STR) {
- if(
width
== 1 &&
+ if(
len
== 1 &&
(ascii == '\a' || ascii == 030 ||
ascii == 032 || ascii == 033 ||
ISCONTROLC1(unicodep))) {
(ascii == '\a' || ascii == 030 ||
ascii == 032 || ascii == 033 ||
ISCONTROLC1(unicodep))) {
@@
-2858,7
+2864,7
@@
xresize(int col, int row) {
xclear(0, 0, xw.w, xw.h);
}
xclear(0, 0, xw.w, xw.h);
}
-
static inline
ushort
+ushort
sixd_to_16bit(int x) {
return x == 0 ? 0 : 0x3737 + 0x2828 * x;
}
sixd_to_16bit(int x) {
return x == 0 ? 0 : 0x3737 + 0x2828 * x;
}
@@
-3114,15
+3120,6
@@
xloadfonts(char *fontstr, double fontsize) {
FcPatternDestroy(pattern);
}
FcPatternDestroy(pattern);
}
-int
-xloadfontset(Font *f) {
- FcResult result;
-
- if(!(f->set = FcFontSort(0, f->pattern, FcTrue, 0, &result)))
- return 1;
- return 0;
-}
-
void
xunloadfont(Font *f) {
XftFontClose(xw.dpy, f->match);
void
xunloadfont(Font *f) {
XftFontClose(xw.dpy, f->match);
@@
-3470,7
+3467,8
@@
xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
/* Nothing was found. */
if(i >= frclen) {
if(!font->set)
/* Nothing was found. */
if(i >= frclen) {
if(!font->set)
- xloadfontset(font);
+ font->set = FcFontSort(0, font->pattern,
+ FcTrue, 0, &fcres);
fcsets[0] = font->set;
/*
fcsets[0] = font->set;
/*
@@
-3598,15
+3596,15
@@
xdrawcursor(void) {
case 4: /* Steady Underline */
XftDrawRect(xw.draw, &dc.col[defaultcs],
borderpx + curx * xw.cw,
case 4: /* Steady Underline */
XftDrawRect(xw.draw, &dc.col[defaultcs],
borderpx + curx * xw.cw,
- borderpx + (term.c.y + 1) * xw.ch -
1
,
- xw.cw,
1
);
+ borderpx + (term.c.y + 1) * xw.ch -
cursorthickness
,
+ xw.cw,
cursorthickness
);
break;
case 5: /* Blinking bar */
case 6: /* Steady bar */
XftDrawRect(xw.draw, &dc.col[defaultcs],
break;
case 5: /* Blinking bar */
case 6: /* Steady bar */
XftDrawRect(xw.draw, &dc.col[defaultcs],
-
borderpx + curx * xw.cw,
-
borderpx + term.c.y * xw.ch,
-
1
, xw.ch);
+ borderpx + curx * xw.cw,
+ borderpx + term.c.y * xw.ch,
+
cursorthickness
, xw.ch);
break;
}
} else {
break;
}
} else {
@@
-3773,7
+3771,7
@@
focus(XEvent *ev) {
}
}
}
}
-
static inline
bool
+bool
match(uint mask, uint state) {
return mask == XK_ANY_MOD || mask == (state & ~ignoremod);
}
match(uint mask, uint state) {
return mask == XK_ANY_MOD || mask == (state & ~ignoremod);
}
@@
-4079,7
+4077,7
@@
main(int argc, char *argv[]) {
run:
setlocale(LC_CTYPE, "");
XSetLocaleModifiers("");
run:
setlocale(LC_CTYPE, "");
XSetLocaleModifiers("");
- tnew(
cols? cols : 1, rows? rows : 1
);
+ tnew(
MAX(cols, 1), MAX(rows, 1)
);
xinit();
selinit();
run();
xinit();
selinit();
run();