* freely resizable (e.g. using your mouse, for now) percentage of rows/cols
* fullscreen (handling of applications, mplayer, firefox, xpdf, wmctrl)
- * fullscreen (implementing a mode, like default, stacked)
* xinerama
* document stuff!
* more documentation!
* See file LICENSE for license information.
*
*/
+#include <xcb/xcb.h>
+
+#include "data.h"
+
#ifndef _UTIL_H
#define _UTIL_H
void start_application(const char *command);
void check_error(xcb_connection_t *connection, xcb_void_cookie_t cookie, char *err_message);
+void set_focus(xcb_connection_t *conn, Client *client);
+void toggle_fullscreen(xcb_connection_t *conn, Client *client);
#endif
return;
}
+ /* Is it 'f' for fullscreen? */
+ if (command[0] == 'f') {
+ if (CUR_CELL->currently_focused == NULL)
+ return;
+ toggle_fullscreen(conn, CUR_CELL->currently_focused);
+ return;
+ }
+
/* Is it a <with>? */
if (command[0] == 'w') {
/* TODO: implement */
direction_t direction;
times = strtol(command, &rest, 10);
if (rest == NULL) {
- printf("Invalid command: Consists only of a movement\n");
+ printf("Invalid command (\"%s\")\n", command);
return;
}
if (*rest == 'm' || *rest == 's') {
#include "data.h"
#include "font.h"
#include "xcb.h"
-
-static void set_focus(xcb_connection_t *conn, Client *client) {
- /* Update container */
- Client *old_client = client->container->currently_focused;
- client->container->currently_focused = client;
-
- current_col = client->container->col;
- current_row = client->container->row;
-
- /* Set focus to the entered window, and flush xcb buffer immediately */
- xcb_set_input_focus(conn, XCB_INPUT_FOCUS_NONE, client->child, XCB_CURRENT_TIME);
- /* Update last/current client’s titlebar */
- if (old_client != NULL)
- decorate_window(conn, old_client);
- decorate_window(conn, client);
- xcb_flush(conn);
-}
-
-static void toggle_fullscreen(xcb_connection_t *conn, Client *client) {
- Workspace *workspace = client->container->workspace;
-
- workspace->fullscreen_client = (client->fullscreen ? NULL : client);
-
- client->fullscreen = !client->fullscreen;
-
- if (client->fullscreen) {
- printf("Entering fullscreen mode...\n");
- /* We just entered fullscreen mode, let’s configure the window */
- uint32_t mask = XCB_CONFIG_WINDOW_X |
- XCB_CONFIG_WINDOW_Y |
- XCB_CONFIG_WINDOW_WIDTH |
- XCB_CONFIG_WINDOW_HEIGHT;
- uint32_t values[4] = {workspace->x,
- workspace->y,
- workspace->width,
- workspace->height};
-
- printf("child itself will be at %dx%d with size %dx%d\n",
- values[0], values[1], values[2], values[3]);
-
- /* Raise the window */
- xcb_circulate_window(conn, XCB_CIRCULATE_RAISE_LOWEST, client->frame);
-
- xcb_configure_window(conn, client->frame, mask, values);
- xcb_configure_window(conn, client->child, mask, values);
-
- xcb_flush(conn);
- } else {
- printf("left fullscreen\n");
- client->force_reconfigure = true;
- /* We left fullscreen mode, redraw the layout */
- render_layout(conn);
- }
-}
+#include "util.h"
/*
* Due to bindings like Mode_switch + <a>, we need to bind some keys in XCB_GRAB_MODE_SYNC.
BIND(30, 0, "exec /usr/pkg/bin/urxvt");
+ BIND(41, BIND_MOD_1, "f");
+
BIND(44, BIND_MOD_1, "h");
BIND(45, BIND_MOD_1, "j");
BIND(46, BIND_MOD_1, "k");
#include <sys/wait.h>
#include "i3.h"
+#include "data.h"
+#include "table.h"
+#include "layout.h"
/*
* Starts the given application by passing it through a shell. We use double fork
exit(-1);
}
}
+
+/*
+ * Sets the given client as focused by updating the data structures correctly,
+ * updating the X input focus and finally re-decorating both windows (to signalize
+ * the user the new focus situation)
+ *
+ */
+void set_focus(xcb_connection_t *conn, Client *client) {
+ /* Update container */
+ Client *old_client = client->container->currently_focused;
+ client->container->currently_focused = client;
+
+ current_col = client->container->col;
+ current_row = client->container->row;
+
+ /* Set focus to the entered window, and flush xcb buffer immediately */
+ xcb_set_input_focus(conn, XCB_INPUT_FOCUS_NONE, client->child, XCB_CURRENT_TIME);
+ /* Update last/current client’s titlebar */
+ if (old_client != NULL)
+ decorate_window(conn, old_client);
+ decorate_window(conn, client);
+ xcb_flush(conn);
+}
+
+/*
+ * Toggles fullscreen mode for the given client. It updates the data structures and
+ * reconfigures (= resizes/moves) the client and its frame to the full size of the
+ * screen. When leaving fullscreen, re-rendering the layout is forced.
+ *
+ */
+void toggle_fullscreen(xcb_connection_t *conn, Client *client) {
+ Workspace *workspace = client->container->workspace;
+
+ workspace->fullscreen_client = (client->fullscreen ? NULL : client);
+
+ client->fullscreen = !client->fullscreen;
+
+ if (client->fullscreen) {
+ printf("Entering fullscreen mode...\n");
+ /* We just entered fullscreen mode, let’s configure the window */
+ uint32_t mask = XCB_CONFIG_WINDOW_X |
+ XCB_CONFIG_WINDOW_Y |
+ XCB_CONFIG_WINDOW_WIDTH |
+ XCB_CONFIG_WINDOW_HEIGHT;
+ uint32_t values[4] = {workspace->x,
+ workspace->y,
+ workspace->width,
+ workspace->height};
+
+ printf("child itself will be at %dx%d with size %dx%d\n",
+ values[0], values[1], values[2], values[3]);
+
+ /* Raise the window */
+ xcb_circulate_window(conn, XCB_CIRCULATE_RAISE_LOWEST, client->frame);
+
+ xcb_configure_window(conn, client->frame, mask, values);
+ xcb_configure_window(conn, client->child, mask, values);
+
+ xcb_flush(conn);
+ } else {
+ printf("left fullscreen\n");
+ /* Because the coordinates of the window haven’t changed, it would not be
+ re-configured if we don’t set the following flag */
+ client->force_reconfigure = true;
+ /* We left fullscreen mode, redraw the layout */
+ render_layout(conn);
+ }
+}