From f6f748392f95c0e3394d357f8543a255bafe0537 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 13:12:47 +0200 Subject: [PATCH 1/8] Remove accidentally added archive Fixes: d8a675b63e46 ("Spit one blank when printing odd number of pages") --- manual_duplex_linux_1.0.tar.gz | Bin 112640 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 manual_duplex_linux_1.0.tar.gz diff --git a/manual_duplex_linux_1.0.tar.gz b/manual_duplex_linux_1.0.tar.gz deleted file mode 100644 index bea03c6b0624ddc60524808917ea09e28700ba4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112640 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�v|(=#nI4L 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 RQecn*gA^E~z<&e<{tI+mFPs1X From 916d5ca798f8cc3707de7ac8f6f876747fa6bd65 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 13:42:00 +0200 Subject: [PATCH 2/8] Reformat scripts Run scripts thru shfmt and fix log messages. --- install.sh | 44 ++-- usr/lib/cups/backend/duplex-print | 336 +++++++++++++++--------------- 2 files changed, 187 insertions(+), 193 deletions(-) mode change 100755 => 100644 usr/lib/cups/backend/duplex-print diff --git a/install.sh b/install.sh index 8a8db35..e78fc18 100755 --- a/install.sh +++ b/install.sh @@ -8,12 +8,12 @@ echo if [ $(logname) == root ]; then echo "Don't run this as root" - echo "" + echo exit 1 fi if [ $(whoami) != root ]; then echo "Use sudo to become root." - echo "" + echo exit 1 fi @@ -22,18 +22,18 @@ fi # all_users=$(awk -F: '($3>=1000)&&($1!="nobody"){print $1}' /etc/passwd) check_dependencies() { - local missing=0 - for cmd in pdfinfo zenity lp seq paste awk grep; do - if ! command -v "$cmd" >/dev/null 2>&1; then - LOG "Error: Required command '$cmd' not found." - missing=1 - fi - done - if (( missing )); then - echo "Missing required dependencies. See $LogFile for details." >&2 - exit 1 + local missing=0 + for cmd in pdfinfo zenity lp seq paste awk grep; do + if ! command -v "$cmd" > /dev/null 2>&1; then + echo "Error: Required command '$cmd' not found." + missing=1 fi - echo "Finished dependency check." + done + if ((missing)); then + echo "Missing required dependencies." >&2 + exit 1 + fi + echo "Finished dependency check." } check_dependencies @@ -44,9 +44,8 @@ echo "These are your installed printers:" echo declare printers_array i=0 -for p in $all_printers -do - i=$(( $i + 1 )) +for p in $all_printers; do + i=$(($i + 1)) echo $i. $p printers_array[$i]=$p done @@ -59,8 +58,7 @@ first_printer=${printers_array[$chosen_printer]} function setup_duplexer { first_printer=$1 - if [ -z "$first_printer" ] - then + if [ -z "$first_printer" ]; then echo "No printer submitted. You trickster!" exit 1 else @@ -117,7 +115,7 @@ function setup_duplexer { cp -praf /etc/cups/ppd/$first_printer.ppd /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd -# sed -i 's/"0 hpcups"/"duplex_print_filter"/g' /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd + # sed -i 's/"0 hpcups"/"duplex_print_filter"/g' /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd sed -i '/^*cupsFilter/d' /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd echo '*cupsFilter: "application/pdf 0 duplex_print_filter"' >> /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd @@ -126,7 +124,6 @@ function setup_duplexer { echo '*cupsFilter: "application/vnd.cups-raster 0 duplex_print_filter"' >> /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd echo '*cupsFilter: "application/vnd.cups-pdf 0 duplex_print_filter"' >> /etc/cups/ppd/Manual_Duplexer_$first_printer.ppd - sleep 1 service cups restart &> /dev/null @@ -154,13 +151,12 @@ echo echo "(Y/N) followed by [ENTER]:" read approve -if [ $approve == "Y" ] -then +if [ $approve == "Y" ]; then echo echo echo - setup_duplexer $first_printer - else + setup_duplexer $first_printer +else echo echo "Nothing was changed. Maybe use capital Y ?" echo diff --git a/usr/lib/cups/backend/duplex-print b/usr/lib/cups/backend/duplex-print old mode 100755 new mode 100644 index 044fcbb..a1f5b99 --- a/usr/lib/cups/backend/duplex-print +++ b/usr/lib/cups/backend/duplex-print @@ -8,37 +8,36 @@ # Return even page numbers from 1..num_pages even_pages() { - num_pages=$1 - i=2 - out= - while [ "$i" -le "$num_pages" ]; do - out="${out}${i}," - i=$((i+2)) - done - printf '%s\n' "${out%,}" + num_pages=$1 + i=2 + out= + while [ "$i" -le "$num_pages" ]; do + out="${out}${i}," + i=$((i + 2)) + done + printf '%s\n' "${out%,}" } get_running_user() { - if [[ -n "$user" ]]; then - echo "$user" - return - fi - login=$(logname 2>/dev/null) - if [[ -n "$login" ]]; then - echo "$login" - return - fi - echo "$(whoami)" + if [[ -n "$user" ]]; then + echo "$user" + return + fi + login=$(logname 2> /dev/null) + if [[ -n "$login" ]]; then + echo "$login" + return + fi + echo "$(whoami)" } #Uncomment this to log to /var/log/cups/error_log LogFile=/var/log/cups/error_log LOG() { - echo "$(date) --- $@" >> $LogFile + echo "$(date) --- $@" >> $LogFile } # Output "Device Discovery" information on stdout: -if test "$#" = "0" -then +if test "$#" = "0"; then echo 'direct duplex-print "Unknown" "(!) Manual_duplexer unit for linux. (!)"' exit 0 fi @@ -62,19 +61,17 @@ filename="/var/spool/cups/duplex/$job.duplex" short_edge=0 long_edge=0 -LOG --- -LOG Starting duplexer job +LOG "---" +LOG "Starting duplexer job" LOG "Script called by $user and runs as $(whoami) with logname $(logname)" lp_args= -for opt in $options -do - lp_args="$lp_args -o $opt" +for opt in $options; do + lp_args="$lp_args -o $opt" done #test if file exists -while [ ! -f "$filename" ] -do +while [ ! -f "$filename" ]; do sleep 1 done @@ -85,175 +82,176 @@ LOG "page count: $page_count" export DISPLAY=$(who | grep "^$user" | awk '{print $NF}' | grep -oE ':[0-9]+') # Calculate width (Assuming you want one-third of the screen width) screen_width=$(sudo -u "$user" xdpyinfo -display "$DISPLAY" | awk '/dimensions:/ {print $2}' | cut -d'x' -f1) -zenity_width=$(( screen_width / 3 )) +zenity_width=$((screen_width / 3)) -if [ $(( $page_count )) -gt 1 ]; then - #show user interface - LOG "$(date) --- Will Show user interface to get page_edge." - LOG "$(date) --- Running on display number $DISPLAY" - # Display the Zenity dialog - button_clicked=$(sudo --user="$user" zenity --question \ - --switch \ - --title="$title" \ - --text="Which edge to choose for paper binding?\n\nFinding my work useful? Click here to buy me a coffee." \ - --icon-name="document-print" \ - --window-icon="/usr/share/manual_duplex_linux/printer.png" \ - --extra-button="Short_Edge" \ - --extra-button="Long_Edge" \ - --extra-button="Cancel" \ - --display="$DISPLAY" \ - --width="$zenity_width" 2>>"$LogFile") +if [ $(($page_count)) -gt 1 ]; then + #show user interface + LOG "Will Show user interface to get page_edge." + LOG "Running on display number $DISPLAY" + # Display the Zenity dialog + button_clicked=$(sudo --user="$user" zenity --question \ + --switch \ + --title="$title" \ + --text="Which edge to choose for paper binding?\n\nFinding my work useful? Click here to buy me a coffee." \ + --icon-name="document-print" \ + --window-icon="/usr/share/manual_duplex_linux/printer.png" \ + --extra-button="Short_Edge" \ + --extra-button="Long_Edge" \ + --extra-button="Cancel" \ + --display="$DISPLAY" \ + --width="$zenity_width" 2>> "$LogFile") - # Capture the exit status - last_command_return=$? - # Log that the user interface was shown - LOG "$(date) --- User interface has been shown. Zenity returned >> $last_command_return << and button_clicked >> $button_clicked << " + # Capture the exit status + last_command_return=$? + # Log that the user interface was shown + LOG "User interface has been shown. Zenity returned >> $last_command_return << and button_clicked >> $button_clicked <<" - # Handle the user's response - case "$button_clicked" in - Short_Edge) - LOG "$(date) --- Short edge has been chosen." - short_edge=1 - ;; - Long_Edge) - LOG "$(date) --- Long edge has been chosen." - long_edge=1 - ;; - Cancel) - LOG "$(date) --- Operation cancelled by user." - exit 1 - ;; - *) - LOG "$(date) --- An unexpected error occurred. Exit code: $last_command_return." - exit 1 - ;; - esac + # Handle the user's response + case "$button_clicked" in + Short_Edge) + LOG "Short edge has been chosen." + short_edge=1 + ;; + Long_Edge) + LOG "Long edge has been chosen." + long_edge=1 + ;; + Cancel) + LOG "Operation cancelled by user." + exit 1 + ;; + *) + LOG "An unexpected error occurred. Exit code: $last_command_return." + exit 1 + ;; + esac fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" #if only one page, just send the printing command -if [ $(( $page_count )) -eq 1 ]; then - LOG "printing ONE page" +if [ $(($page_count)) -eq 1 ]; then + LOG "printing ONE page" - lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o collate=true -t "$title"-even "$filename" >> "$LogFile" + lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o collate=true -t "$title"-even "$filename" >> "$LogFile" #if only 2 pages, print odd pages first and show user interface -elif [ $(( $page_count )) -eq 2 ]; then - LOG 2 pages were sent - LOG Printing odd pages. +elif [ $(($page_count)) -eq 2 ]; then + LOG "2 pages were sent" + LOG "Printing odd pages." - lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-set=odd -o collate=true -o outputorder=normal -t "$title"-odd "$filename" + lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-set=odd -o collate=true -o outputorder=normal -t "$title"-odd "$filename" - #show user interface - LOG Will Show user interface. - LOG Running on display number "$DISPLAY" - sudo --user="$user" zenity --question \ - --title="$title" \ - --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n - Finding my work usefull? Click here to buy me a cofee." \ - --icon-name="document-print" \ - --window-icon="/usr/share/manual_duplex_linux/printer.png" \ - --ok-label="Proceed" \ - --cancel-label="Cancel" \ - --display="$DISPLAY" \ - --width="$zenity_width" 2>>"$LogFile" + #show user interface + LOG "Will Show user interface." + LOG "Running on display number $DISPLAY" + sudo --user="$user" zenity --question \ + --title="$title" \ + --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n +Finding my work usefull? Click here to buy me a cofee." \ + --icon-name="document-print" \ + --window-icon="/usr/share/manual_duplex_linux/printer.png" \ + --ok-label="Proceed" \ + --cancel-label="Cancel" \ + --display="$DISPLAY" \ + --width="$zenity_width" 2>> "$LogFile" - # Capture the exit status - last_command_return=$? - # Log that the user interface was shown - LOG "$(date) --- User interface has been shown. Zenity returned >> $last_command_return << and button_clicked >> $button_clicked << " + # Capture the exit status + last_command_return=$? + # Log that the user interface was shown + LOG "User interface has been shown. Zenity returned >> $last_command_return <<" - if (($last_command_return==0)); then - LOG printing even pages - if [ $(( $short_edge )) -eq 1 ]; then - lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-ranges=2 -o orientation-requested=5 -o collate=true -o outputorder=normal -t "$title"-even "$filename" - else - lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-ranges=2 -o collate=true -o outputorder=normal -t "$title"-even "$filename" - fi + if (($last_command_return == 0)); then + LOG "printing even pages" + if [ $(($short_edge)) -eq 1 ]; then + lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-ranges=2 -o orientation-requested=5 -o collate=true -o outputorder=normal -t "$title"-even "$filename" else - LOG User aborted print job - rm "$filename" - exit 0 + lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-ranges=2 -o collate=true -o outputorder=normal -t "$title"-even "$filename" fi + else + LOG "User aborted print job" + rm "$filename" + exit 0 + fi #if more than 2 pages, print odd pages first and show user interface -elif [ $(( $page_count )) -gt 2 ]; then - LOG More than 2 pages were sent - LOG Printing odd pages. it is important for these to be printed first. Do not change this. +elif [ $(($page_count)) -gt 2 ]; then + LOG "More than 2 pages were sent" + LOG "Printing odd pages. it is important for these to be printed first. Do not change this." - lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-set=odd -o collate=true -o outputorder=normal -t "$title"-odd "$filename" + lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-set=odd -o collate=true -o outputorder=normal -t "$title"-odd "$filename" - #show user interface - LOG Will Show user interface. + #show user interface + LOG "Will Show user interface." - LOG Running on display number $DISPLAY - sudo --user="$user" zenity --question \ - --title="$title" \ - --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n - Finding my work usefull? Click here to buy me a cofee." \ - --icon-name="document-print" \ - --window-icon="/usr/share/manual_duplex_linux/printer.png" \ - --ok-label="Proceed" \ - --cancel-label="Cancel" \ - --display="$DISPLAY" \ - --width=$zenity_width 2>>"$LogFile" + LOG "Running on display number $DISPLAY" + sudo --user="$user" zenity --question \ + --title="$title" \ + --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n +Finding my work usefull? Click here to buy me a cofee." \ + --icon-name="document-print" \ + --window-icon="/usr/share/manual_duplex_linux/printer.png" \ + --ok-label="Proceed" \ + --cancel-label="Cancel" \ + --display="$DISPLAY" \ + --width=$zenity_width 2>> "$LogFile" - # Capture the exit status - last_command_return=$? - # Log that the user interface was shown - LOG "$(date) --- User interface has been shown. Zenity returned >> $last_command_return << and button_clicked >> $button_clicked << " + # Capture the exit status + last_command_return=$? + # Log that the user interface was shown + LOG "User interface has been shown. Zenity returned >> $last_command_return <<" - if (($last_command_return==0)); then - LOG printing even pages + if (($last_command_return == 0)); then + LOG "printing even pages" - if (( page_count % 2 != 0 )); then - LOG numpages is odd: one blank page will be printed after each copy. - # Multiple print jobs, otherwise external app is needed as pdftk - i=0 - while (( i < $numcopies )); do - if [ $(( $short_edge )) -eq 1 ]; then - lp -s -d $USE_PRINTER $lp_args \ - -o page-ranges="$(even_pages "$page_count")" \ - -o sides=one-sided -o orientation-requested=5 -o collate=true -o outputorder=normal -t "$title"-even \ - "$filename" - else - lp -s -d $USE_PRINTER $lp_args \ - -o page-ranges="$(even_pages "$page_count")" \ - -o sides=one-sided -o collate=true -o outputorder=normal -t "$title"-even \ - "$filename" - fi - lp -d $USE_PRINTER $SCRIPT_DIR/blank.pdf - (( i++ )) - done - else - LOG numpages is even: just one printjob for all copies - # Send to printer - if [ $(( $short_edge )) -eq 1 ]; then - lp -s -d $USE_PRINTER \ - -n "$numcopies" $lp_args \ - -o sides=one-sided \ - -o orientation-requested=5 \ - -o collate=true \ - -o outputorder=normal \ - -o page-ranges="$(even_pages "$page_count")" \ - -t "$title"-even \ - "$filename" - else - # a printat 3 even si a scos 1 goală - lp -s -d $USE_PRINTER \ - -n "$numcopies" $lp_args \ - -o page-ranges="$(even_pages "$page_count")" \ - -o sides=one-sided -o collate=true -o outputorder=normal -t "$title"-even \ - "$filename" - fi - fi + if ((page_count % 2 != 0)); then + LOG "numpages is odd: one blank page will be printed after each copy." + # Multiple print jobs, otherwise external app is needed as pdftk + i=0 + while ((i < $numcopies)); do + if [ $(($short_edge)) -eq 1 ]; then + lp -s -d $USE_PRINTER $lp_args \ + -o page-ranges="$(even_pages "$page_count")" \ + -o sides=one-sided -o orientation-requested=5 -o collate=true -o outputorder=normal -t "$title"-even \ + "$filename" + else + lp -s -d $USE_PRINTER $lp_args \ + -o page-ranges="$(even_pages "$page_count")" \ + -o sides=one-sided -o collate=true -o outputorder=normal -t "$title"-even \ + "$filename" + fi + lp -d $USE_PRINTER $SCRIPT_DIR/blank.pdf + ((i++)) + done else - LOG User aborted print job - rm "$filename" - exit 0 + LOG "numpages is even: just one printjob for all copies" + # Send to printer + if [ $(($short_edge)) -eq 1 ]; then + lp -s -d $USE_PRINTER \ + -n "$numcopies" $lp_args \ + -o sides=one-sided \ + -o orientation-requested=5 \ + -o collate=true \ + -o outputorder=normal \ + -o page-ranges="$(even_pages "$page_count")" \ + -t "$title"-even \ + "$filename" + else + # a printat 3 even si a scos 1 goală + lp -s -d $USE_PRINTER \ + -n "$numcopies" $lp_args \ + -o page-ranges="$(even_pages "$page_count")" \ + -o sides=one-sided -o collate=true -o outputorder=normal -t "$title"-even \ + "$filename" + fi fi + else + LOG "User aborted print job" + rm "$filename" + exit 0 + fi fi + # Cleanup trap 'rm -f "$filename"' exit 0 From 2a0dc96e7beeddfe1ccb91aaece961f6b66c2fbc Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 13:43:17 +0200 Subject: [PATCH 3/8] Quote filename to be copied --- usr/lib/cups/filter/duplex_print_filter | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/usr/lib/cups/filter/duplex_print_filter b/usr/lib/cups/filter/duplex_print_filter index f0f514e..98de7ff 100755 --- a/usr/lib/cups/filter/duplex_print_filter +++ b/usr/lib/cups/filter/duplex_print_filter @@ -1,5 +1,4 @@ -#! /bin/sh -#log to /var/log/cups/error_log +#!/bin/sh set -x # Command line arguments @@ -9,7 +8,7 @@ title="$3" numcopies="$4" options="$5" filename="$6" -cp -praf $filename "/var/spool/cups/duplex/$job.duplex" +cp -praf "$filename" "/var/spool/cups/duplex/$job.duplex" # Pass file through cat "$filename" From c8b7246d0fb964da37ba93515ac74308aa469251 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 16:53:06 +0200 Subject: [PATCH 4/8] Move donation text to variable --- usr/lib/cups/backend/duplex-print | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/usr/lib/cups/backend/duplex-print b/usr/lib/cups/backend/duplex-print index a1f5b99..b99706b 100644 --- a/usr/lib/cups/backend/duplex-print +++ b/usr/lib/cups/backend/duplex-print @@ -61,6 +61,8 @@ filename="/var/spool/cups/duplex/$job.duplex" short_edge=0 long_edge=0 +donation_text="Finding my work useful? Click here to buy me a coffee." + LOG "---" LOG "Starting duplexer job" LOG "Script called by $user and runs as $(whoami) with logname $(logname)" @@ -92,7 +94,7 @@ if [ $(($page_count)) -gt 1 ]; then button_clicked=$(sudo --user="$user" zenity --question \ --switch \ --title="$title" \ - --text="Which edge to choose for paper binding?\n\nFinding my work useful? Click here to buy me a coffee." \ + --text="Which edge to choose for paper binding?\n\n$donation_text" \ --icon-name="document-print" \ --window-icon="/usr/share/manual_duplex_linux/printer.png" \ --extra-button="Short_Edge" \ @@ -147,8 +149,7 @@ elif [ $(($page_count)) -eq 2 ]; then LOG "Running on display number $DISPLAY" sudo --user="$user" zenity --question \ --title="$title" \ - --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n -Finding my work usefull? Click here to buy me a cofee." \ + --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n$donation_text" \ --icon-name="document-print" \ --window-icon="/usr/share/manual_duplex_linux/printer.png" \ --ok-label="Proceed" \ @@ -187,8 +188,7 @@ elif [ $(($page_count)) -gt 2 ]; then LOG "Running on display number $DISPLAY" sudo --user="$user" zenity --question \ --title="$title" \ - --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n -Finding my work usefull? Click here to buy me a cofee." \ + --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n$donation_text" \ --icon-name="document-print" \ --window-icon="/usr/share/manual_duplex_linux/printer.png" \ --ok-label="Proceed" \ From 66eeafe022ac8516375d48e3c95bb2097644151d Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 16:42:52 +0200 Subject: [PATCH 5/8] Remove unused function --- usr/lib/cups/backend/duplex-print | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/usr/lib/cups/backend/duplex-print b/usr/lib/cups/backend/duplex-print index b99706b..72be4ce 100644 --- a/usr/lib/cups/backend/duplex-print +++ b/usr/lib/cups/backend/duplex-print @@ -18,19 +18,6 @@ even_pages() { printf '%s\n' "${out%,}" } -get_running_user() { - if [[ -n "$user" ]]; then - echo "$user" - return - fi - login=$(logname 2> /dev/null) - if [[ -n "$login" ]]; then - echo "$login" - return - fi - echo "$(whoami)" -} - #Uncomment this to log to /var/log/cups/error_log LogFile=/var/log/cups/error_log LOG() { @@ -64,8 +51,7 @@ long_edge=0 donation_text="Finding my work useful? Click here to buy me a coffee." LOG "---" -LOG "Starting duplexer job" -LOG "Script called by $user and runs as $(whoami) with logname $(logname)" +LOG "Starting duplexer job for user $user" lp_args= for opt in $options; do From 36cbbb5879b9ff521c17e5ba6a41bbf8963ea4dc Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 16:45:55 +0200 Subject: [PATCH 6/8] Replace deprecated zenity --icon-name with --icon --- usr/lib/cups/backend/duplex-print | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/usr/lib/cups/backend/duplex-print b/usr/lib/cups/backend/duplex-print index 72be4ce..56b983d 100644 --- a/usr/lib/cups/backend/duplex-print +++ b/usr/lib/cups/backend/duplex-print @@ -49,6 +49,7 @@ short_edge=0 long_edge=0 donation_text="Finding my work useful? Click here to buy me a coffee." +printer_icon="/usr/share/manual_duplex_linux/printer.png" LOG "---" LOG "Starting duplexer job for user $user" @@ -81,8 +82,7 @@ if [ $(($page_count)) -gt 1 ]; then --switch \ --title="$title" \ --text="Which edge to choose for paper binding?\n\n$donation_text" \ - --icon-name="document-print" \ - --window-icon="/usr/share/manual_duplex_linux/printer.png" \ + --icon="$printer_icon" \ --extra-button="Short_Edge" \ --extra-button="Long_Edge" \ --extra-button="Cancel" \ @@ -136,8 +136,7 @@ elif [ $(($page_count)) -eq 2 ]; then sudo --user="$user" zenity --question \ --title="$title" \ --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n$donation_text" \ - --icon-name="document-print" \ - --window-icon="/usr/share/manual_duplex_linux/printer.png" \ + --icon="$printer_icon" \ --ok-label="Proceed" \ --cancel-label="Cancel" \ --display="$DISPLAY" \ @@ -175,8 +174,7 @@ elif [ $(($page_count)) -gt 2 ]; then sudo --user="$user" zenity --question \ --title="$title" \ --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n$donation_text" \ - --icon-name="document-print" \ - --window-icon="/usr/share/manual_duplex_linux/printer.png" \ + --icon="$printer_icon" \ --ok-label="Proceed" \ --cancel-label="Cancel" \ --display="$DISPLAY" \ From 409508de56fc6a4f1d435ec461284573ddfc2cf4 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sat, 20 Jun 2026 19:27:07 +0200 Subject: [PATCH 7/8] Support Wayland Zenity --display option was removed and most distributions shifted to the Wayland display server. Attempt to detect Xwayland running and export relevant envinroment variables to zenity falling back to previous DISPLAY detection when Xwayland not detected. --- usr/lib/cups/backend/duplex-print | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/usr/lib/cups/backend/duplex-print b/usr/lib/cups/backend/duplex-print index 56b983d..995f7a2 100644 --- a/usr/lib/cups/backend/duplex-print +++ b/usr/lib/cups/backend/duplex-print @@ -67,16 +67,25 @@ done page_count=$(pdfinfo "$filename" | grep Pages | awk '{print $2}') LOG "page count: $page_count" -# Export display for zenity -export DISPLAY=$(who | grep "^$user" | awk '{print $NF}' | grep -oE ':[0-9]+') +# Export display for zenity +pid=$(pgrep -u $user Xwayland | head -n1) +if [ -n $pid ]; then + eval "$( + tr '\0' '\n' < /proc/$pid/environ | + grep -E '^(DISPLAY|WAYLAND_DISPLAY|XAUTHORITY|XDG_RUNTIME_DIR)=' + )" + export DISPLAY WAYLAND_DISPLAY XAUTHORITY XDG_RUNTIME_DIR +else + export DISPLAY=$(who | grep "^$user" | awk '{print $NF}' | grep -oE ':[0-9]+') +fi + # Calculate width (Assuming you want one-third of the screen width) screen_width=$(sudo -u "$user" xdpyinfo -display "$DISPLAY" | awk '/dimensions:/ {print $2}' | cut -d'x' -f1) zenity_width=$((screen_width / 3)) if [ $(($page_count)) -gt 1 ]; then #show user interface - LOG "Will Show user interface to get page_edge." - LOG "Running on display number $DISPLAY" + LOG "Showing user interface on DISPLAY=$DISPLAY to get page_edge." # Display the Zenity dialog button_clicked=$(sudo --user="$user" zenity --question \ --switch \ @@ -86,8 +95,7 @@ if [ $(($page_count)) -gt 1 ]; then --extra-button="Short_Edge" \ --extra-button="Long_Edge" \ --extra-button="Cancel" \ - --display="$DISPLAY" \ - --width="$zenity_width" 2>> "$LogFile") + --width=$zenity_width 2>> "$LogFile") # Capture the exit status last_command_return=$? @@ -131,16 +139,14 @@ elif [ $(($page_count)) -eq 2 ]; then lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-set=odd -o collate=true -o outputorder=normal -t "$title"-odd "$filename" #show user interface - LOG "Will Show user interface." - LOG "Running on display number $DISPLAY" + LOG "Showing user interface on DISPLAY=$DISPLAY." sudo --user="$user" zenity --question \ --title="$title" \ --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n$donation_text" \ --icon="$printer_icon" \ --ok-label="Proceed" \ --cancel-label="Cancel" \ - --display="$DISPLAY" \ - --width="$zenity_width" 2>> "$LogFile" + --width=$zenity_width 2>> "$LogFile" # Capture the exit status last_command_return=$? @@ -168,16 +174,13 @@ elif [ $(($page_count)) -gt 2 ]; then lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-set=odd -o collate=true -o outputorder=normal -t "$title"-odd "$filename" #show user interface - LOG "Will Show user interface." - - LOG "Running on display number $DISPLAY" + LOG "Showing user interface on DISPLAY=$DISPLAY" sudo --user="$user" zenity --question \ --title="$title" \ --text="Flip and reinsert the entire paper stack when printing has finished,\n\n then press Procceed.\n\n$donation_text" \ --icon="$printer_icon" \ --ok-label="Proceed" \ --cancel-label="Cancel" \ - --display="$DISPLAY" \ --width=$zenity_width 2>> "$LogFile" # Capture the exit status From 68ee9e25851e3b2cc11d3af75269774464f1f1c8 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Thu, 9 Jul 2026 15:08:13 +0200 Subject: [PATCH 8/8] Normalize conditions --- usr/lib/cups/backend/duplex-print | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/usr/lib/cups/backend/duplex-print b/usr/lib/cups/backend/duplex-print index 995f7a2..6c4d4aa 100644 --- a/usr/lib/cups/backend/duplex-print +++ b/usr/lib/cups/backend/duplex-print @@ -24,7 +24,7 @@ LOG() { echo "$(date) --- $@" >> $LogFile } # Output "Device Discovery" information on stdout: -if test "$#" = "0"; then +if [ "$#" = "0" ]; then echo 'direct duplex-print "Unknown" "(!) Manual_duplexer unit for linux. (!)"' exit 0 fi @@ -83,7 +83,7 @@ fi screen_width=$(sudo -u "$user" xdpyinfo -display "$DISPLAY" | awk '/dimensions:/ {print $2}' | cut -d'x' -f1) zenity_width=$((screen_width / 3)) -if [ $(($page_count)) -gt 1 ]; then +if [ "$page_count" -gt 1 ]; then #show user interface LOG "Showing user interface on DISPLAY=$DISPLAY to get page_edge." # Display the Zenity dialog @@ -126,13 +126,13 @@ fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" #if only one page, just send the printing command -if [ $(($page_count)) -eq 1 ]; then +if [ "$page_count" -eq 1 ]; then LOG "printing ONE page" lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o collate=true -t "$title"-even "$filename" >> "$LogFile" #if only 2 pages, print odd pages first and show user interface -elif [ $(($page_count)) -eq 2 ]; then +elif [ "$page_count" -eq 2 ]; then LOG "2 pages were sent" LOG "Printing odd pages." @@ -153,9 +153,9 @@ elif [ $(($page_count)) -eq 2 ]; then # Log that the user interface was shown LOG "User interface has been shown. Zenity returned >> $last_command_return <<" - if (($last_command_return == 0)); then + if [ "$last_command_return" -eq 0 ]; then LOG "printing even pages" - if [ $(($short_edge)) -eq 1 ]; then + if [ "$short_edge" -eq 1 ]; then lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-ranges=2 -o orientation-requested=5 -o collate=true -o outputorder=normal -t "$title"-even "$filename" else lp -s -d $USE_PRINTER -n "$numcopies" $lp_args -o page-ranges=2 -o collate=true -o outputorder=normal -t "$title"-even "$filename" @@ -167,7 +167,7 @@ elif [ $(($page_count)) -eq 2 ]; then fi #if more than 2 pages, print odd pages first and show user interface -elif [ $(($page_count)) -gt 2 ]; then +elif [ "$page_count" -gt 2 ]; then LOG "More than 2 pages were sent" LOG "Printing odd pages. it is important for these to be printed first. Do not change this." @@ -188,15 +188,15 @@ elif [ $(($page_count)) -gt 2 ]; then # Log that the user interface was shown LOG "User interface has been shown. Zenity returned >> $last_command_return <<" - if (($last_command_return == 0)); then + if [ "$last_command_return" -eq 0 ]; then LOG "printing even pages" - if ((page_count % 2 != 0)); then + if [ $((page_count % 2)) -ne 0 ]; then LOG "numpages is odd: one blank page will be printed after each copy." # Multiple print jobs, otherwise external app is needed as pdftk i=0 - while ((i < $numcopies)); do - if [ $(($short_edge)) -eq 1 ]; then + while [ "$i" -lt "$numcopies" ]; do + if [ "$short_edge" -eq 1 ]; then lp -s -d $USE_PRINTER $lp_args \ -o page-ranges="$(even_pages "$page_count")" \ -o sides=one-sided -o orientation-requested=5 -o collate=true -o outputorder=normal -t "$title"-even \ @@ -213,7 +213,7 @@ elif [ $(($page_count)) -gt 2 ]; then else LOG "numpages is even: just one printjob for all copies" # Send to printer - if [ $(($short_edge)) -eq 1 ]; then + if [ "$short_edge" -eq 1 ]; then lp -s -d $USE_PRINTER \ -n "$numcopies" $lp_args \ -o sides=one-sided \