diff --git a/tdrop b/tdrop index 1ae565d..521d94e 100755 --- a/tdrop +++ b/tdrop @@ -146,25 +146,44 @@ update_geometry_settings_for_monitor() { # monitor IF the monitor has changed since the last time the dropdown # was used - # determine curent monitor - wininfo=$(xwininfo -id "$(xdotool getactivewindow)") - window_x=$(echo "$wininfo" | awk '/Absolute.*X/ {print $4}') - window_y=$(echo "$wininfo" | awk '/Absolute.*Y/ {print $4}') - monitors_info=$(xrandr --query | awk '/ connected/ {gsub("primary ",""); print}') - while read -r monitor; do - monitor_geo=$(echo "$monitor" | awk '{print $3}') + # it is conceivable that a user may want to use -m but not -a, so + # get the wm from with + # in this function + wm=$(get_window_manager) + if [[ $wm == bspwm ]]; then + current_monitor=$(bspc query -m -M) + elif [[ $wm == i3 ]]; then + # I'd rather not make jq a dependency + current_monitor=$(i3-msg -t get_workspaces | sed 's/{"num"/\n/g' | awk -F ',' '/focused":true/ {sub(".*output",""); gsub("[:\"]",""); print $1}') + fi + + if [[ -n $current_monitor ]]; then + monitor_geo=$(xrandr --query | awk "/$current_monitor/ {gsub(\"primary \",\"\"); print \$3}") x_begin=$(echo "$monitor_geo" | awk -F '+' '{print $2}') y_begin=$(echo "$monitor_geo" | awk -F '+' '{print $3}') x_width=$(echo "$monitor_geo" | awk -F 'x' '{print $1}') y_height=$(echo "$monitor_geo" | awk -F 'x|+' '{print $2}') - x_end=$((x_begin+x_width)) - y_end=$((y_begin+y_height)) - if [[ $window_x -ge $x_begin ]] && [[ $window_x -lt $x_end ]] && \ - [[ $window_y -ge $y_begin ]] && [[ $window_y -lt $y_end ]]; then - current_monitor=$(echo "$monitor" | awk '{print $1}') - break - fi - done <<< "$monitors_info" + else + # determine current monitor in generic (hacky) way + wininfo=$(xwininfo -id "$(xdotool getactivewindow)") + window_x=$(echo "$wininfo" | awk '/Absolute.*X/ {print $4}') + window_y=$(echo "$wininfo" | awk '/Absolute.*Y/ {print $4}') + monitors_info=$(xrandr --query | awk '/ connected/ {gsub("primary ",""); print}') + while read -r monitor; do + monitor_geo=$(echo "$monitor" | awk '{print $3}') + x_begin=$(echo "$monitor_geo" | awk -F '+' '{print $2}') + y_begin=$(echo "$monitor_geo" | awk -F '+' '{print $3}') + x_width=$(echo "$monitor_geo" | awk -F 'x' '{print $1}') + y_height=$(echo "$monitor_geo" | awk -F 'x|+' '{print $2}') + x_end=$((x_begin+x_width)) + y_end=$((y_begin+y_height)) + if [[ $window_x -ge $x_begin ]] && [[ $window_x -lt $x_end ]] && \ + [[ $window_y -ge $y_begin ]] && [[ $window_y -lt $y_end ]]; then + current_monitor=$(echo "$monitor" | awk '{print $1}') + break + fi + done <<< "$monitors_info" + fi # update x and y offsets, so that will appear on correct screen # (required for some WMs apparently, but not for others)