From 7f6a4f4b6bc5c66898efe2ccb588d0aa1e74c525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 16 Jul 2019 10:34:08 +0200 Subject: [PATCH] csi: implement FocusIn/Out events --- csi.c | 8 ++++++++ input.c | 2 ++ terminal.c | 16 ++++++++++++++++ terminal.h | 3 +++ 4 files changed, 29 insertions(+) diff --git a/csi.c b/csi.c index 9192c2bb..fe4c0b1d 100644 --- a/csi.c +++ b/csi.c @@ -672,6 +672,10 @@ csi_dispatch(struct terminal *term, uint8_t final) term->mouse_tracking = MOUSE_MOTION; break; + case 1004: + term->focus_events = true; + break; + case 1005: LOG_WARN("unimplemented: UTF-8 mouse"); /* term->mouse_reporting = MOUSE_UTF8; */ @@ -751,6 +755,10 @@ csi_dispatch(struct terminal *term, uint8_t final) term->mouse_tracking = MOUSE_NONE; break; + case 1004: + term->focus_events = false; + break; + case 1049: if (term->grid == &term->alt) { term->grid = &term->normal; diff --git a/input.c b/input.c index 5bb93132..a50f76cf 100644 --- a/input.c +++ b/input.c @@ -65,6 +65,7 @@ keyboard_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, wl_array_for_each(key, keys) xkb_state_update_key(xkb_state, *key, 1); #endif + term_focus_in((struct terminal *)data); } static void @@ -72,6 +73,7 @@ keyboard_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface) { struct terminal *term = data; + term_focus_out(term); mtx_lock(&term->kbd.repeat.mutex); if (term->kbd.repeat.cmd != REPEAT_EXIT) { diff --git a/terminal.c b/terminal.c index b7c7cf69..5e0f625f 100644 --- a/terminal.c +++ b/terminal.c @@ -267,6 +267,22 @@ term_reverse_index(struct terminal *term) term_cursor_up(term, 1); } +void +term_focus_in(struct terminal *term) +{ + if (!term->focus_events) + return; + vt_to_slave(term, "\033[I", 3); +} + +void +term_focus_out(struct terminal *term) +{ + if (!term->focus_events) + return; + vt_to_slave(term, "\033[O", 3); +} + static int linux_mouse_button_to_x(int button) { diff --git a/terminal.h b/terminal.h index 9af18d7e..b2aaee67 100644 --- a/terminal.h +++ b/terminal.h @@ -216,6 +216,7 @@ struct terminal { bool auto_margin; bool insert_mode; bool bracketed_paste; + bool focus_events; enum mouse_tracking mouse_tracking; enum mouse_reporting mouse_reporting; @@ -296,6 +297,8 @@ void term_scroll_reverse_partial( void term_linefeed(struct terminal *term); void term_reverse_index(struct terminal *term); +void term_focus_in(struct terminal *term); +void term_focus_out(struct terminal *term); void term_mouse_down(struct terminal *term, int button, int row, int col, bool shift, bool alt, bool ctrl); void term_mouse_up(struct terminal *term, int button, int row, int col,