From aa40ae1a78eafdc9abb8e6b1577eea2f09ecfeb9 Mon Sep 17 00:00:00 2001 From: Daniel Napora Date: Wed, 30 Sep 2020 22:44:41 +0200 Subject: [PATCH] jgtile helper --- bin/jgtile | 29 ++ bin/mb-jgtools | 22 +- bin/winfuncs | 438 +++++++++++++++++++++++++++++++ mb-jgtools/jgtile/cascade.png | Bin 0 -> 654 bytes mb-jgtools/jgtile/stacktwo.png | Bin 0 -> 620 bytes mb-jgtools/jgtile/tile.png | Bin 0 -> 628 bytes mb-jgtools/jgtile/tilethree.png | Bin 0 -> 643 bytes mb-jgtools/jgtile/tilethreev.png | Bin 0 -> 633 bytes mb-jgtools/jgtile/tiletwo.png | Bin 0 -> 624 bytes mb-jgtools/jgtile/tiletwol.png | Bin 0 -> 630 bytes mb-jgtools/jgtile/tiletwor.png | Bin 0 -> 632 bytes 11 files changed, 486 insertions(+), 3 deletions(-) create mode 100755 bin/jgtile create mode 100755 bin/winfuncs create mode 100644 mb-jgtools/jgtile/cascade.png create mode 100644 mb-jgtools/jgtile/stacktwo.png create mode 100644 mb-jgtools/jgtile/tile.png create mode 100644 mb-jgtools/jgtile/tilethree.png create mode 100644 mb-jgtools/jgtile/tilethreev.png create mode 100644 mb-jgtools/jgtile/tiletwo.png create mode 100644 mb-jgtools/jgtile/tiletwol.png create mode 100644 mb-jgtools/jgtile/tiletwor.png diff --git a/bin/jgtile b/bin/jgtile new file mode 100755 index 0000000..ea2eeaf --- /dev/null +++ b/bin/jgtile @@ -0,0 +1,29 @@ +#!/bin/bash +# jgtile - jgmenu simple gui for winfuncs tile script + + +. /usr/bin/pipemenu-standalone.cfg + +ICONDIR="/usr/share/mb-jgtools/jgtile" +MENU_PADDING_TOP=0 +MENU_HALIGN="center" +MENU_VALIGN="center" +#JGWIDTH=175 +jgmenu_item_height=30 +jgmenu_icon_size=40 +mkconfigfile + + +cat < ${MENU_ITEMS} +^sep(Tile helper (W-A-t)) +Tile,winfuncs tile,$ICONDIR/tile.png +Tile Two (equal),winfuncs tiletwo,$ICONDIR/tiletwo.png +Tile Two (Left wider),winfuncs tiletwol,$ICONDIR/tiletwol.png +Tile Two (Right wider),winfuncs tiletwor,$ICONDIR/tiletwor.png +Tile Three,winfuncs tilethree,$ICONDIR/tilethree.png +Tile Three vertical,winfuncs tilethreev,$ICONDIR/tilethreev.png +Stack Two, winfuncs stacktwo,$ICONDIR/stacktwo.png +Cascade, winfuncs cascade,$ICONDIR/cascade.png +EOF +jgmenu --config-file=${CONFIG_FILE} --csv-file=${MENU_ITEMS} 2>/dev/null +exit 0 diff --git a/bin/mb-jgtools b/bin/mb-jgtools index 65be2c5..40579a4 100755 --- a/bin/mb-jgtools +++ b/bin/mb-jgtools @@ -689,9 +689,6 @@ TABS="90" [ $jgmenu_use_icons == false ] && jgmenu_icon_size=0 #jgmenu_icon_size=20 - - - mkconfigfile cat < ${MENU_ITEMS} @@ -703,6 +700,23 @@ EOF jgmenu --config-file=${CONFIG_FILE} --csv-file=${MENU_ITEMS} 2>/dev/null } +update() { +case $LANG in + pl*) + rsync -a /usr/share/mabox/lang/pl/.config/mabox/settings* $HOME/.config/mabox/ + ;; + es*) + rsync -a /usr/share/mabox/lang/es/.config/mabox/settings* $HOME/.config/mabox/ + ;; + *) + rsync -a /usr/share/mabox/lang/en/.config/mabox/settings* $HOME/.config/mabox/ + ;; +esac +mb-setvar places_softwarepipe=true +mb-setvar places_sysinfopipe=true +mb-setvar places_menusettingspipe=true +} + #--------------------------------------------------------------------+ #Color picker, usage: printf $BLD$CUR$RED$BBLU'Hello World!'$DEF | #-------------------------+--------------------------------+---------+ @@ -738,6 +752,7 @@ case "$1" in settings) settings "$2";; screenshot) screenshot;; places) places;; + update) update;; *) echo -e " ${GRN}Kolekcja narzędzi dla Mabox-a stworzonych z pomocą Jgmenu @@ -753,6 +768,7 @@ ${YLW} >${RED} right ${YLW} -${DEF} right panel ${YLW} >${RED} places ${YLW} -${DEF} places - left sidepanel ${YLW} >${RED} mblogout ${YLW} -${DEF} run logout script ${YLW} >${RED} screenshot ${YLW} -${DEF} run screenshot script +${YLW} >${RED} update ${YLW} -${DEF} update settings " >&2 exit 1 ;; diff --git a/bin/winfuncs b/bin/winfuncs new file mode 100755 index 0000000..9275e23 --- /dev/null +++ b/bin/winfuncs @@ -0,0 +1,438 @@ +#!/bin/bash + +#todo: +# cancel for tile function +# determine what windows are maximized and re-max after the "window select" function +# determine what windows are non-resizable by the user so that the script doesn't resize them +# cascade also shaded windows + +# winfuncsh select +# winfuncs tile +# winfuncs tiletwo +# winfuncs tiletwol +# winfuncs tiletwor +# winfuncs tilethree +# winfuncs tilethreev +# winfuncs stacktwo +# winfuncs cascade +# winfuncs showdesktop + +# set gaps (0 removes gaps) +outer_gaps=2 +inner_gaps=2 + +# set gaps for 'select' mode +expose_gaps=20 + +# set desktop dimensions +display_width=$(xdotool getdisplaygeometry | cut -d" " -f1) +display_height=$(xdotool getdisplaygeometry | cut -d" " -f2) + +# desktop height without panel(s) +desktop_height=$(xprop -root _NET_WORKAREA | awk '{ print $6 }' | cut -d"," -f1) + +# window decorations +window_id=$(xdotool getactivewindow) +titlebar_offset=$(xwininfo -id "$window_id" | awk '/Relative upper-left Y:/ { print $4 }') + +# top panel +top_bar=$(xprop -root _NET_WORKAREA | awk '{ print $4 }' | cut -d"," -f1) + +# bottom panel (not needed) +bottom_bar=`expr $display_height - $desktop_height - $top_bar` + +function get_desktop_dim { + if (( ${#DIM[@]} == 0 )) ; then + DIM=(`expr $display_width - $outer_gaps \* 2` `expr $desktop_height - $outer_gaps \* 2`) + fi +} + +# which workspace we're on +function get_workspace { + if [[ "$DTOP" == "" ]] ; then + DTOP=`xdotool get_desktop` + fi +} + +function is_desktop { + xwininfo -id "$*" | grep '"Desktop"' + return "$?" +} + +function get_visible_window_ids { + if (( ${#WDOWS[@]} == 0 )) ; then + WDOWS=(`xdotool search --desktop $DTOP --onlyvisible "" 2>/dev/null`) + fi +} + +function win_showdesktop { + get_workspace + get_visible_window_ids + + command="search --desktop $DTOP \"\"" + + if (( ${#WDOWS[@]} > 0 )) ; then + command="$command windowminimize %@" + else + command="$command windowraise %@" + fi + + echo "$command" | xdotool - +} + +function win_tile_two { + get_desktop_dim + + wid1=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid1" && return + + wid2=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid2" && return + + half_w=`expr ${DIM[0]} / 2` + win_h=${DIM[1]} + + commands="windowsize $wid1 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowsize $wid2 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowmove $wid1 $outer_gaps `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid2 `expr $half_w + $outer_gaps + $inner_gaps` `expr $top_bar + $outer_gaps`" + commands="$commands windowraise $wid1" + commands="$commands windowraise $wid2" + + wmctrl -i -r $wid1 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid2 -b remove,maximized_vert,maximized_horz + + echo "$commands" | xdotool - +} + +function win_tile_two_left { + get_desktop_dim + + wid1=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid1" && return + + wid2=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid2" && return + + half_w=`expr ${DIM[0]} / 3` + win_h=${DIM[1]} + + commands="windowsize $wid1 `expr $half_w \* 2 - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowsize $wid2 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowmove $wid1 $outer_gaps `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid2 `expr $half_w \* 2 + $outer_gaps + $inner_gaps` `expr $top_bar + $outer_gaps`" + commands="$commands windowraise $wid1" + commands="$commands windowraise $wid2" + + wmctrl -i -r $wid1 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid2 -b remove,maximized_vert,maximized_horz + + echo "$commands" | xdotool - +} + +function win_tile_two_right { + get_desktop_dim + + wid1=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid1" && return + + wid2=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid2" && return + + half_w=`expr ${DIM[0]} / 3` + win_h=${DIM[1]} + + commands="windowsize $wid1 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowsize $wid2 `expr $half_w \* 2 - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowmove $wid1 $outer_gaps `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid2 `expr $half_w + $outer_gaps + $inner_gaps` `expr $top_bar + $outer_gaps`" + commands="$commands windowraise $wid1" + commands="$commands windowraise $wid2" + + wmctrl -i -r $wid1 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid2 -b remove,maximized_vert,maximized_horz + + echo "$commands" | xdotool - +} + +function win_stack_two { + get_desktop_dim + + wid1=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid1" && return + + wid2=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid2" && return + + win_w=${DIM[0]} + half_h=`expr ${DIM[1]} / 2` + + commands="windowsize $wid1 `expr $win_w` `expr $half_h - $titlebar_offset - $inner_gaps`" + commands="$commands windowsize $wid2 `expr $win_w` `expr $half_h - $titlebar_offset - $inner_gaps`" + commands="$commands windowmove $wid1 $outer_gaps `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid2 $outer_gaps `expr $half_h + $top_bar + $outer_gaps + $inner_gaps`" + commands="$commands windowraise $wid1" + commands="$commands windowraise $wid2" + + wmctrl -i -r $wid1 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid2 -b remove,maximized_vert,maximized_horz + + echo "$commands" | xdotool - +} + + +function win_tile_three { + get_desktop_dim + + wid1=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid1" && return + + wid2=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid2" && return + + wid3=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid3" && return + + win_h=${DIM[1]} + half_w=`expr ${DIM[0]} / 2` + half_h=`expr ${win_h} / 2` + + commands="windowsize $wid1 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowsize $wid2 `expr $half_w - $inner_gaps` `expr $half_h - $titlebar_offset - $inner_gaps`" + commands="$commands windowsize $wid3 `expr $half_w - $inner_gaps` `expr $half_h - $titlebar_offset - $inner_gaps`" + commands="$commands windowmove $wid1 $outer_gaps `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid2 `expr $half_w + $outer_gaps + $inner_gaps` `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid3 `expr $half_w + $outer_gaps + $inner_gaps` `expr $half_h + $top_bar + $outer_gaps + $inner_gaps`" + commands="$commands windowraise $wid1" + commands="$commands windowraise $wid2" + commands="$commands windowraise $wid3" + + wmctrl -i -r $wid1 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid2 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid3 -b remove,maximized_vert,maximized_horz + + echo "$commands" | xdotool - +} + +function win_tile_three_v { + get_desktop_dim + + wid1=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid1" && return + + wid2=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid2" && return + + wid3=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid3" && return + + win_h=${DIM[1]} + half_w=`expr ${DIM[0]} / 3` + + commands="windowsize $wid1 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowsize $wid2 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowsize $wid3 `expr $half_w - $inner_gaps` `expr $win_h - $titlebar_offset`" + commands="$commands windowmove $wid1 $outer_gaps `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid2 `expr $half_w + $outer_gaps + $inner_gaps / 2` `expr $top_bar + $outer_gaps`" + commands="$commands windowmove $wid3 `expr $half_w \* 2 + $outer_gaps + $inner_gaps` `expr $top_bar + $outer_gaps`" + commands="$commands windowraise $wid1" + commands="$commands windowraise $wid2" + commands="$commands windowraise $wid3" + + wmctrl -i -r $wid1 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid2 -b remove,maximized_vert,maximized_horz + wmctrl -i -r $wid3 -b remove,maximized_vert,maximized_horz + + echo "$commands" | xdotool - +} + +function win_tile { + get_workspace + get_visible_window_ids + + (( ${#WDOWS[@]} < 1 )) && return; + + get_desktop_dim + + # determine how many rows and columns we need + cols=`echo "sqrt(${#WDOWS[@]})" | bc` + rows=$cols + wins=`expr $rows \* $cols` + + if (( "$wins" < "${#WDOWS[@]}" )) ; then + cols=`expr $cols + 1` + wins=`expr $rows \* $cols` + if (( "$wins" < "${#WDOWS[@]}" )) ; then + rows=`expr $rows + 1` + wins=`expr $rows \* $cols` + fi + fi + + (( $cols < 1 )) && cols=1; + (( $rows < 1 )) && rows=1; + + win_w=`expr ${DIM[0]} / $cols` + win_h=`expr ${DIM[1]} / $rows` + + # do tiling + x=0; y=0; commands="" + for window in ${WDOWS[@]} ; do + wmctrl -i -r $window -b remove,maximized_vert,maximized_horz + + commands="$commands windowsize $window `expr $win_w - $inner_gaps \* 2` `expr $win_h - $titlebar_offset - $inner_gaps \* 2`" + commands="$commands windowmove $window `expr $x \* $win_w + $outer_gaps` `expr $y \* $win_h + $top_bar + $outer_gaps`" + + x=`expr $x + 1` + if (( $x > `expr $cols - 1` )) ; then + x=0 + y=`expr $y + 1` + fi + done + + echo "$commands" | xdotool - +} + +function expose { + get_workspace + get_visible_window_ids + + (( ${#WDOWS[@]} < 1 )) && return; + + get_desktop_dim + + # determine how many rows and columns we need + cols=`echo "sqrt(${#WDOWS[@]})" | bc` + rows=$cols + wins=`expr $rows \* $cols` + + if (( "$wins" < "${#WDOWS[@]}" )) ; then + cols=`expr $cols + 1` + wins=`expr $rows \* $cols` + if (( "$wins" < "${#WDOWS[@]}" )) ; then + rows=`expr $rows + 1` + wins=`expr $rows \* $cols` + fi + fi + + (( $cols < 1 )) && cols=1; + (( $rows < 1 )) && rows=1; + + win_w=`expr ${DIM[0]} / $cols` + win_h=`expr ${DIM[1]} / $rows` + + # do tiling + x=0; y=0; commands="" + for window in ${WDOWS[@]} ; do + wmctrl -i -r $window -b remove,maximized_vert,maximized_horz + + commands="$commands windowsize $window `expr $win_w - $expose_gaps \* 2` `expr $win_h - $titlebar_offset - $expose_gaps \* 2`" + commands="$commands windowmove $window `expr $x \* $win_w + $expose_gaps` `expr $y \* $win_h + $top_bar + $expose_gaps`" + + x=`expr $x + 1` + if (( $x > `expr $cols - 1` )) ; then + x=0 + y=`expr $y + 1` + fi + done + + echo "$commands" | xdotool - +} + +function win_cascade { + get_workspace + get_visible_window_ids + + (( ${#WDOWS[@]} < 1 )) && return; + + x=0; y=0; commands="" + for window in ${WDOWS[@]} ; do + wmctrl -i -r $window -b remove,maximized_vert,maximized_horz + + commands="$commands windowsize $window 1024 640" + commands="$commands windowmove $window `expr $x + $outer_gaps` `expr $y + $top_bar + $outer_gaps`" + + x=`expr $x + 100` + y=`expr $y + 80` + done + + echo "$commands" | xdotool - +} + +function win_select { + get_workspace + get_visible_window_ids + + (( ${#WDOWS[@]} < 1 )) && return; + + # store window positions and widths + i=0 + for window in ${WDOWS[@]} ; do + GEO=`xdotool getwindowgeometry $window | grep Geometry | sed 's/.* \([0-9].*\)/\1/g'`; + height[$i]=`echo $GEO | sed 's/\(.*\)x.*/\1/g'` + width[$i]=`echo $GEO | sed 's/.*x\(.*\)/\1/g'` + + # ( xwininfo gives position not ignoring titlebars and borders, unlike xdotool ) + POS=(`xwininfo -stats -id $window | grep 'geometry ' | sed 's/.*[-+]\([0-9]*[-+][0-9*]\)/\1/g' | sed 's/[+-]/ /g'`) + posx[$i]=${POS[0]} + posy[$i]=${POS[1]} + + i=`expr $i + 1` + done + + # tile windows + expose + + # select a window + wid=`xdotool selectwindow 2>/dev/null` + + is_desktop "$wid" && return + + # restore window positions and widths + i=0; commands="" + for (( i=0; $i<${#WDOWS[@]}; i++ )) ; do + commands="$commands windowsize ${WDOWS[i]} ${height[$i]} ${width[$i]}" + commands="$commands windowmove ${WDOWS[i]} ${posx[$i]} ${posy[$i]}" + done + + commands="$commands windowraise $wid" + + echo "$commands" | xdotool - +} + +for command in ${@} ; do + if [[ "$command" == "tile" ]] ; then + win_tile + elif [[ "$command" == "select" ]] ; then + win_select + elif [[ "$command" == "tiletwo" ]] ; then + win_tile_two + elif [[ "$command" == "tiletwol" ]] ; then + win_tile_two_left + elif [[ "$command" == "tiletwor" ]] ; then + win_tile_two_right + elif [[ "$command" == "stacktwo" ]] ; then + win_stack_two + elif [[ "$command" == "tilethree" ]] ; then + win_tile_three + elif [[ "$command" == "tilethreev" ]] ; then + win_tile_three_v + elif [[ "$command" == "cascade" ]] ; then + win_cascade + elif [[ "$command" == "showdesktop" ]] ; then + win_showdesktop + fi +done diff --git a/mb-jgtools/jgtile/cascade.png b/mb-jgtools/jgtile/cascade.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa244dac5209bfbdfd188f3bf1965da803acffd GIT binary patch literal 654 zcmV;90&)F`P)X0004kX+uL$Nkc;* zaB^>EX>4Tx04R}tkxeK>Q5c4w8RRFEg;_|_U0`KONR|vGHEJ4^!NR?F%usXhO!tm# zES0UY@Ut;k*jTf*uvJR=DOp)s5gY0H&dk(IGESY&(|f-6?K|HAe?DzmZfze}cFu`S zgtfW&yjK50Bb@~Bfo{6l(P%V6)%AI&>fkn{vZ~kpxdMr0*94y?JYr^@obZzH(0VSb zcuzQJuILHjGvQuG8Wes|x>4j;#i;`ORc6qciH!*dg|$=#8x?G>IF|6Ba96^zCEq_+ zi4#a4RFEcK~g*t~4dPAgq@2NO&(MHCH#HC9QJBP6FSic3uH!&Ut41%FgrhPYNS z#W79>3%%e+{lV|qy2*k5Vp4M$>YhFCy&LLx;CtKizK%Ta`xt7T;L zbsa*>CY)cDHDebpwxI1Xt2=r@s*&waCgJT=z9|l^H_)_DoLlLhlY5wvSw*g4{{VVY zlD$~v-3^s<`?sbvzaQ@-a&j;r!9M^100v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF->w9u6@c${VIK0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbNXh}ptR9M69mN5WV9gn)@6+7TZRa`WxI05%c6${$5 oQH$!9{Dw83#jSK3V~jC377q9xAV%Pyn*aa+07*qoM6N<$f=MSBH~;_u literal 0 HcmV?d00001 diff --git a/mb-jgtools/jgtile/stacktwo.png b/mb-jgtools/jgtile/stacktwo.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5b90242d07cfe90c9d245e52b5fa47b612f64d GIT binary patch literal 620 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 literal 0 HcmV?d00001 diff --git a/mb-jgtools/jgtile/tilethreev.png b/mb-jgtools/jgtile/tilethreev.png new file mode 100644 index 0000000000000000000000000000000000000000..500b8703f4fd0fbf0c7b7bf9e642871dbf169808 GIT binary patch literal 633 zcmV-<0*3vGP)X0004kX+uL$Nkc;* zaB^>EX>4Tx04R}tkxeK>Q5c4w8RRFEg;_|_U0`KONR|vGHEJ4^!NR?F%usXhO!tm# zES0UY@Ut;k*jTf*uvJR=DOp)s5gY0H&dk(IGESY&(|f-6?K|HAe?DzmZfze}cFu`S zgtfW&yjK50Bb@~Bfo{6l(P%V6)%AI&>fkn{vZ~kpxdMr0*94y?JYr^@obZzH(0VSb zcuzQJuILHjGvQuG8Wes|x>4j;#i;`ORc6qciH!*dg|$=#8x?G>IF|6Ba96^zCEq_+ zi4#a4RFEcK~g*t~4dPAgq@2NO&(MHCH#HC9QJBP6FSic3uH!&Ut41%FgrhPYNS z#W79>3%%e+{lV|qy2*k5Vp4M$>YhFCy&LLx;CtKizK%Ta`xt7T;L zbsa*>CY)cDHDebpwxI1Xt2=r@s*&waCgJT=z9|l^H_)_DoLlLhlY5wvSw*g4{{VVY zlD$~v-3^s<`?sbvzaQ@-a&j;r!9M^100v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF->w9u6uHgq1+A0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbNQ%OWYR9M69*s%)0APfM}Q~LkEoGuC-OX0004kX+uL$Nkc;* zaB^>EX>4Tx04R}tkxeK>Q5c4w8RRFEg;_|_U0`KONR|vGHEJ4^!NR?F%usXhO!tm# zES0UY@Ut;k*jTf*uvJR=DOp)s5gY0H&dk(IGESY&(|f-6?K|HAe?DzmZfze}cFu`S zgtfW&yjK50Bb@~Bfo{6l(P%V6)%AI&>fkn{vZ~kpxdMr0*94y?JYr^@obZzH(0VSb zcuzQJuILHjGvQuG8Wes|x>4j;#i;`ORc6qciH!*dg|$=#8x?G>IF|6Ba96^zCEq_+ zi4#a4RFEcK~g*t~4dPAgq@2NO&(MHCH#HC9QJBP6FSic3uH!&Ut41%FgrhPYNS z#W79>3%%e+{lV|qy2*k5Vp4M$>YhFCy&LLx;CtKizK%Ta`xt7T;L zbsa*>CY)cDHDebpwxI1Xt2=r@s*&waCgJT=z9|l^H_)_DoLlLhlY5wvSw*g4{{VVY zlD$~v-3^s<`?sbvzaQ@-a&j;r!9M^100v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF->w9u5%=+abeF0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbNN=ZaPR9M69*s%!!AP@w>RqVgzH#IOkL3FQxW#F@i%hv!X zDpWhuiv-t3u-9)tu|RP@q780tE^b_%m=szX6-i!1J3*#SkoX-UO}y0000< KMNUMnLSTa3s|b<+ literal 0 HcmV?d00001 diff --git a/mb-jgtools/jgtile/tiletwol.png b/mb-jgtools/jgtile/tiletwol.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4e4470c693b19a3041ab6ba96628c3d948ede0 GIT binary patch literal 630 zcmV-+0*U>JP)X0004kX+uL$Nkc;* zaB^>EX>4Tx04R}tkxeK>Q5c4w8RRFEg;_|_U0`KONR|vGHEJ4^!NR?F%usXhO!tm# zES0UY@Ut;k*jTf*uvJR=DOp)s5gY0H&dk(IGESY&(|f-6?K|HAe?DzmZfze}cFu`S zgtfW&yjK50Bb@~Bfo{6l(P%V6)%AI&>fkn{vZ~kpxdMr0*94y?JYr^@obZzH(0VSb zcuzQJuILHjGvQuG8Wes|x>4j;#i;`ORc6qciH!*dg|$=#8x?G>IF|6Ba96^zCEq_+ zi4#a4RFEcK~g*t~4dPAgq@2NO&(MHCH#HC9QJBP6FSic3uH!&Ut41%FgrhPYNS z#W79>3%%e+{lV|qy2*k5Vp4M$>YhFCy&LLx;CtKizK%Ta`xt7T;L zbsa*>CY)cDHDebpwxI1Xt2=r@s*&waCgJT=z9|l^H_)_DoLlLhlY5wvSw*g4{{VVY zlD$~v-3^s<`?sbvzaQ@-a&j;r!9M^100v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF->w9u5>4yo}>^0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbNP)S5VR9M69*Fg#ZAP7X!DZ2laZBx)TLlOG3Hs^t>q~d9k zB$EZV_L&&W5FkK+009C72oNAZfB=664%e^$C0RXLnTtjcEcWR> QSO5S307*qoM6N<$f*YX?C;$Ke literal 0 HcmV?d00001 diff --git a/mb-jgtools/jgtile/tiletwor.png b/mb-jgtools/jgtile/tiletwor.png new file mode 100644 index 0000000000000000000000000000000000000000..085d18a04b8a0ecf2c7e65a3798a4a48561bfbdb GIT binary patch literal 632 zcmV-;0*C#HP)X0004kX+uL$Nkc;* zaB^>EX>4Tx04R}tkxeK>Q5c4w8RRFEg;_|_U0`KONR|vGHEJ4^!NR?F%usXhO!tm# zES0UY@Ut;k*jTf*uvJR=DOp)s5gY0H&dk(IGESY&(|f-6?K|HAe?DzmZfze}cFu`S zgtfW&yjK50Bb@~Bfo{6l(P%V6)%AI&>fkn{vZ~kpxdMr0*94y?JYr^@obZzH(0VSb zcuzQJuILHjGvQuG8Wes|x>4j;#i;`ORc6qciH!*dg|$=#8x?G>IF|6Ba96^zCEq_+ zi4#a4RFEcK~g*t~4dPAgq@2NO&(MHCH#HC9QJBP6FSic3uH!&Ut41%FgrhPYNS z#W79>3%%e+{lV|qy2*k5Vp4M$>YhFCy&LLx;CtKizK%Ta`xt7T;L zbsa*>CY)cDHDebpwxI1Xt2=r@s*&waCgJT=z9|l^H_)_DoLlLhlY5wvSw*g4{{VVY zlD$~v-3^s<`?sbvzaQ@-a&j;r!9M^100v@9M??Vs0RI60puMM)00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF->w9u5>YU|R0E0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbNQb|NXR9M69*gFaUAPfZ2QM~_^wa~&giV$#8=kp-lLh>pA zbb4^=Y%Z>wcS48u-j~3&yJml}K!E}U3KS?%pg@5F1qu}SGq7E!1h3@@%iL=Y@l SVY`a}0000