aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2015-08-06 08:24:14 -0400
committerDrew DeVault <sir@cmpwn.com>2015-08-06 08:24:14 -0400
commit82bc36c6812b24fca27c2ec176e2c2998e4df6d5 (patch)
treee43f61300ecb8f868bf9e40e43bdbd60bf02ecfb
parent47b28bd335fe279df35f746d5797a1071cb4b989 (diff)
Start to build out window management functions
-rw-r--r--sway/handlers.c32
-rw-r--r--sway/handlers.h15
-rw-r--r--sway/layout.c10
-rw-r--r--sway/layout.h14
-rw-r--r--sway/main.c15
5 files changed, 85 insertions, 1 deletions
diff --git a/sway/handlers.c b/sway/handlers.c
new file mode 100644
index 00000000..d6d30b71
--- /dev/null
+++ b/sway/handlers.c
@@ -0,0 +1,32 @@
+#include <stdlib.h>
+#include <stdbool.h>
+#include <wlc/wlc.h>
+#include "layout.h"
+#include "handlers.h"
+
+bool handle_output_created(wlc_handle output) {
+ return true;
+}
+
+void handle_output_destroyed(wlc_handle output) {
+}
+
+void handle_output_resolution_change(wlc_handle output, const struct wlc_size *from, const struct wlc_size *to) {
+}
+
+bool handle_view_created(wlc_handle view) {
+ printf("View created, focusing");
+ wlc_view_focus(view);
+ wlc_view_bring_to_front(view);
+ return true;
+}
+
+void handle_view_destroyed(wlc_handle view) {
+ printf("View destroyed");
+ wlc_view_focus(get_topmost(wlc_view_get_output(view), 0));
+ return true;
+}
+
+void handle_view_focus(wlc_handle view, bool focus) {
+ wlc_view_set_state(view, WLC_BIT_ACTIVATED, focus);
+}
diff --git a/sway/handlers.h b/sway/handlers.h
new file mode 100644
index 00000000..36496fb7
--- /dev/null
+++ b/sway/handlers.h
@@ -0,0 +1,15 @@
+#ifndef _SWAY_HANDLERS_H
+#define _SWAY_HANDLERS_H
+
+#include <stdbool.h>
+#include <wlc/wlc.h>
+
+bool handle_output_created(wlc_handle output);
+void handle_output_destroyed(wlc_handle output);
+void handle_output_resolution_change(wlc_handle output, const struct wlc_size *from, const struct wlc_size *to);
+
+bool handle_view_created(wlc_handle view);
+void handle_view_destroyed(wlc_handle view);
+void handle_view_focus(wlc_handle view, bool focus);
+
+#endif
diff --git a/sway/layout.c b/sway/layout.c
new file mode 100644
index 00000000..aeb8167e
--- /dev/null
+++ b/sway/layout.c
@@ -0,0 +1,10 @@
+#include <stdlib.h>
+#include <stdbool.h>
+#include <wlc/wlc.h>
+#include "layout.h"
+
+wlc_handle get_topmost(wlc_handle output, size_t offset) {
+ size_t memb;
+ const wlc_handle *views = wlc_output_get_views(output, &memb);
+ return (memb > 0 ? views[(memb - 1 + offset) % memb] : 0);
+}
diff --git a/sway/layout.h b/sway/layout.h
new file mode 100644
index 00000000..a6fb35a7
--- /dev/null
+++ b/sway/layout.h
@@ -0,0 +1,14 @@
+#ifndef _SWAY_LAYOUT_H
+#define _SWAY_LAYOUT_H
+
+#include <wlc/wlc.h>
+#include "list.h"
+
+struct sway_container {
+ wlc_handle output; // May be NULL
+ list_t children;
+};
+
+wlc_handle get_topmost(wlc_handle output, size_t offset);
+
+#endif
diff --git a/sway/main.c b/sway/main.c
index 9b19a2f0..303d2776 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -3,6 +3,7 @@
#include <stdbool.h>
#include <wlc/wlc.h>
#include "config.h"
+#include "handlers.h"
struct sway_config *config;
@@ -27,7 +28,19 @@ void load_config() {
int main(int argc, char **argv) {
load_config();
- static struct wlc_interface interface = { };
+ static struct wlc_interface interface = {
+ .output = {
+ .created = handle_output_created,
+ .destroyed = handle_output_destroyed,
+ .resolution = handle_output_resolution_change
+ },
+ .view = {
+ .created = handle_view_created,
+ .destroyed = handle_view_destroyed,
+ .focus = handle_view_focus
+ }
+ };
+
if (!wlc_init(&interface, argc, argv)) {
return 1;
}