sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

st-iso14755-20180911-67d0cb6.diff (2326B)


      1 diff --git a/config.def.h b/config.def.h
      2 index 823e79f..82b1b09 100644
      3 --- a/config.def.h
      4 +++ b/config.def.h
      5 @@ -177,6 +177,7 @@ static Shortcut shortcuts[] = {
      6  	{ TERMMOD,              XK_V,           clippaste,      {.i =  0} },
      7  	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
      8  	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
      9 +	{ TERMMOD,              XK_I,           iso14755,       {.i =  0} },
     10  };
     11  
     12  /*
     13 diff --git a/st.1 b/st.1
     14 index e8d6059..81bceff 100644
     15 --- a/st.1
     16 +++ b/st.1
     17 @@ -159,6 +159,10 @@ Copy the selected text to the clipboard selection.
     18  .TP
     19  .B Ctrl-Shift-v
     20  Paste from the clipboard selection.
     21 +.TP
     22 +.B Ctrl-Shift-i
     23 +Launch dmenu to enter a unicode codepoint and send the corresponding glyph
     24 +to st.
     25  .SH CUSTOMIZATION
     26  .B st
     27  can be customized by creating a custom config.h and (re)compiling the source
     28 diff --git a/st.c b/st.c
     29 index 574dbee..76bb3ea 100644
     30 --- a/st.c
     31 +++ b/st.c
     32 @@ -38,11 +38,15 @@
     33  
     34  /* macros */
     35  #define IS_SET(flag)		((term.mode & (flag)) != 0)
     36 +#define NUMMAXLEN(x)		((int)(sizeof(x) * 2.56 + 0.5) + 1)
     37  #define ISCONTROLC0(c)		(BETWEEN(c, 0, 0x1f) || (c) == '\177')
     38  #define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f))
     39  #define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c))
     40  #define ISDELIM(u)		(utf8strchr(worddelimiters, u) != NULL)
     41  
     42 +/* constants */
     43 +#define ISO14755CMD		"dmenu -w \"$WINDOWID\" -p codepoint: </dev/null"
     44 +
     45  enum term_mode {
     46  	MODE_WRAP        = 1 << 0,
     47  	MODE_INSERT      = 1 << 1,
     48 @@ -1977,6 +1981,28 @@ tprinter(char *s, size_t len)
     49  	}
     50  }
     51  
     52 +void
     53 +iso14755(const Arg *arg)
     54 +{
     55 +	FILE *p;
     56 +	char *us, *e, codepoint[9], uc[UTF_SIZ];
     57 +	unsigned long utf32;
     58 +
     59 +	if (!(p = popen(ISO14755CMD, "r")))
     60 +		return;
     61 +
     62 +	us = fgets(codepoint, sizeof(codepoint), p);
     63 +	pclose(p);
     64 +
     65 +	if (!us || *us == '\0' || *us == '-' || strlen(us) > 7)
     66 +		return;
     67 +	if ((utf32 = strtoul(us, &e, 16)) == ULONG_MAX ||
     68 +	    (*e != '\n' && *e != '\0'))
     69 +		return;
     70 +
     71 +	ttywrite(uc, utf8encode(utf32, uc), 1);
     72 +}
     73 +
     74  void
     75  toggleprinter(const Arg *arg)
     76  {
     77 diff --git a/st.h b/st.h
     78 index 38c61c4..dac64d8 100644
     79 --- a/st.h
     80 +++ b/st.h
     81 @@ -80,6 +80,7 @@ void die(const char *, ...);
     82  void redraw(void);
     83  void draw(void);
     84  
     85 +void iso14755(const Arg *);
     86  void printscreen(const Arg *);
     87  void printsel(const Arg *);
     88  void sendbreak(const Arg *);