summaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/src/input.c b/src/input.c
index 0e1a5f9..4d82017 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1,5 +1,8 @@
+#include <fcntl.h>
#include <linux/input-event-codes.h>
+#include <unistd.h>
#include "input.h"
+#include "log.h"
#include "nelem.h"
#include "tofi.h"
#include "unicode.h"
@@ -9,10 +12,10 @@ static void add_character(struct tofi *tofi, xkb_keycode_t keycode);
static void delete_character(struct tofi *tofi);
static void delete_word(struct tofi *tofi);
static void clear_input(struct tofi *tofi);
+static void paste(struct tofi *tofi);
static void select_previous_result(struct tofi *tofi);
static void select_next_result(struct tofi *tofi);
static void reset_selection(struct tofi *tofi);
-static void refresh_results(struct tofi *tofi);
void input_handle_keypress(struct tofi *tofi, xkb_keycode_t keycode)
{
@@ -50,6 +53,14 @@ void input_handle_keypress(struct tofi *tofi, xkb_keycode_t keycode)
)
{
clear_input(tofi);
+ } else if (key == KEY_V
+ && xkb_state_mod_name_is_active(
+ tofi->xkb_state,
+ XKB_MOD_NAME_CTRL,
+ XKB_STATE_MODS_EFFECTIVE)
+ )
+ {
+ paste(tofi);
} else if (sym == XKB_KEY_Up || sym == XKB_KEY_Left || sym == XKB_KEY_ISO_Left_Tab
|| (key == KEY_K
&& xkb_state_mod_name_is_active(
@@ -130,7 +141,7 @@ void add_character(struct tofi *tofi, xkb_keycode_t keycode)
reset_selection(tofi);
}
-void refresh_results(struct tofi *tofi)
+void input_refresh_results(struct tofi *tofi)
{
struct entry *entry = &tofi->window.entry;
@@ -164,7 +175,7 @@ void delete_character(struct tofi *tofi)
entry->input_utf32_length--;
entry->input_utf32[entry->input_utf32_length] = U'\0';
- refresh_results(tofi);
+ input_refresh_results(tofi);
}
void delete_word(struct tofi *tofi)
@@ -184,7 +195,7 @@ void delete_word(struct tofi *tofi)
}
entry->input_utf32[entry->input_utf32_length] = U'\0';
- refresh_results(tofi);
+ input_refresh_results(tofi);
}
void clear_input(struct tofi *tofi)
@@ -194,7 +205,30 @@ void clear_input(struct tofi *tofi)
entry->input_utf32_length = 0;
entry->input_utf32[0] = U'\0';
- refresh_results(tofi);
+ input_refresh_results(tofi);
+}
+
+void paste(struct tofi *tofi)
+{
+ if (tofi->clipboard.wl_data_offer == NULL || tofi->clipboard.mime_type == NULL) {
+ return;
+ }
+
+ /*
+ * Create a pipe, and give the write end to the compositor to give to
+ * the clipboard manager.
+ */
+ errno = 0;
+ int fildes[2];
+ if (pipe2(fildes, O_CLOEXEC | O_NONBLOCK) == -1) {
+ log_error("Failed to open pipe for clipboard: %s\n", strerror(errno));
+ return;
+ }
+ wl_data_offer_receive(tofi->clipboard.wl_data_offer, tofi->clipboard.mime_type, fildes[1]);
+ close(fildes[1]);
+
+ /* Keep the read end for reading in the main loop. */
+ tofi->clipboard.fd = fildes[0];
}
void select_previous_result(struct tofi *tofi)