move_container_to fixup

This commit is contained in:
taiyu 2015-08-26 11:01:26 -07:00
parent c4257055eb
commit 1fa7a91bfb
7 changed files with 45 additions and 19 deletions

View file

@ -101,6 +101,7 @@ swayc_t *swayc_active_workspace_for(swayc_t *view);
// Container information // Container information
bool swayc_is_fullscreen(swayc_t *view); bool swayc_is_fullscreen(swayc_t *view);
bool swayc_is_active(swayc_t *view);
// Mapping functions // Mapping functions
@ -110,7 +111,6 @@ void container_map(swayc_t *, void (*f)(swayc_t *, void *), void *);
void set_view_visibility(swayc_t *view, void *data); void set_view_visibility(swayc_t *view, void *data);
void reset_gaps(swayc_t *view, void *data); void reset_gaps(swayc_t *view, void *data);
void update_visibility(swayc_t *container); void update_visibility(swayc_t *container);
#endif #endif

View file

@ -15,7 +15,11 @@ void sway_log_colors(int mode);
void sway_log(log_importance_t verbosity, const char* format, ...) __attribute__((format(printf,2,3))); void sway_log(log_importance_t verbosity, const char* format, ...) __attribute__((format(printf,2,3)));
void sway_log_errno(log_importance_t verbosity, char* format, ...) __attribute__((format(printf,2,3))); void sway_log_errno(log_importance_t verbosity, char* format, ...) __attribute__((format(printf,2,3)));
void sway_abort(const char* format, ...) __attribute__((format(printf,1,2))); void sway_abort(const char* format, ...) __attribute__((format(printf,1,2)));
bool sway_assert(bool condition, const char* format, ...) __attribute__((format(printf,2,3)));
bool _sway_assert(bool condition, const char* format, ...) __attribute__((format(printf,2,3)));
#define sway_assert(COND, FMT, ...) \
_sway_assert(COND, "%s:" FMT, __PRETTY_FUNCTION__, ##__VA_ARGS__)
void error_handler(int sig); void error_handler(int sig);
void layout_log(const swayc_t *c, int depth); void layout_log(const swayc_t *c, int depth);

View file

@ -380,7 +380,7 @@ static bool cmd_move(struct sway_config *config, int argc, char **argv) {
if (ws == NULL) { if (ws == NULL) {
ws = workspace_create(ws_name); ws = workspace_create(ws_name);
} }
move_container_to(view, ws); move_container_to(view, get_focused_container(ws));
} else { } else {
return false; return false;
} }

View file

