aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2015-11-27 09:22:22 -0700
committerDrew DeVault <sir@cmpwn.com>2015-11-27 09:22:22 -0700
commit4c3467425567044b4043d034432d78d445b8c641 (patch)
treee680d1beeef8f8ff6889f863503bc3da11b10bf6
parent04bd9386fe93d596ca0af7a9895598b709088484 (diff)
parentd9770cc24381b145aeee79d104d28a4052a191a6 (diff)
Merge pull request #263 from sce/floating_enable_disable
cmd_floating: Support `enable` and `disable` commands too.
-rw-r--r--sway.5.txt4
-rw-r--r--sway/commands.c105
2 files changed, 60 insertions, 49 deletions
diff --git a/sway.5.txt b/sway.5.txt
index 8a949465..9f581a42 100644
--- a/sway.5.txt
+++ b/sway.5.txt
@@ -38,8 +38,8 @@ Commands
**exit**::
Exit sway and end your Wayland session.
-**floating** toggle::
- Toggles the "floating" status of the focused view.
+**floating** <enable|disable|toggle>::
+ Make focused view floating, non-floating, or the opposite of what it is now.
**floating_modifier** <modifier>::
When the _modifier_ key is held down, you may use left click to drag floating
diff --git a/sway/commands.c b/sway/commands.c
index c63aa320..f1dbc09e 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -306,60 +306,71 @@ static struct cmd_results *cmd_floating(int argc, char **argv) {
if ((error = checkarg(argc, "floating", EXPECTED_EQUAL_TO, 1))) {
return error;
}
+ swayc_t *view = get_focused_container(&root_container);
+ bool wants_floating;
+ if (strcasecmp(argv[0], "enable") == 0) {
+ wants_floating = true;
+ } else if (strcasecmp(argv[0], "disable") == 0) {
+ wants_floating = false;
+ } else if (strcasecmp(argv[0], "toggle") == 0) {
+ wants_floating = !view->is_floating;
+ } else {
+ return cmd_results_new(CMD_FAILURE, "floating",
+ "Expected 'floating <enable|disable|toggle>");
+ }
- if (strcasecmp(argv[0], "toggle") == 0) {
- swayc_t *view = get_focused_container(&root_container);
- // Prevent running floating commands on things like workspaces
- if (view->type != C_VIEW) {
- return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+ // Prevent running floating commands on things like workspaces
+ if (view->type != C_VIEW) {
+ return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+ }
+
+ // Change from nonfloating to floating
+ if (!view->is_floating && wants_floating) {
+ // Remove view from its current location
+ destroy_container(remove_child(view));
+
+ // and move it into workspace floating
+ add_floating(swayc_active_workspace(), view);
+ view->x = (swayc_active_workspace()->width - view->width)/2;
+ view->y = (swayc_active_workspace()->height - view->height)/2;
+ if (view->desired_width != -1) {
+ view->width = view->desired_width;
}
- // Change from nonfloating to floating
- if (!view->is_floating) {
- // Remove view from its current location
- destroy_container(remove_child(view));
+ if (view->desired_height != -1) {
+ view->height = view->desired_height;
+ }
+ arrange_windows(swayc_active_workspace(), -1, -1);
- // and move it into workspace floating
- add_floating(swayc_active_workspace(), view);
- view->x = (swayc_active_workspace()->width - view->width)/2;
- view->y = (swayc_active_workspace()->height - view->height)/2;
- if (view->desired_width != -1) {
- view->width = view->desired_width;
- }
- if (view->desired_height != -1) {
- view->height = view->desired_height;
- }
- arrange_windows(swayc_active_workspace(), -1, -1);
- } else {
- // Delete the view from the floating list and unset its is_floating flag
- // Using length-1 as the index is safe because the view must be the currently
- // focused floating output
- remove_child(view);
- view->is_floating = false;
- // Get the properly focused container, and add in the view there
- swayc_t *focused = container_under_pointer();
- // If focused is null, it's because the currently focused container is a workspace
- if (focused == NULL) {
- focused = swayc_active_workspace();
- }
- set_focused_container(focused);
+ } else if (view->is_floating && !wants_floating) {
+ // Delete the view from the floating list and unset its is_floating flag
+ // Using length-1 as the index is safe because the view must be the currently
+ // focused floating output
+ remove_child(view);
+ view->is_floating = false;
+ // Get the properly focused container, and add in the view there
+ swayc_t *focused = container_under_pointer();
+ // If focused is null, it's because the currently focused container is a workspace
+ if (focused == NULL) {
+ focused = swayc_active_workspace();
+ }
+ set_focused_container(focused);
- sway_log(L_DEBUG, "Non-floating focused container is %p", focused);
+ sway_log(L_DEBUG, "Non-floating focused container is %p", focused);
- // Case of focused workspace, just create as child of it
- if (focused->type == C_WORKSPACE) {
- add_child(focused, view);
- }
- // Regular case, create as sibling of current container
- else {
- add_sibling(focused, view);
- }
- // Refocus on the view once its been put back into the layout
- view->width = view->height = 0;
- arrange_windows(swayc_active_workspace(), -1, -1);
- remove_view_from_scratchpad(view);
+ // Case of focused workspace, just create as child of it
+ if (focused->type == C_WORKSPACE) {
+ add_child(focused, view);
}
- set_focused_container(view);
+ // Regular case, create as sibling of current container
+ else {
+ add_sibling(focused, view);
+ }
+ // Refocus on the view once its been put back into the layout
+ view->width = view->height = 0;
+ arrange_windows(swayc_active_workspace(), -1, -1);
+ remove_view_from_scratchpad(view);
}
+ set_focused_container(view);
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}