bindings. For example, when typing, capslock+1 or capslock+2 for switching
workspaces is totally convenient. Try it :-).
+=== The floating modifier
+
+To move floating windows with your mouse, you can either grab their titlebar
+or configure the so called floating modifier which you can then press and
+click anywhere in the window itself. The most common setup is to configure
+it as the same one you use for managing windows (Mod1 for example). Afterwards,
+you can press Mod1, click into a window using your left mouse button and drag
+it to the position you want it at.
+
+*Syntax*:
+--------------------------------
+floating_modifier <Modifiers>
+--------------------------------
+
+*Examples*:
+--------------------------------
+floating_modifier Mod1
+--------------------------------
+
+
=== Variables
As you learned in the previous section about keyboard bindings, you will have
# ISO 10646 = Unicode
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+# Use Mouse+Mod1 to drag floating windows to their wanted position
+floating_modifier Mod1
+
# Fullscreen (Mod1+f)
bind Mod1+41 f
*
* i3 - an improved dynamic tiling window manager
*
- * (c) 2009 Michael Stapelberg and contributors
+ * © 2009 Michael Stapelberg and contributors
*
* See file LICENSE for license information.
*
const char *terminal;
const char *font;
+ /** The modifier which needs to be pressed in combination with your mouse
+ * buttons to do things with floating windows (move, resize) */
+ uint32_t floating_modifier;
+
/* Color codes are stored here */
struct config_client {
struct Colortriple focused;
continue;
}
+ if (strcasecmp(key, "floating_modifier") == 0) {
+ char *walk = value;
+ uint32_t modifiers = 0;
+
+ while (*walk != '\0') {
+ /* Need to check for Mod1-5, Ctrl, Shift, Mode_switch */
+ CHECK_MODIFIER(SHIFT);
+ CHECK_MODIFIER(CONTROL);
+ CHECK_MODIFIER(MODE_SWITCH);
+ CHECK_MODIFIER(MOD1);
+ CHECK_MODIFIER(MOD2);
+ CHECK_MODIFIER(MOD3);
+ CHECK_MODIFIER(MOD4);
+ CHECK_MODIFIER(MOD5);
+
+ /* No modifier found? Then we’re done with this step */
+ break;
+ }
+
+ LOG("Floating modifiers = %d\n", modifiers);
+ config.floating_modifier = modifiers;
+ continue;
+ }
+
/* assign window class[/window title] → workspace */
if (strcasecmp(key, "assign") == 0) {
LOG("assign: \"%s\"\n", value);
client = table_get(&by_parent, event->event);
border_click = true;
}
- /* See if this was a click with Mod1. If so, we need to move around
- * the client if it was floating. if not, we just process as usual. */
- if ((event->state & XCB_MOD_MASK_1) != 0) {
+ /* See if this was a click with the configured modifier. If so, we need
+ * to move around the client if it was floating. if not, we just process
+ * as usual. */
+ if (config.floating_modifier != 0 &&
+ (event->state & config.floating_modifier) != 0) {
if (client == NULL) {
LOG("Not handling, Mod1 was pressed and no client found\n");
return 1;