diff --git a/src/floating.c b/src/floating.c index 343b4338..9f5655c7 100644 --- a/src/floating.c +++ b/src/floating.c @@ -19,6 +19,11 @@ extern xcb_connection_t *conn; void floating_enable(Con *con, bool automatic) { bool set_focus = (con == focused); + if (con->parent && con->parent->type == CT_DOCKAREA) { + LOG("Container is a dock window, not enabling floating mode.\n"); + return; + } + if (con_is_floating(con)) { LOG("Container is already in floating mode, not doing anything.\n"); return; diff --git a/testcases/t/66-assign.t b/testcases/t/66-assign.t index a4a7bb0f..776710e7 100644 --- a/testcases/t/66-assign.t +++ b/testcases/t/66-assign.t @@ -182,4 +182,51 @@ exit_gracefully($process->pid); sleep 0.25; +##################################################################### +# regression test: dock clients with floating assignments should not crash +# (instead, nothing should happen - dock clients can’t float) +# ticket #501 +##################################################################### + +$config = <root->create_child( + class => WINDOW_CLASS_INPUT_OUTPUT, + rect => [ 0, 0, 30, 30 ], + background_color => '#0000ff', + window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'), +); + +$window->_create; +set_wm_class($window->id, 'special', 'special'); +$window->name('special window'); +$window->map; +sleep 0.25; + +my $content = get_ws($tmp); +ok(@{$content->{nodes}} == 0, 'no tiling cons'); +ok(@{$content->{floating_nodes}} == 0, 'one floating con'); +@docked = get_dock_clients; +is(@docked, 1, 'no dock clients yet'); + +$window->destroy; + +does_i3_live; + +exit_gracefully($process->pid); + +sleep 0.25; + done_testing;