aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/qregisters.h
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2016-08-16 05:04:54 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2016-08-19 03:29:11 +0200
commit61ff6e97c57f62ee3ad4ffc2166e433bc060e7cb (patch)
tree64c032ebdd040809d1b7e822e627e199a9c2476e /src/qregisters.h
parent94b041ec331427fd63cdae3e943efe825d1bbf14 (diff)
Integrated clipboard support
* mapped to different registers beginning with "~" * on supported platforms accessing the clipboard is as easy as X~ or G~. Naturally this also allows clipboards to be pasted in string arguments/insertions (^EQ~). * Currently, Gtk+, PDCurses and ncurses/XTerm are supported. For XTerm clipboard support, users must set 0,256ED to enable it since we cannot check for XTerm window ops programmatically (at least without libX11). * When clipboard regs exist, the clipboard can also be deemed functional. This allows macros to fall back to xclip(1) if necessary. * EOL handling has been moved into a new file eol.c and eol.h. EOL translation no longer depends on GIOChannels but can be memory-backed as well.
Diffstat (limited to 'src/qregisters.h')
-rw-r--r--src/qregisters.h79
1 files changed, 78 insertions, 1 deletions
diff --git a/src/qregisters.h b/src/qregisters.h
index 563a774..22fa93d 100644
--- a/src/qregisters.h
+++ b/src/qregisters.h
@@ -135,11 +135,18 @@ public:
};
class QRegister : public RBTree::RBEntry, public QRegisterData {
+protected:
+ /**
+ * The default constructor for subclasses.
+ * This leaves the name uninitialized.
+ */
+ QRegister(void) : name(NULL) {}
+
public:
gchar *name;
QRegister(const gchar *_name)
- : QRegisterData(), name(g_strdup(_name)) {}
+ : name(g_strdup(_name)) {}
virtual
~QRegister()
{
@@ -223,6 +230,76 @@ public:
void undo_exchange_string(QRegisterData &reg);
};
+class QRegisterClipboard : public QRegister {
+ class UndoTokenSetClipboard : public UndoToken {
+ gchar *name;
+ gchar *str;
+ gsize str_len;
+
+ public:
+ /**
+ * Construct undo token.
+ *
+ * This passes ownership of the clipboard content string
+ * to the undo token object.
+ */
+ UndoTokenSetClipboard(const gchar *_name, gchar *_str, gsize _str_len)
+ : name(g_strdup(_name)), str(_str), str_len(_str_len) {}
+ ~UndoTokenSetClipboard()
+ {
+ g_free(str);
+ g_free(name);
+ }
+
+ void run(void);
+
+ gsize
+ get_size(void) const
+ {
+ return sizeof(*this) + strlen(name) + str_len;
+ }
+ };
+
+ /**
+ * Gets the clipboard name.
+ * Can be easily derived from the Q-Register name.
+ */
+ inline const gchar *
+ get_clipboard_name(void) const
+ {
+ return name+1;
+ }
+
+public:
+ QRegisterClipboard(const gchar *_name = NULL)
+ {
+ name = g_strconcat("~", _name, NIL);
+ }
+
+ void set_string(const gchar *str, gsize len);
+ void undo_set_string(void);
+
+ /*
+ * FIXME: We could support that.
+ */
+ void
+ append_string(const gchar *str, gsize len)
+ {
+ throw QRegOpUnsupportedError(name);
+ }
+ void undo_append_string(void) {}
+
+ gchar *get_string(gsize *out_len);
+ gchar *get_string(void);
+ gsize get_string_size(void);
+ gint get_character(gint pos);
+
+ void edit(void);
+
+ void exchange_string(QRegisterData &reg);
+ void undo_exchange_string(QRegisterData &reg);
+};
+
class QRegisterTable : private RBTree {
class UndoTokenRemove : public UndoTokenWithSize<UndoTokenRemove> {
QRegisterTable *table;