summaryrefslogtreecommitdiffstats
path: root/server.c
diff options
context:
space:
mode:
authornicm <nicm>2015-06-04 11:43:51 +0000
committernicm <nicm>2015-06-04 11:43:51 +0000
commita863834574ec02b87ff0e7245ef31f0d4543ab34 (patch)
tree4fe2aa4fe98c34bb0d56e5032460889b70dfc317 /server.c
parenta3edfd9e84f4f8e9b74425cdc4b00fe9cb3d0ba6 (diff)
Add support for a single "marked pane". There is one marked pane in the
server at a time; it may be toggled or cleared with select-pane -m and -M (the border is highlighted). A new target '~' or '{marked}' specifies the marked pane to commands and it is the default target for the swap-pane and join-pane -s flag (this makes them much simpler to use - mark the source pane and then change to the target pane to run swapp or joinp).
Diffstat (limited to 'server.c')
-rw-r--r--server.c92
1 files changed, 79 insertions, 13 deletions
diff --git a/server.c b/server.c
index b53648f0..52fdb0c3 100644
--- a/server.c
+++ b/server.c
@@ -50,19 +50,85 @@ int server_shutdown;
struct event server_ev_accept;
struct event server_ev_second;
-int server_create_socket(void);
-void server_loop(void);
-int server_should_shutdown(void);
-void server_send_shutdown(void);
-void server_clean_dead(void);
-void server_accept_callback(int, short, void *);
-void server_signal_callback(int, short, void *);
-void server_child_signal(void);
-void server_child_exited(pid_t, int);
-void server_child_stopped(pid_t, int);
-void server_second_callback(int, short, void *);
-void server_lock_server(void);
-void server_lock_sessions(void);
+struct session *marked_session;
+struct winlink *marked_winlink;
+struct window *marked_window;
+struct window_pane *marked_window_pane;
+struct layout_cell *marked_layout_cell;
+
+int server_create_socket(void);
+void server_loop(void);
+int server_should_shutdown(void);
+void server_send_shutdown(void);
+void server_clean_dead(void);
+void server_accept_callback(int, short, void *);
+void server_signal_callback(int, short, void *);
+void server_child_signal(void);
+void server_child_exited(pid_t, int);
+void server_child_stopped(pid_t, int);
+void server_second_callback(int, short, void *);
+void server_lock_server(void);
+void server_lock_sessions(void);
+
+/* Set marked pane. */
+void
+server_set_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
+{
+ marked_session = s;
+ marked_winlink = wl;
+ marked_window = wl->window;
+ marked_window_pane = wp;
+ marked_layout_cell = wp->layout_cell;
+}
+
+/* Clear marked pane. */
+void
+server_clear_marked(void)
+{
+ marked_session = NULL;
+ marked_winlink = NULL;
+ marked_window = NULL;
+ marked_window_pane = NULL;
+ marked_layout_cell = NULL;
+}
+
+/* Is this the marked pane? */
+int
+server_is_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
+{
+ if (s == NULL || wl == NULL || wp == NULL)
+ return (0);
+ if (marked_session != s || marked_winlink != wl)
+ return (0);
+ if (marked_window_pane != wp)
+ return (0);
+ return (server_check_marked());
+}
+
+/* Check if the marked pane is still valid. */
+int
+server_check_marked(void)
+{
+ struct winlink *wl;
+
+ if (marked_window_pane == NULL)
+ return (0);
+ if (marked_layout_cell != marked_window_pane->layout_cell)
+ return (0);
+
+ if (!session_alive(marked_session))
+ return (0);
+ RB_FOREACH(wl, winlinks, &marked_session->windows) {
+ if (wl->window == marked_window && wl == marked_winlink)
+ break;
+ }
+ if (wl == NULL)
+ return (0);
+
+ if (!window_has_pane(marked_window, marked_window_pane))
+ return (0);
+ return (window_pane_visible(marked_window_pane));
+}
/* Create server socket. */
int