Wed Nov 15 14:20:13 PST 2000 Michael Jennings <mej@eterm.org>

As requested by Chris Morton <chris.morton@ericsson.com>, I added
	support for the SunCut, SunCopy, SunPaste, and SunFront keys.  The 1st
	3 operate on the xclipboard-managed "ClipBoard" buffer.  The SunFront
	key will activate Eterm's "steal focus" mechanism.


SVN revision: 3891
This commit is contained in:
Michael Jennings 2000-11-15 22:21:02 +00:00
parent 718ea96410
commit 1bcfa73217
4 changed files with 70 additions and 9 deletions

View File

@ -3969,3 +3969,11 @@ Tue Nov 14 17:17:53 PST 2000 Michael Jennings <mej@eterm.org>
this will not work with those themes.
-------------------------------------------------------------------------------
Wed Nov 15 14:20:13 PST 2000 Michael Jennings <mej@eterm.org>
As requested by Chris Morton <chris.morton@ericsson.com>, I added
support for the SunCut, SunCopy, SunPaste, and SunFront keys. The 1st
3 operate on the xclipboard-managed "ClipBoard" buffer. The SunFront
key will activate Eterm's "steal focus" mechanism.
-------------------------------------------------------------------------------

View File

@ -2364,7 +2364,7 @@ PasteIt(unsigned char *data, unsigned int nitems)
* EXT: SelectionNotify
*/
void
selection_paste(Window win, unsigned prop, int Delete)
selection_paste(Window win, unsigned prop, int delete)
{
long nread;
unsigned long bytes_after, nitems;
@ -2375,7 +2375,7 @@ selection_paste(Window win, unsigned prop, int Delete)
if (prop == None)
return;
for (nread = 0, bytes_after = 1; bytes_after > 0;) {
if ((XGetWindowProperty(Xdisplay, win, prop, (nread / 4), PROP_SIZE, Delete, AnyPropertyType, &actual_type, &actual_fmt, &nitems, &bytes_after, &data) != Success)) {
if ((XGetWindowProperty(Xdisplay, win, prop, (nread / 4), PROP_SIZE, delete, AnyPropertyType, &actual_type, &actual_fmt, &nitems, &bytes_after, &data) != Success)) {
if (data != NULL) {
XFree(data);
}
@ -2441,6 +2441,46 @@ selection_request(Time tm, int x, int y)
}
}
void
selection_copy(Atom selection, Atom prop, char *str, size_t len)
{
XSetSelectionOwner(Xdisplay, selection, TermWin.vt, CurrentTime);
if (XGetSelectionOwner(Xdisplay, XA_PRIMARY) != TermWin.vt) {
print_error("Can't take ownership of primary selection\n");
}
XChangeProperty(Xdisplay, Xroot, prop, XA_STRING, 8, PropModeReplace, str, len);
}
void
selection_copy_to_clipboard(void)
{
if (selection.text) {
selection_copy(X_CLIPBOARD_SELECTION, X_CLIPBOARD_PROP, selection.text, selection.len);
}
}
void
selection_paste_from_clipboard(void)
{
Atom select, type;
select = X_CLIPBOARD_SELECTION;
if (XGetSelectionOwner(Xdisplay, select) == None) {
selection_paste(Xroot, X_CLIPBOARD_PROP, False);
} else {
type = XInternAtom(Xdisplay, "VT_SELECTION", False);
#if defined(MULTI_CHARSET) && defined(HAVE_X11_XMU_ATOMS_H)
if (encoding_method != LATIN1) {
XConvertSelection(Xdisplay, select, XA_COMPOUND_TEXT(Xdisplay), type, TermWin.vt, CurrentTime);
} else {
XConvertSelection(Xdisplay, select, XA_STRING, type, TermWin.vt, CurrentTime);
}
#else
XConvertSelection(Xdisplay, select, XA_STRING, type, TermWin.vt, CurrentTime);
#endif
}
}
/*
* Clear the current selection from the screen rendition list
*/
@ -2664,12 +2704,10 @@ selection_make(Time tm)
selection.text = new_selection_text;
selection.screen = current_screen;
XSetSelectionOwner(Xdisplay, XA_PRIMARY, TermWin.vt, tm);
if (XGetSelectionOwner(Xdisplay, XA_PRIMARY) != TermWin.vt)
print_error("can't get primary selection\n");
XChangeProperty(Xdisplay, Xroot, XA_CUT_BUFFER0, XA_STRING, 8,
PropModeReplace, selection.text, selection.len);
selection_copy(XA_PRIMARY, XA_CUT_BUFFER0, selection.text, selection.len);
D_SELECT(("selection.len=%d\n", selection.len));
return;
tm = 0;
}
/*

View File

@ -16,6 +16,14 @@
#include <X11/Xfuncproto.h>
#include "startup.h"
#ifdef XA_CLIPBOARD
# define X_CLIPBOARD_SELECTION XA_CLIPBOARD(Xdisplay)
# define X_CLIPBOARD_PROP XA_CLIPBOARD(Xdisplay)
#else
# define X_CLIPBOARD_SELECTION XA_PRIMARY
# define X_CLIPBOARD_PROP XA_CUT_BUFFER0
#endif
/************ Macros and Definitions ************/
#define WRAP_CHAR (MAX_COLS + 1)
#define PROP_SIZE 4096
@ -279,6 +287,9 @@ extern void selection_check(void);
extern void PasteIt(unsigned char *, unsigned int);
extern void selection_paste(Window, unsigned, int);
extern void selection_request(Time, int, int);
extern void selection_copy(Atom, Atom, char *, size_t);
extern void selection_copy_to_clipboard(void);
extern void selection_paste_from_clipboard(void);
extern void selection_reset(void);
extern void selection_clear(void);
extern void selection_setclr(int, int, int, int, int);

View File

@ -296,16 +296,20 @@ lookup_key(XEvent * ev)
}
#endif
#ifdef HAVE_X11_SUNKEYSYM_H
#if defined(HAVE_X11_SUNKEYSYM_H) && defined(HAVE_X11_XMU_ATOMS_H)
switch (keysym) {
case SunXK_Copy:
case SunXK_Cut:
selection_copy_to_clipboard();
LK_RET();
break;
case SunXK_Paste:
selection_request(ev->xkey.time, ev->xkey.x, ev->xkey.y);
selection_paste_from_clipboard();
LK_RET();
break;
case SunXK_Front:
xterm_seq(XTerm_Takeover, "");
LK_RET();
break;
default:
break;