Converting to i3
This commit is contained in:
parent
7eaf1d7069
commit
5d551088ab
3 changed files with 358 additions and 1 deletions
160
.i3/config
Normal file
160
.i3/config
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
# This file has been auto-generated by i3-config-wizard(1).
|
||||
# It will not be overwritten, so edit it as you like.
|
||||
#
|
||||
# Should you change your keyboard layout some time, delete
|
||||
# this file and re-run i3-config-wizard(1).
|
||||
#
|
||||
|
||||
# i3 config file (v4)
|
||||
#
|
||||
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
|
||||
|
||||
set $mod Mod1
|
||||
|
||||
# Font for window titles. Will also be used by the bar unless a different font
|
||||
# is used in the bar {} block below.
|
||||
# This font is widely installed, provides lots of unicode glyphs, right-to-left
|
||||
# text rendering and scalability on retina/hidpi displays (thanks to pango).
|
||||
font pango:DejaVu Sans Mono 10
|
||||
# Before i3 v4.8, we used to recommend this one as the default:
|
||||
# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||
# The font above is very space-efficient, that is, it looks good, sharp and
|
||||
# clear in small sizes. However, its unicode glyph coverage is limited, the old
|
||||
# X core fonts rendering does not support right-to-left and this being a bitmap
|
||||
# font, it doesn’t scale on retina/hidpi displays.
|
||||
#
|
||||
|
||||
new_window pixel 2
|
||||
#force_focus_wrapping yes
|
||||
|
||||
# Use Mouse+$mod to drag floating windows to their wanted position
|
||||
floating_modifier $mod
|
||||
|
||||
# start a terminal
|
||||
bindsym $mod+Shift+Return exec run_terminal
|
||||
|
||||
# kill focused window
|
||||
bindsym $mod+Shift+c kill
|
||||
|
||||
# start dmenu (a program launcher)
|
||||
bindsym $mod+d exec dmenu_run
|
||||
# There also is the (new) i3-dmenu-desktop which only displays applications
|
||||
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
|
||||
# installed.
|
||||
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
|
||||
|
||||
# change focus
|
||||
bindsym $mod+h focus left
|
||||
#bindsym $mod+j focus down
|
||||
#bindsym $mod+k focus up
|
||||
bindsym $mod+l focus right
|
||||
bindsym $mod+j exec --no-startup-id ~/.i3/i3-focus-next
|
||||
bindsym $mod+k exec --no-startup-id ~/.i3/i3-focus-next --reverse
|
||||
|
||||
# alternatively, you can use the cursor keys:
|
||||
#bindsym $mod+Left focus left
|
||||
#bindsym $mod+Down focus down
|
||||
#bindsym $mod+Up focus up
|
||||
#bindsym $mod+Right focus right
|
||||
|
||||
# move focused window
|
||||
bindsym $mod+Shift+h move left
|
||||
bindsym $mod+Shift+j move down
|
||||
bindsym $mod+Shift+k move up
|
||||
bindsym $mod+Shift+l move right
|
||||
|
||||
# alternatively, you can use the cursor keys:
|
||||
#bindsym $mod+Shift+Left move left
|
||||
#bindsym $mod+Shift+Down move down
|
||||
#bindsym $mod+Shift+Up move up
|
||||
#bindsym $mod+Shift+Right move right
|
||||
|
||||
# split in horizontal orientation
|
||||
bindsym $mod+i split h
|
||||
|
||||
# split in vertical orientation
|
||||
bindsym $mod+v split v
|
||||
|
||||
# enter fullscreen mode for the focused container
|
||||
bindsym $mod+f fullscreen
|
||||
|
||||
# change container layout (stacked, tabbed, toggle split)
|
||||
bindsym $mod+s layout stacking
|
||||
bindsym $mod+w layout tabbed
|
||||
bindsym $mod+e layout toggle split
|
||||
|
||||
# toggle tiling / floating
|
||||
bindsym $mod+Shift+space floating toggle
|
||||
|
||||
# change focus between tiling / floating windows
|
||||
bindsym $mod+space focus mode_toggle
|
||||
|
||||
# focus the parent container
|
||||
bindsym $mod+a focus parent
|
||||
|
||||
# focus the child container
|
||||
#bindsym $mod+d focus child
|
||||
|
||||
# switch to workspace
|
||||
bindsym $mod+1 workspace 1
|
||||
bindsym $mod+2 workspace 2
|
||||
bindsym $mod+3 workspace 3
|
||||
bindsym $mod+4 workspace 4
|
||||
bindsym $mod+5 workspace 5
|
||||
bindsym $mod+6 workspace 6
|
||||
bindsym $mod+7 workspace 7
|
||||
bindsym $mod+8 workspace 8
|
||||
bindsym $mod+9 workspace 9
|
||||
bindsym $mod+0 workspace 10
|
||||
|
||||
# move focused container to workspace
|
||||
bindsym $mod+Shift+1 move container to workspace 1
|
||||
bindsym $mod+Shift+2 move container to workspace 2
|
||||
bindsym $mod+Shift+3 move container to workspace 3
|
||||
bindsym $mod+Shift+4 move container to workspace 4
|
||||
bindsym $mod+Shift+5 move container to workspace 5
|
||||
bindsym $mod+Shift+6 move container to workspace 6
|
||||
bindsym $mod+Shift+7 move container to workspace 7
|
||||
bindsym $mod+Shift+8 move container to workspace 8
|
||||
bindsym $mod+Shift+9 move container to workspace 9
|
||||
bindsym $mod+Shift+0 move container to workspace 10
|
||||
|
||||
# reload the configuration file
|
||||
bindsym $mod+Shift+y reload
|
||||
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
||||
bindsym $mod+Shift+r restart
|
||||
# exit i3 (logs you out of your X session)
|
||||
bindsym $mod+Shift+q exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
|
||||
|
||||
# resize window (you can also use the mouse for that)
|
||||
mode "resize" {
|
||||
# These bindings trigger as soon as you enter the resize mode
|
||||
|
||||
# Pressing left will shrink the window’s width.
|
||||
# Pressing right will grow the window’s width.
|
||||
# Pressing up will shrink the window’s height.
|
||||
# Pressing down will grow the window’s height.
|
||||
bindsym h resize shrink width 5 px or 5 ppt
|
||||
bindsym j resize grow height 5 px or 5 ppt
|
||||
bindsym k resize shrink height 5 px or 5 ppt
|
||||
bindsym l resize grow width 5 px or 5 ppt
|
||||
|
||||
# same bindings, but for the arrow keys
|
||||
#bindsym Left resize shrink width 10 px or 10 ppt
|
||||
#bindsym Down resize grow height 10 px or 10 ppt
|
||||
#bindsym Up resize shrink height 10 px or 10 ppt
|
||||
#bindsym Right resize grow width 10 px or 10 ppt
|
||||
|
||||
# back to normal: Enter or Escape
|
||||
bindsym Return mode "default"
|
||||
bindsym Escape mode "default"
|
||||
}
|
||||
|
||||
bindsym $mod+r mode "resize"
|
||||
|
||||
# Start i3bar to display a workspace bar (plus the system information i3status
|
||||
# finds out, if available)
|
||||
bar {
|
||||
status_command i3status
|
||||
position top
|
||||
}
|
||||
196
.i3/i3-focus-next
Executable file
196
.i3/i3-focus-next
Executable file
|
|
@ -0,0 +1,196 @@
|
|||
#!/usr/bin/env perl
|
||||
#
|
||||
# needs package perl-json
|
||||
#
|
||||
|
||||
use IO::Socket::UNIX;
|
||||
use JSON;
|
||||
use Encode;
|
||||
use Getopt::Long;
|
||||
|
||||
use constant MAGIC_STRING => 'i3-ipc';
|
||||
|
||||
use constant TYPE_COMMAND => 0;
|
||||
use constant TYPE_GET_WORKSPACES => 1;
|
||||
use constant TYPE_GET_TREE => 4;
|
||||
|
||||
#
|
||||
# ipc functions
|
||||
#
|
||||
sub message {
|
||||
my ($type, $content) = @_;
|
||||
my $payload = '';
|
||||
|
||||
if ($content) {
|
||||
$payload = encode_utf8($content);
|
||||
}
|
||||
|
||||
return(MAGIC_STRING . pack('LL', length($payload), $type) . $payload);
|
||||
}
|
||||
|
||||
sub ipc_request {
|
||||
my ($sock, $type, $content) = @_;
|
||||
|
||||
# send request
|
||||
$sock->write(message($type, $content));
|
||||
|
||||
# read response header
|
||||
my $header = '';
|
||||
$sock->read($header, length(MAGIC_STRING) + 4 + 4);
|
||||
|
||||
# get payload length
|
||||
my ($len, $type) = unpack('LL', substr($header, length(MAGIC_STRING)));
|
||||
|
||||
# read payload
|
||||
my $payload = '';
|
||||
$sock->read($payload, $len);
|
||||
|
||||
# return decoded json
|
||||
return decode_json $payload;
|
||||
}
|
||||
|
||||
#
|
||||
# tree functions
|
||||
#
|
||||
sub get_node_by_name {
|
||||
my ($ref, $name) = @_;
|
||||
|
||||
# search for a direct child node by name
|
||||
foreach my $node (@{${${ref}}{'nodes'}}) {
|
||||
if (${${node}}{'name'} eq $name) {
|
||||
return $node;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub pop_window_array {
|
||||
my ($ref, $arr) = @_;
|
||||
my @node_types = qw(nodes floating_nodes);
|
||||
|
||||
# iterate through all child nodes
|
||||
foreach my $node_type (@node_types) {
|
||||
foreach my $node (@{${${ref}}{$node_type}}) {
|
||||
# if child node is not a window
|
||||
if (${${node}}{'window'} eq undef) {
|
||||
# go one level down
|
||||
pop_window_array($node, \@{$arr});
|
||||
} else {
|
||||
# add window id to array
|
||||
push(@{$arr}, ${${node}}{'id'});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub get_focused_node {
|
||||
my $ref = shift;
|
||||
my $ret = '';
|
||||
my @node_types = qw(nodes floating_nodes);
|
||||
|
||||
# iterate through all child nodes
|
||||
foreach my $node_type (@node_types) {
|
||||
foreach my $node (@{${${ref}}{$node_type}}) {
|
||||
# if child node is not a window
|
||||
if (${${node}}{'window'} eq undef) {
|
||||
# go one level down
|
||||
$ret = get_focused_node($node);
|
||||
if ($ret != '') {
|
||||
return $ret;
|
||||
}
|
||||
} else {
|
||||
# return focused window id
|
||||
if (${${node}}{'focused'}) {
|
||||
return ${${node}}{'id'};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
#
|
||||
# main
|
||||
#
|
||||
|
||||
my $reverse;
|
||||
GetOptions("reverse" => \$reverse);
|
||||
|
||||
# get socket path
|
||||
chomp(my $path = qx(i3 --get-socketpath));
|
||||
|
||||
# open connection
|
||||
my $sock = IO::Socket::UNIX->new(Peer => $path);
|
||||
|
||||
# get current workspaces
|
||||
my $response = '';
|
||||
$response = ipc_request($sock, TYPE_GET_WORKSPACES);
|
||||
|
||||
# get focused output and workspace
|
||||
my $i3output = '';
|
||||
my $i3workspace = '';
|
||||
foreach my $node (@{$response}) {
|
||||
if (${$node}{'focused'}) {
|
||||
$i3output = ${$node}{output};
|
||||
$i3workspace = ${$node}{num};
|
||||
}
|
||||
}
|
||||
|
||||
# get layout tree
|
||||
my $response = '';
|
||||
$response = ipc_request($sock, TYPE_GET_TREE);
|
||||
|
||||
my @windows, $focused, $prev, $next;
|
||||
if (${$response}{'name'} eq 'root') {
|
||||
my $output = get_node_by_name($response, $i3output);
|
||||
my $content = get_node_by_name($output, 'content');
|
||||
my $workspace = get_node_by_name($content, $i3workspace);
|
||||
|
||||
# populate window array
|
||||
pop_window_array($workspace, \@windows);
|
||||
|
||||
# get focused window
|
||||
$focused = get_focused_node($workspace);
|
||||
|
||||
# find window key for focused window
|
||||
my $focused_key;
|
||||
while (my ($key, $val) = each @windows) {
|
||||
if ($val eq $focused) {
|
||||
|
||||
# get previous window
|
||||
if ($key == 0) {
|
||||
$prev = $windows[$#windows];
|
||||
} else {
|
||||
$prev = $windows[$key-1];
|
||||
}
|
||||
|
||||
# get next window
|
||||
if ($key == $#windows) {
|
||||
$next = $windows[0];
|
||||
} else {
|
||||
$next = $windows[$key+1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#print $prev . "\n" . $focused . "\n" . $next . "\n";
|
||||
|
||||
my $response = '';
|
||||
if ($reverse) {
|
||||
# set focus to previous window
|
||||
$response = ipc_request($sock, TYPE_COMMAND, '[con_id="' . $prev . '"] focus');
|
||||
} else {
|
||||
# set focus to next window
|
||||
$response = ipc_request($sock, TYPE_COMMAND, '[con_id="' . $next . '"] focus');
|
||||
}
|
||||
|
||||
close($sock);
|
||||
|
||||
# exit with ipc command status
|
||||
if (${$response}[0]{'success'}) {
|
||||
exit(0);
|
||||
} else {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
3
.xinitrc
3
.xinitrc
|
|
@ -11,4 +11,5 @@ gnome-sound-applet &
|
|||
setxkbmap -option ctrl:nocaps &
|
||||
synclient PalmDetect=1
|
||||
|
||||
exec awesome
|
||||
#exec awesome
|
||||
exec i3
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue