+/*
+ * Enables fullscreen mode for the given container, if necessary.
+ *
+ * If the container’s mode is already CF_OUTPUT or CF_GLOBAL, the container is
+ * kept fullscreen but its mode is set to CF_GLOBAL and CF_OUTPUT,
+ * respectively.
+ *
+ * Other fullscreen containers will be disabled first, if they hide the new
+ * one.
+ *
+ */
+void con_enable_fullscreen(Con *con, fullscreen_mode_t fullscreen_mode) {
+ if (con->type == CT_WORKSPACE) {
+ DLOG("You cannot make a workspace fullscreen.\n");
+ return;
+ }
+
+ assert(fullscreen_mode == CF_GLOBAL || fullscreen_mode == CF_OUTPUT);
+
+ if (fullscreen_mode == CF_GLOBAL)
+ DLOG("enabling global fullscreen for %p / %s\n", con, con->name);
+ else
+ DLOG("enabling fullscreen for %p / %s\n", con, con->name);
+
+ if (con->fullscreen_mode == fullscreen_mode) {
+ DLOG("fullscreen already enabled for %p / %s\n", con, con->name);
+ return;
+ }
+
+ Con *con_ws = con_get_workspace(con);
+
+ /* Disable any fullscreen container that would conflict the new one. */
+ Con *fullscreen = con_get_fullscreen_con(croot, CF_GLOBAL);
+ if (fullscreen == NULL)
+ fullscreen = con_get_fullscreen_con(con_ws, CF_OUTPUT);
+ if (fullscreen != NULL)
+ con_disable_fullscreen(fullscreen);
+
+ /* Set focus to new fullscreen container. Unless in global fullscreen mode
+ * and on another workspace restore focus afterwards.
+ * Switch to the container’s workspace if mode is global. */
+ Con *cur_ws = con_get_workspace(focused);
+ Con *old_focused = focused;
+ if (fullscreen_mode == CF_GLOBAL && cur_ws != con_ws)
+ workspace_show(con_ws);
+ con_focus(con);
+ if (fullscreen_mode != CF_GLOBAL && cur_ws != con_ws)
+ con_focus(old_focused);
+
+ con_set_fullscreen_mode(con, fullscreen_mode);
+}
+
+/*
+ * Disables fullscreen mode for the given container regardless of the mode, if
+ * necessary.
+ *
+ */
+void con_disable_fullscreen(Con *con) {
+ if (con->type == CT_WORKSPACE) {
+ DLOG("You cannot make a workspace fullscreen.\n");
+ return;
+ }
+
+ DLOG("disabling fullscreen for %p / %s\n", con, con->name);
+
+ if (con->fullscreen_mode == CF_NONE) {
+ DLOG("fullscreen already disabled for %p / %s\n", con, con->name);
+ return;
+ }
+
+ con_set_fullscreen_mode(con, CF_NONE);
+}
+