Added config key for default orientation of containers (new_container_orientation) and added support in randr.c for automatically changing the orientation when user does a xrandr rotate.
This commit is contained in:
parent
b484ed5f9d
commit
2f992f5c0e
@ -19,7 +19,13 @@ bindsym Mod1+Return exec /usr/bin/urxvt
|
|||||||
# Start dmenu (Mod1+p)
|
# Start dmenu (Mod1+p)
|
||||||
bindsym Mod1+p exec /usr/bin/dmenu_run
|
bindsym Mod1+p exec /usr/bin/dmenu_run
|
||||||
|
|
||||||
|
# Default orientation
|
||||||
|
new_container_orientation horizontal
|
||||||
|
|
||||||
|
# Horizontal orientation
|
||||||
bindsym Mod1+h split h
|
bindsym Mod1+h split h
|
||||||
|
|
||||||
|
# Vertical orientation
|
||||||
bindsym Mod1+v split v
|
bindsym Mod1+v split v
|
||||||
|
|
||||||
# Fullscreen (Mod1+f)
|
# Fullscreen (Mod1+f)
|
||||||
|
@ -95,6 +95,9 @@ struct Config {
|
|||||||
int container_stack_limit;
|
int container_stack_limit;
|
||||||
int container_stack_limit_value;
|
int container_stack_limit_value;
|
||||||
|
|
||||||
|
/** Default orientation for new containers */
|
||||||
|
int default_orientation;
|
||||||
|
|
||||||
/** By default, focus follows mouse. If the user explicitly wants to
|
/** By default, focus follows mouse. If the user explicitly wants to
|
||||||
* turn this off (and instead rely only on the keyboard for changing
|
* turn this off (and instead rely only on the keyboard for changing
|
||||||
* focus), we allow him to do this with this relatively special option.
|
* focus), we allow him to do this with this relatively special option.
|
||||||
|
@ -92,6 +92,10 @@ set[^\n]* { return TOKCOMMENT; }
|
|||||||
ipc-socket { BEGIN(BIND_AWS_COND); return TOKIPCSOCKET; }
|
ipc-socket { BEGIN(BIND_AWS_COND); return TOKIPCSOCKET; }
|
||||||
ipc_socket { BEGIN(BIND_AWS_COND); return TOKIPCSOCKET; }
|
ipc_socket { BEGIN(BIND_AWS_COND); return TOKIPCSOCKET; }
|
||||||
restart_state { BEGIN(BIND_AWS_COND); return TOKRESTARTSTATE; }
|
restart_state { BEGIN(BIND_AWS_COND); return TOKRESTARTSTATE; }
|
||||||
|
new_container_orientation { return TOK_ORIENTATION; }
|
||||||
|
horizontal { return TOK_HORIZ; }
|
||||||
|
vertical { return TOK_VERT; }
|
||||||
|
auto { return TOK_AUTO; }
|
||||||
new_container { return TOKNEWCONTAINER; }
|
new_container { return TOKNEWCONTAINER; }
|
||||||
new_window { return TOKNEWWINDOW; }
|
new_window { return TOKNEWWINDOW; }
|
||||||
normal { return TOK_NORMAL; }
|
normal { return TOK_NORMAL; }
|
||||||
|
@ -224,6 +224,10 @@ void parse_file(const char *f) {
|
|||||||
%token TOKCOLOR
|
%token TOKCOLOR
|
||||||
%token TOKARROW "→"
|
%token TOKARROW "→"
|
||||||
%token TOKMODE "mode"
|
%token TOKMODE "mode"
|
||||||
|
%token TOK_ORIENTATION "new_container_orientation"
|
||||||
|
%token TOK_HORIZ "horizontal"
|
||||||
|
%token TOK_VERT "vertical"
|
||||||
|
%token TOK_AUTO "auto"
|
||||||
%token TOKNEWCONTAINER "new_container"
|
%token TOKNEWCONTAINER "new_container"
|
||||||
%token TOKNEWWINDOW "new_window"
|
%token TOKNEWWINDOW "new_window"
|
||||||
%token TOK_NORMAL "normal"
|
%token TOK_NORMAL "normal"
|
||||||
@ -249,6 +253,7 @@ line:
|
|||||||
bindline
|
bindline
|
||||||
| mode
|
| mode
|
||||||
| floating_modifier
|
| floating_modifier
|
||||||
|
| orientation
|
||||||
| new_container
|
| new_container
|
||||||
| new_window
|
| new_window
|
||||||
| focus_follows_mouse
|
| focus_follows_mouse
|
||||||
@ -373,6 +378,20 @@ floating_modifier:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
orientation:
|
||||||
|
TOK_ORIENTATION WHITESPACE direction
|
||||||
|
{
|
||||||
|
DLOG("New containers should start with split direction %d\n", $<number>3);
|
||||||
|
config.default_orientation = $<number>3;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
direction:
|
||||||
|
TOK_HORIZ { $<number>$ = HORIZ; }
|
||||||
|
| TOK_VERT { $<number>$ = VERT; }
|
||||||
|
| TOK_AUTO { $<number>$ = NO_ORIENTATION; }
|
||||||
|
;
|
||||||
|
|
||||||
new_container:
|
new_container:
|
||||||
TOKNEWCONTAINER WHITESPACE TOKCONTAINERMODE
|
TOKNEWCONTAINER WHITESPACE TOKCONTAINERMODE
|
||||||
{
|
{
|
||||||
|
@ -794,7 +794,11 @@ void con_set_layout(Con *con, int layout) {
|
|||||||
/* 3: While the layout is irrelevant in stacked/tabbed mode, it needs
|
/* 3: While the layout is irrelevant in stacked/tabbed mode, it needs
|
||||||
* to be set. Otherwise, this con will not be interpreted as a split
|
* to be set. Otherwise, this con will not be interpreted as a split
|
||||||
* container. */
|
* container. */
|
||||||
new->orientation = HORIZ;
|
if (config.default_orientation == NO_ORIENTATION) {
|
||||||
|
new->orientation = (con->rect.height > con->rect.width) ? VERT : HORIZ;
|
||||||
|
} else {
|
||||||
|
new->orientation = config.default_orientation;
|
||||||
|
}
|
||||||
|
|
||||||
Con *old_focused = TAILQ_FIRST(&(con->focus_head));
|
Con *old_focused = TAILQ_FIRST(&(con->focus_head));
|
||||||
if (old_focused == TAILQ_END(&(con->focus_head)))
|
if (old_focused == TAILQ_END(&(con->focus_head)))
|
||||||
|
@ -331,6 +331,8 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
|
|||||||
INIT_COLOR(config.bar.urgent, "#2f343a", "#900000", "#ffffff");
|
INIT_COLOR(config.bar.urgent, "#2f343a", "#900000", "#ffffff");
|
||||||
|
|
||||||
config.default_border = BS_NORMAL;
|
config.default_border = BS_NORMAL;
|
||||||
|
/* Set default_orientation to NO_ORIENTATION for auto orientation. */
|
||||||
|
config.default_orientation = NO_ORIENTATION;
|
||||||
|
|
||||||
parse_configuration(override_configpath);
|
parse_configuration(override_configpath);
|
||||||
|
|
||||||
|
36
src/randr.c
36
src/randr.c
@ -361,7 +361,17 @@ void output_init_con(Output *output) {
|
|||||||
free(name);
|
free(name);
|
||||||
|
|
||||||
ws->fullscreen_mode = CF_OUTPUT;
|
ws->fullscreen_mode = CF_OUTPUT;
|
||||||
ws->orientation = HORIZ;
|
|
||||||
|
/* If default_orientation is set to NO_ORIENTATION we determine
|
||||||
|
* orientation depending on output resolution. */
|
||||||
|
if (config.default_orientation == NO_ORIENTATION) {
|
||||||
|
ws->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
|
||||||
|
DLOG("Auto orientation. Workspace size set to (%d,%d), setting orientation to %d.\n",
|
||||||
|
output->rect.width, output->rect.height, ws->orientation);
|
||||||
|
} else {
|
||||||
|
ws->orientation = config.default_orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: Set focus in main.c */
|
/* TODO: Set focus in main.c */
|
||||||
con_focus(ws);
|
con_focus(ws);
|
||||||
@ -384,6 +394,30 @@ static void output_change_mode(xcb_connection_t *conn, Output *output) {
|
|||||||
DLOG("Output mode changed, updating rect\n");
|
DLOG("Output mode changed, updating rect\n");
|
||||||
assert(output->con != NULL);
|
assert(output->con != NULL);
|
||||||
output->con->rect = output->rect;
|
output->con->rect = output->rect;
|
||||||
|
|
||||||
|
Con *current,*workspace,*child;
|
||||||
|
|
||||||
|
/* Point current to the container of the workspaces */
|
||||||
|
current = output->con->nodes_head.tqh_first->nodes.tqe_next;
|
||||||
|
|
||||||
|
/* If default_orientation is NO_ORIENTATION, we change the orientation of
|
||||||
|
* the workspaces and their childs depending on output resolution. This is
|
||||||
|
* only done for workspaces with maximum one child. */
|
||||||
|
if (config.default_orientation == NO_ORIENTATION) {
|
||||||
|
TAILQ_FOREACH(workspace, &(current->nodes_head), nodes) {
|
||||||
|
|
||||||
|
/* Check if this workspace has <= 1 childs. */
|
||||||
|
child = workspace->nodes_head.tqh_first;
|
||||||
|
if (child != NULL)
|
||||||
|
if (child->nodes.tqe_next == NULL) {
|
||||||
|
workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
|
||||||
|
DLOG("Setting workspace [%d,%s]'s orientation to %d.\n", workspace->num, workspace->name, workspace->orientation);
|
||||||
|
child->orientation = workspace->orientation;
|
||||||
|
DLOG("Setting child [%d,%s]'s orientation to %d.\n", child->num, child->name, child->orientation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
Rect bar_rect = {output->rect.x,
|
Rect bar_rect = {output->rect.x,
|
||||||
output->rect.y + output->rect.height - (font->height + 6),
|
output->rect.y + output->rect.height - (font->height + 6),
|
||||||
|
@ -59,7 +59,18 @@ Con *workspace_get(const char *num, bool *created) {
|
|||||||
workspace->num = -1;
|
workspace->num = -1;
|
||||||
else workspace->num = parsed_num;
|
else workspace->num = parsed_num;
|
||||||
LOG("num = %d\n", workspace->num);
|
LOG("num = %d\n", workspace->num);
|
||||||
workspace->orientation = HORIZ;
|
|
||||||
|
/* If default_orientation is set to NO_ORIENTATION we
|
||||||
|
* determine workspace orientation from workspace size.
|
||||||
|
* Otherwise we just set the orientation to default_orientation. */
|
||||||
|
if (config.default_orientation == NO_ORIENTATION) {
|
||||||
|
workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
|
||||||
|
DLOG("Auto orientation. Output resolution set to (%d,%d), setting orientation to %d.\n",
|
||||||
|
workspace->rect.width, workspace->rect.height, workspace->orientation);
|
||||||
|
} else {
|
||||||
|
workspace->orientation = config.default_orientation;
|
||||||
|
}
|
||||||
|
|
||||||
con_attach(workspace, content, false);
|
con_attach(workspace, content, false);
|
||||||
|
|
||||||
ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}");
|
ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}");
|
||||||
|
Loading…
Reference in New Issue
Block a user