aboutsummaryrefslogtreecommitdiff
path: root/.local
diff options
context:
space:
mode:
Diffstat (limited to '.local')
-rwxr-xr-x.local/bin/i3_tmux_vim_focusbin0 -> 17272 bytes
-rwxr-xr-x.local/bin/i3_tmux_vim_focus.c78
-rwxr-xr-x.local/bin/tmux_sys_win_aware_navigation.sh115
3 files changed, 193 insertions, 0 deletions
diff --git a/.local/bin/i3_tmux_vim_focus b/.local/bin/i3_tmux_vim_focus
new file mode 100755
index 0000000..bf156f9
--- /dev/null
+++ b/.local/bin/i3_tmux_vim_focus
Binary files differ
diff --git a/.local/bin/i3_tmux_vim_focus.c b/.local/bin/i3_tmux_vim_focus.c
new file mode 100755
index 0000000..1429e3a
--- /dev/null
+++ b/.local/bin/i3_tmux_vim_focus.c
@@ -0,0 +1,78 @@
+/* File: i3_vim_focus.c
+ *
+ * Compile with:
+ * gcc i3_tmux_vim_focus.c -lX11 -lxdo -o i3_tmux_vim_focus $(pkg-config --libs --cflags i3ipc-glib-1.0)
+ *
+ */
+
+#include <stdio.h>
+
+#include <strings.h>
+#include <string.h>
+
+#include <xdo.h>
+
+#include <glib/gprintf.h>
+#include <i3ipc-glib/i3ipc-glib.h>
+
+int main(int argc, char *argv[]) {
+
+ char cmd[20];
+
+ unsigned char *name;
+ int name_len;
+ int name_type;
+ Window window_ret;
+
+ i3ipcConnection *conn;
+ gchar *reply;
+
+ if(argc < 2){
+ printf("Missing argument\n");
+ return 1;
+ }
+
+ xdo_t *xdo = xdo_new(NULL);
+ xdo_get_active_window(xdo, &window_ret);
+ xdo_get_window_name(xdo, window_ret, &name, &name_len, &name_type);
+
+ puts(name);
+ if(strstr(name, "VIM") || strstr(name, "vim") && !strstr(name, "i3_tmux_vim_focus"))
+ {
+ strcpy(cmd, "Ctrl+c+Ctrl+");
+
+
+ strcat(cmd, (argv[1][0] == 'l')? "h" :
+ (argv[1][0] == 'd')? "j" :
+ (argv[1][0] == 'u')? "k" :
+ "l" );
+ puts(cmd);
+
+ xdo_send_keysequence_window(xdo, window_ret, cmd, 0);
+ }
+ else if(strstr(name, "tmux"))
+ {
+ strcpy(cmd, "ctrl+a");
+
+
+ xdo_send_keysequence_window(xdo, window_ret, cmd, 0);
+ strcpy(cmd, (argv[1][0] == 'l')? "Left" :
+ (argv[1][0] == 'd')? "Down" :
+ (argv[1][0] == 'u')? "Up" :
+ "Right" );
+
+ xdo_send_keysequence_window(xdo, window_ret, cmd, 0);
+ }
+ else
+ {
+ conn = i3ipc_connection_new(NULL, NULL);
+ strcpy(cmd, "focus ");
+ strcat(cmd, argv[1]);
+ reply = i3ipc_connection_message(conn, I3IPC_MESSAGE_TYPE_COMMAND, cmd, NULL);
+ g_free(reply);
+ g_object_unref(conn);
+ }
+
+ XFree(name);
+ return 0;
+}
diff --git a/.local/bin/tmux_sys_win_aware_navigation.sh b/.local/bin/tmux_sys_win_aware_navigation.sh
new file mode 100755
index 0000000..4fed4ae
--- /dev/null
+++ b/.local/bin/tmux_sys_win_aware_navigation.sh
@@ -0,0 +1,115 @@
+#!/bin/bash
+
+#export PS4="\$LINENO: " # Prints out the line number being executed by debug
+#set -xv # Turn on debugging
+
+exists_another_pane_in_direction() {
+ local direction=$1
+ local result=1 #false
+
+ local paneList=$(
+ tmux list-panes -F '#{pane_top} #{pane_left} #{?pane_active,active,} '
+ )
+
+ local paneActive=$(
+ echo "$paneList" | \
+ grep 'active' | \
+ tr -s ' '
+ )
+
+ local paneNoActive=$(
+ echo "$paneList" | \
+ grep -v 'active'
+ )
+
+ local paneActiveTop="$(echo "$paneActive" | cut -d' ' -f1)"
+ local paneActiveLeft="$(echo "$paneActive" | cut -d' ' -f2)"
+
+ while read -r line; do
+ local left="$(echo "$line" | cut -d' ' -f2 | tr -d "[:blank:]" | tr -d "\n")"
+ local top="$(echo "$line" | cut -d' ' -f1)"
+
+ if [ "$top" = '' ] && [ "$left" = '' ]; then
+ break # There is not other window
+ fi
+
+ if [ "$direction" = 'up' ]
+ then
+
+ if [ "$top" -lt "$paneActiveTop" ] && [ "$left" -eq "$paneActiveLeft" ]
+ then
+ local result=0 #true
+ break
+ fi
+ fi
+
+ if [ "$direction" = 'right' ]
+ then
+
+ if [ "$left" -gt "$paneActiveLeft" ]
+ then
+ local result=0 #true
+ break
+ fi
+ fi
+
+ if [ "$direction" = 'down' ]
+ then
+ if [ "$top" -gt "$paneActiveTop" ] && [ "$left" -eq "$paneActiveLeft" ]
+ then
+ local result=0 #true
+ break
+ fi
+ fi
+
+ if [ "$direction" = 'left' ]
+ then
+ if [ "$left" -lt "$paneActiveLeft" ]
+ then
+ local result=0 #true
+ break
+ fi
+ fi
+ done <<< "$paneNoActive"
+
+ echo "$result"
+}
+
+dir=$1 #direction
+mode=$2 #if value = "tmux-only", navigation shortcuts won't apply in system's window scope
+ # ....so this script won't be used and navigation will be handled by tmux only
+
+if [ "$dir" = "up" ]
+then
+ tmuxArg="U"
+elif [ "$dir" = "right" ]
+then
+ tmuxArg="R"
+elif [ "$dir" = "down" ]
+then
+ tmuxArg="D"
+elif [ "$dir" = "left" ]
+then
+ tmuxArg="L"
+else
+ echo -e "Invalid dirrection parameter supplied\nUsage: tmux_sys_win_aware_navigation up|right|down|left"
+ exit 1
+fi
+
+if [ "$mode" = "tmux-only" ]
+then
+ tmux select-pane -$tmuxArg
+ exit 0
+fi
+
+exists=$(exists_another_pane_in_direction $dir)
+
+
+if [ $exists = '0' ]
+then
+ tmux select-pane -$tmuxArg
+else
+ i3-msg -q focus $dir
+fi
+exit 0
+#set +xv #end of debug