aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2015-06-04 12:59:41 +0100
committerThomas Adam <thomas@xteddy.org>2015-06-04 12:59:41 +0100
commit02e348c069b9f49b44344281276b81fe537b3c8b (patch)
tree889ef55ab3da4ba5e3a8fe6aa7c3cb5708cdd724 /server.c
parent1de74e27e535b3e294c265974973a7743c8374a0 (diff)
parenta863834574ec02b87ff0e7245ef31f0d4543ab34 (diff)
downloadrtmux-02e348c069b9f49b44344281276b81fe537b3c8b.tar.gz
rtmux-02e348c069b9f49b44344281276b81fe537b3c8b.tar.bz2
rtmux-02e348c069b9f49b44344281276b81fe537b3c8b.zip
Merge branch 'obsd-master'
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 4149aa14..239414bc 100644
--- a/server.c
+++ b/server.c
@@ -49,19 +49,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