Allow changing of X selection for snarf buffer exchange. - sam - An updated version of the sam text editor.
(HTM) git clone git://vernunftzentrum.de/sam.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit 86273326e9dec50a3c9ced2c9bfe5d81d2e89a84
(DIR) parent a8f72dc47ba63b3cf220a751e282f2e1db9309e5
(HTM) Author: Rob King <jking@deadpixi.com>
Date: Fri, 9 Dec 2016 11:27:44 -0600
Allow changing of X selection for snarf buffer exchange.
Diffstat:
doc/samrc.5 | 17 +++++++++++++++++
libXg/gwin.c | 6 ++++--
libXg/xtbinit.c | 3 +++
samterm/main.c | 11 +++++------
samterm/samrc.c | 17 +++++++++++++++++
5 files changed, 46 insertions(+), 8 deletions(-)
---
(DIR) diff --git a/doc/samrc.5 b/doc/samrc.5
@@ -201,6 +201,20 @@ or
If
.Dq true ","
then tabs will be automatically expanded.
+.It snarfselection
+Indicates which X selection should be exchanged with
+.Nm
+upon execution of the
+.Em exchange
+command
+.Pq "either via the menu item or key binding" "."
+The forms are:
+.Bd -literal
+
+ snarfselection primary
+ snarfselection secondary
+ snarfselection clipboard
+.Ed
.El
.Ss Defaults
The default keybindings and mouse chords are those documented in
@@ -209,6 +223,9 @@ The default foreground and border color is black,
and the default background color is white.
Tabs are not expanded by default,
and tabstops are set at every eight characters.
+The default X selection is
+.Do primary
+.Dc "."
.Ss "Modifier Keys"
The
.Em bind
(DIR) diff --git a/libXg/gwin.c b/libXg/gwin.c
@@ -11,6 +11,8 @@
#include "GwinP.h"
#include "libgint.h"
+Atom clipselection = XA_PRIMARY;
+
/* Forward declarations */
static void Realize(Widget, XtValueMask *, XSetWindowAttributes *);
static void Resize(Widget);
@@ -582,7 +584,7 @@ SelectSwap(Widget w, String s)
XtFree(gw->gwin.selection);
gw->gwin.selection = NULL;
}
- XtGetSelectionValue(w, XA_PRIMARY, XInternAtom(_dpy, "UTF8_STRING", 0), SelCallback, 0,
+ XtGetSelectionValue(w, clipselection, XInternAtom(_dpy, "UTF8_STRING", 0), SelCallback, 0,
XtLastTimestampProcessed(XtDisplay(w)));
while(gw->gwin.selection == NULL)
@@ -591,7 +593,7 @@ SelectSwap(Widget w, String s)
gw->gwin.selection = XtMalloc(strlen(s)+1);
strcpy(gw->gwin.selection, s);
- XtOwnSelection(w, XA_PRIMARY, XtLastTimestampProcessed(XtDisplay(w)),
+ XtOwnSelection(w, clipselection, XtLastTimestampProcessed(XtDisplay(w)),
SendSel, NULL, NULL);
return ans;
(DIR) diff --git a/libXg/xtbinit.c b/libXg/xtbinit.c
@@ -59,6 +59,7 @@ int _ld2d[6] = { 1, 2, 4, 8, 16, 24 };
uint64_t _ld2dmask[6] = { 0x1, 0x3, 0xF, 0xFF, 0xFFFF, 0x00FFFFFF };
Colormap _libg_cmap;
int _cmap_installed;
+Atom XA_CLIPBOARD;
/* xbinit implementation globals */
static XtAppContext app;
@@ -194,6 +195,8 @@ xtbinit(Errfunc f, char *class, int *pargc, char **argv, char **fallbacks)
_bgpixel = _bgpixels[0];
+ XA_CLIPBOARD = XInternAtom(_dpy, "CLIPBOARD", 0);
+
n = 0;
XtSetArg(args[n], XtNcomposeMod, &compose); n++;
XtGetValues(widg, args, n);
(DIR) diff --git a/samterm/main.c b/samterm/main.c
@@ -49,12 +49,6 @@ main(int argc, char *argv[])
else
snprintf(rcpath, PATH_MAX, "%s/.samrc", getenv("HOME") ? getenv("HOME") : ".");
- rc = fopen(rcpath, "r");
- if (rc){
- loadrcfile(rc);
- fclose(rc);
- }
-
while ((opt = getopt(argc, argv, "efr:")) != -1){
switch (opt){
case 'r':
@@ -72,6 +66,11 @@ main(int argc, char *argv[])
}
getscreen(argc, argv);
+ rc = fopen(rcpath, "r");
+ if (rc){
+ loadrcfile(rc);
+ fclose(rc);
+ }
initio();
scratch = alloc(100*RUNESIZE);
nscralloc = 100;
(DIR) diff --git a/samterm/samrc.c b/samterm/samrc.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include <strings.h>
+#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/keysym.h>
@@ -13,6 +14,7 @@
extern int expandtabs;
extern int tabwidth;
+extern Atom XA_CLIPBOARD;
typedef struct Namemapping Namemapping;
struct Namemapping{
@@ -233,6 +235,20 @@ nametokeysym(const char *n)
}
static int
+dirsnarfselection(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5)
+{
+ extern Atom clipselection;
+ Namemapping selmapping[] ={
+ {"primary", XA_PRIMARY},
+ {"secondary", XA_SECONDARY},
+ {"clipboard", XA_CLIPBOARD},
+ {NULL, 0}
+ };
+ clipselection = lookupmapping(s1, selmapping);
+ return clipselection >= 0? 0 : -1;
+}
+
+static int
dirchord(const char *s1, const char *s2, const char *s3, const char *s4, const char *s5)
{
return installchord(buttontomask(s1), buttontomask(s2), nametocommand(s3), nametotarget(s4), s5);
@@ -359,6 +375,7 @@ Directive directives[] ={
{" font %1023[^\n]", 1, dirfont},
{" tabs %2[0-9]", 1, dirtabs},
{" expandtabs %99s", 1, direxpandtabs},
+ {" snarfselection %99s", 1, dirsnarfselection},
{" %1[#]", 1, dircomment},
{" %1[^ ]", EOF, dircomment},
{NULL, 0, NULL}