@ -9,7 +9,7 @@
#include "log.h" #include "log.h"
#define ASSERT_NONNULL(PTR) \ #define ASSERT_NONNULL(PTR) \
sway_assert (PTR, "%s: " #PTR "must be non-null", __func__) sway_assert (PTR, #PTR "must be non-null")
static swayc_t *new_swayc(enum swayc_types type) { static swayc_t *new_swayc(enum swayc_types type) {
swayc_t *c = calloc(1, sizeof(swayc_t)); swayc_t *c = calloc(1, sizeof(swayc_t));
@ -305,7 +305,7 @@ swayc_t *destroy_workspace(swayc_t *workspace) {
// Do not destroy if there are children // Do not destroy if there are children
if (workspace->children->length == 0 && workspace->floating->length == 0) { if (workspace->children->length == 0 && workspace->floating->length == 0) {
sway_log(L_DEBUG, "%s: '%s'", __func__, workspace->name); sway_log(L_DEBUG, "'%s'", workspace->name);
swayc_t *parent = workspace->parent; swayc_t *parent = workspace->parent;
free_swayc(workspace); free_swayc(workspace);
return parent; return parent;
@ -376,7 +376,7 @@ swayc_t *swayc_parent_by_type(swayc_t *container, enum swayc_types type) {
if (!ASSERT_NONNULL(container)) { if (!ASSERT_NONNULL(container)) {
return NULL; return NULL;
} }
if (!sway_assert(type < C_TYPES && type >= C_ROOT, "%s: invalid type", __func__)) { if (!sway_assert(type < C_TYPES && type >= C_ROOT, "invalid type")) {
return NULL; return NULL;
} }
do { do {
@ -389,7 +389,7 @@ swayc_t *swayc_parent_by_layout(swayc_t *container, enum swayc_layouts layout) {
if (!ASSERT_NONNULL(container)) { if (!ASSERT_NONNULL(container)) {
return NULL; return NULL;
} }
if (!sway_assert(layout < L_LAYOUTS && layout >= L_NONE, "%s: invalid layout", __func__)) { if (!sway_assert(layout < L_LAYOUTS && layout >= L_NONE, "invalid layout")) {
return NULL; return NULL;
} }
do { do {
@ -402,7 +402,7 @@ swayc_t *swayc_focus_by_type(swayc_t *container, enum swayc_types type) {
if (!ASSERT_NONNULL(container)) { if (!ASSERT_NONNULL(container)) {
return NULL; return NULL;
} }
if (!sway_assert(type < C_TYPES && type >= C_ROOT, "%s: invalid type", __func__)) { if (!sway_assert(type < C_TYPES && type >= C_ROOT, "invalid type")) {
return NULL; return NULL;
} }
do { do {
@ -410,11 +410,12 @@ swayc_t *swayc_focus_by_type(swayc_t *container, enum swayc_types type) {
} while (container && container->type != type); } while (container && container->type != type);
return container; return container;
} }
swayc_t *swayc_focus_by_layout(swayc_t *container, enum swayc_layouts layout) { swayc_t *swayc_focus_by_layout(swayc_t *container, enum swayc_layouts layout) {
if (!ASSERT_NONNULL(container)) { if (!ASSERT_NONNULL(container)) {
return NULL; return NULL;
} }
if (!sway_assert(layout < L_LAYOUTS && layout >= L_NONE, "%s: invalid layout", __func__)) { if (!sway_assert(layout < L_LAYOUTS && layout >= L_NONE, "invalid layout")) {
return NULL; return NULL;
} }
do { do {
@ -494,6 +495,10 @@ bool swayc_is_fullscreen(swayc_t *view) {
return view && view->type == C_VIEW && (wlc_view_get_state(view->handle) & WLC_BIT_FULLSCREEN); return view && view->type == C_VIEW && (wlc_view_get_state(view->handle) & WLC_BIT_FULLSCREEN);
} }
bool swayc_is_active(swayc_t *view) {
return view && view->type == C_VIEW && (wlc_view_get_state(view->handle) & WLC_BIT_ACTIVATED);
}
// Mapping // Mapping
void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), void *data) { void container_map(swayc_t *container, void (*f)(swayc_t *view, void *data), void *data) {
@ -536,6 +541,7 @@ void set_view_visibility(swayc_t *view, void *data) {
void update_visibility(swayc_t *container) { void update_visibility(swayc_t *container) {
swayc_t *ws = swayc_active_workspace_for(container); swayc_t *ws = swayc_active_workspace_for(container);
// TODO better visibility setting
bool visible = (ws->parent->focused == ws); bool visible = (ws->parent->focused == ws);
sway_log(L_DEBUG, "Setting visibility of container %p to %s", container, visible ? "visible" : "invisible"); sway_log(L_DEBUG, "Setting visibility of container %p to %s", container, visible ? "visible" : "invisible");
container_map(ws, set_view_visibility, &visible); container_map(ws, set_view_visibility, &visible);

View file

@ -45,6 +45,9 @@ void add_child(swayc_t *parent, swayc_t *child) {
void add_floating(swayc_t *ws, swayc_t *child) { void add_floating(swayc_t *ws, swayc_t *child) {
sway_log(L_DEBUG, "Adding %p (%d, %fx%f) to %p (%d, %fx%f)", child, child->type, sway_log(L_DEBUG, "Adding %p (%d, %fx%f) to %p (%d, %fx%f)", child, child->type,
child->width, child->height, ws, ws->type, ws->width, ws->height); child->width, child->height, ws, ws->type, ws->width, ws->height);
if (!sway_assert(ws->type == C_WORKSPACE, "Must be of workspace type")) {
return;
}
list_add(ws->floating, child); list_add(ws->floating, child);
child->parent = ws; child->parent = ws;
child->is_floating = true; child->is_floating = true;
@ -93,8 +96,8 @@ swayc_t *replace_child(swayc_t *child, swayc_t *new_child) {
void swap_container(swayc_t *a, swayc_t *b) { void swap_container(swayc_t *a, swayc_t *b) {
//TODO doesnt handle floating <-> tiling swap //TODO doesnt handle floating <-> tiling swap
if (!sway_assert(a&&b, "%s: parameters must be non null",__func__) || if (!sway_assert(a&&b, "parameters must be non null") ||
!sway_assert(a->parent && b->parent, "%s: containers must have parents",__func__)) { !sway_assert(a->parent && b->parent, "containers must have parents")) {
return; return;
} }
size_t a_index = index_child(a); size_t a_index = index_child(a);
@ -158,6 +161,10 @@ swayc_t *remove_child(swayc_t *child) {
parent->focused = NULL; parent->focused = NULL;
} }
} }
// deactivate view
if (child->type == C_VIEW) {
wlc_view_set_state(child->handle, WLC_BIT_ACTIVATED, false);
}
return parent; return parent;
} }
@ -209,15 +216,24 @@ void move_container_to(swayc_t* container, swayc_t* destination) {
if (container->parent == destination) { if (container->parent == destination) {
return; return;
} }
destroy_container(remove_child(container)); swayc_t *parent = remove_child(container);
set_focused_container(get_focused_view(&root_container)); // reset container geometry
container->width = container->height = 0;
// Send to new destination
if (container->is_floating) { if (container->is_floating) {
add_floating(destination, container); add_floating(swayc_active_workspace_for(destination), container);
} else { } else if (destination->type == C_WORKSPACE) {
add_child(destination, container); add_child(destination, container);
} else {
add_sibling(destination, container);
} }
// Destroy old container if we need to
parent = destroy_container(parent);
set_focused_container(get_focused_view(&root_container));
update_visibility(container); update_visibility(container);
arrange_windows(&root_container, -1, -1); arrange_windows(parent, -1, -1);
arrange_windows(destination->parent, -1, -1);
} }
void update_geometry(swayc_t *container) { void update_geometry(swayc_t *container) {

View file

@ -100,7 +100,7 @@ void sway_log_errno(log_importance_t verbosity, char* format, ...) {
} }
} }
bool sway_assert(bool condition, const char* format, ...) { bool _sway_assert(bool condition, const char* format, ...) {
if (condition) { if (condition) {
return true; return true;
} }

View file

@ -127,7 +127,7 @@ int main(int argc, char **argv) {
return 0; return 0;
} }
static void sigchld_handle(int signal) { void sigchld_handle(int signal) {
(void) signal; (void) signal;
while (waitpid((pid_t)-1, 0, WNOHANG) > 0); while (waitpid((pid_t)-1, 0, WNOHANG) > 0);
} }