From 5d551088abdf41f3a13ef438f505033e659a3e81 Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Tue, 3 Feb 2015 14:07:04 -0500 Subject: [PATCH] Converting to i3 --- .i3/config | 160 ++++++++++++++++++++++++++++++++++++++++++++ .i3/i3-focus-next | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ .xinitrc | 3 +- 3 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 .i3/config create mode 100755 .i3/i3-focus-next diff --git a/.i3/config b/.i3/config new file mode 100644 index 0000000..250aa30 --- /dev/null +++ b/.i3/config @@ -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 +} diff --git a/.i3/i3-focus-next b/.i3/i3-focus-next new file mode 100755 index 0000000..ecc3630 --- /dev/null +++ b/.i3/i3-focus-next @@ -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); +} + diff --git a/.xinitrc b/.xinitrc index 4895fb2..58186db 100644 --- a/.xinitrc +++ b/.xinitrc @@ -11,4 +11,5 @@ gnome-sound-applet & setxkbmap -option ctrl:nocaps & synclient PalmDetect=1 -exec awesome +#exec awesome +exec i3