diff --git a/Aminet/MintPRINT.readme b/Aminet/MintPRINT.readme index 81b233a..10a61f7 100644 --- a/Aminet/MintPRINT.readme +++ b/Aminet/MintPRINT.readme @@ -2,7 +2,7 @@ Short: IPP/AirPrint driver and setup tool Author: Darren Banfi (boingball) Uploader: boingball@gmail.com Type: driver/print -Version: 1.3.1 +Version: 1.3.2 Requires: 68000+; AmigaOS 2.04+; TCP/IP stack providing bsdsocket.library Architecture: m68k-amigaos >= 2.04 @@ -224,10 +224,13 @@ cross-project collaboration: sharing compatibility findings and recent fixes, allowing MintPRINT's implementation to be compared against AmiAirPrint, and helping identify gaps in classic application and printer compatibility. -What's new in 1.3.1 +What's new in 1.3.2 ------------------- - - Final driver revision 41.17. + - Final driver revision 41.19. + - Test Print uses the selected Unit1-Unit7 profile for that one job without + replacing the active Unit0 printer. + - Activating a saved unit accepts profiles stored in either ENV: or ENVARC:. - Query Printer selections for media/tray, colour, quality and scaling now save correctly, including on the AmigaOS 2.x-compatible event path. - View Spooler now shows the current RAM/T: job and retains a failed rendered diff --git a/CHANGELOG.md b/CHANGELOG.md index 85895db..c8e765f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,19 @@ Keep the full version-by-version history here. The front page and Aminet readme should carry only a short summary of the latest version, with a link to this page; replace that summary when preparing the next release. -[Unreleased](#unreleased) | [1.3.1](#131) | [1.3.0](#130) | [1.2.7](#127) | [1.2.6](#126) | [1.2.5](#125) | [1.2.4](#124) | [1.2.3](#123) | [1.2.2](#122) | [1.2.1](#121) | [1.2.0](#120) | [1.1.0](#110) | [1.0.3b](#103b) | [1.0.3](#103) | [1.0.2](#102) | [1.0.0](#100) +[1.3.2](#132) | [1.3.1](#131) | [1.3.0](#130) | [1.2.7](#127) | [1.2.6](#126) | [1.2.5](#125) | [1.2.4](#124) | [1.2.3](#123) | [1.2.2](#122) | [1.2.1](#121) | [1.2.0](#120) | [1.1.0](#110) | [1.0.3b](#103b) | [1.0.3](#103) | [1.0.2](#102) | [1.0.0](#100) -## Unreleased +## 1.3.2 +MintPRINT 1.3.2 is a corrective release for selected-unit testing and +saved-printer activation, with the latest printer compatibility fixes. + +- **Test Print now honours the selected printer profile (issue #75).** + Testing Unit1 through Unit7 uses that profile for the one test job while + leaving the active Unit0 printer unchanged. +- **Activation handles legacy saved profiles.** Unit activation now accepts a + profile present in either ENV: or ENVARC:, copying the readable source into + both Unit0 locations instead of failing with "could not copy Unit1 to Unit0". - **Engine-aware 360/720 DPI support (driver 41.19, issue #95).** Settings now accepts reported 360 and 720 DPI square modes and keeps generic printer resolutions separate from PWG Raster and Apple Raster capabilities. This prevents a generic high-resolution mode from being offered to a raster decoder that did not advertise it, while preserving the existing marked 300* compatibility override for confirmed printers. Asymmetric modes such as 1440x720 remain intentionally hidden until MintPRINT can represent independent X/Y DPI. - **Large jobs tolerate slow printer back-pressure (driver 41.18).** The diff --git a/README.md b/README.md index 49b9aa3..a7b7070 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,13 @@ MintPrint Settings for setup, discovery and test printing. image -## What's new in 1.3.1 +## What's new in 1.3.2 -- **Final driver revision 41.17.** +- **Final driver revision 41.19.** +- **Selected-unit Test Print:** testing Unit1-Unit7 uses that profile for the + one job without replacing the active Unit0 printer. +- **Reliable unit activation:** profiles stored in either ENV: or ENVARC: can + now be activated successfully. - **Query results now save correctly:** media/tray, colour, quality and scaling choices selected by **Query Printer** are synchronised with the Unit config, including on the AmigaOS 2.x-compatible event path. diff --git a/docs/MintPrintSettings.guide b/docs/MintPrintSettings.guide index 8c22b20..a45373c 100644 --- a/docs/MintPrintSettings.guide +++ b/docs/MintPrintSettings.guide @@ -519,6 +519,11 @@ a printer actually produces physical output before trying a real application - MultiView and Test Print both provide a much simpler baseline than a strip-printing application like Wordworth. +When Unit1 through Unit7 is selected, Test Print uses that profile for +this one job without replacing the active Unit0 profile. Normal +application printing continues to use Unit0 until you explicitly click +Activate. + An IPP job reporting success, or even a completed job state, is not by itself proof of a physical page - some printer firmware accepts a job and silently discards it. Treat an actual sheet of paper as the diff --git a/src/MintPrintSettings.c b/src/MintPrintSettings.c index 7591079..a6799bf 100644 --- a/src/MintPrintSettings.c +++ b/src/MintPrintSettings.c @@ -177,11 +177,19 @@ static int mp_test_print_extra_pages_requested = 0; static BOOL mp_test_print_skip_config_save = FALSE; static BOOL mp_test_suite_capture_mode = FALSE; +/* printer.device always loads MintPRINT's live Unit0 profile. A normal Test + * Print made while another GUI profile is selected therefore needs the same + * one-job override used by the regression suite; otherwise its page says + * "Unit1" while the job is actually sent to Unit0. */ +#define MP_TEST_PRINT_CONFIG ((CONST_STRPTR)"T:MintPRINT-testsuite.cfg") + // Saved printer profiles: ENV:MintPRINT/Unit0 .. Unit(MAX_UNITS-1). Only // Unit0 is what the driver actually reads at print time; the others are // switchable GUI-side profiles (e.g. for a second/third network printer). #define MAX_UNITS 8 +static BOOL mp_copy_file(CONST_STRPTR src, CONST_STRPTR dst); + /* A few pixels below the Test Print/Debug/Save/Exit row (216+12 tall, * itself 4px below Keep Spooled Jobs/View Spooler at 198) for even spacing - see * WA_InnerHeight in main() for why raising this also raises that: the @@ -195,7 +203,7 @@ static BOOL mp_test_suite_capture_mode = FALSE; // Define the USED macro for GCC #define USED __attribute__((used)) -#define MINTPRINT_SETTINGS_VERSION "1.3.1" +#define MINTPRINT_SETTINGS_VERSION "1.3.2" #define MINTPRINT_DRIVER_DEST ((CONST_STRPTR)"DEVS:Printers/MintPRINT") /* MintPrint Settings now ships as a single drawer containing both bundled @@ -221,7 +229,7 @@ static BOOL mp_read_driver_version(CONST_STRPTR path, struct MPDriverVersion *ou /* Visible both to AmigaOS's Version command and in the About requester. */ static const char USED mintprint_version[] = - "$VER: MintPrintSettings " MINTPRINT_SETTINGS_VERSION " (03.09.2026)"; + "$VER: MintPrintSettings " MINTPRINT_SETTINGS_VERSION " (04.09.2026)"; // Simple extension check BOOL has_extension(const char *filename, const char *ext) { @@ -1016,6 +1024,37 @@ static BOOL unit_file_exists(int idx) { return FALSE; } +/* Return a readable saved profile path, preferring the live ENV copy and + * falling back to ENVARC for profiles created by older builds or systems + * where the volatile ENV copy has been flushed. */ +static BOOL unit_config_source_path(int idx, char *out, int out_size) { + BPTR lock; + char path[64]; + + if (!out || out_size <= 0) return FALSE; + out[0] = '\0'; + + unit_config_path(idx, FALSE, path, sizeof(path)); + lock = Lock((CONST_STRPTR)path, ACCESS_READ); + if (lock) { + UnLock(lock); + strncpy(out, path, out_size - 1); + out[out_size - 1] = '\0'; + return TRUE; + } + + unit_config_path(idx, TRUE, path, sizeof(path)); + lock = Lock((CONST_STRPTR)path, ACCESS_READ); + if (lock) { + UnLock(lock); + strncpy(out, path, out_size - 1); + out[out_size - 1] = '\0'; + return TRUE; + } + + return FALSE; +} + /* Peeks just the MODEL= line out of a saved unit file, without disturbing * any of the live GUI/driver-config state. Used to label the Unit dropdown. */ static void peek_unit_model(int idx, char *out, int out_size) { @@ -2060,14 +2099,30 @@ static BOOL mintprint_test_page(struct Window *win) { return FALSE; } - /* Ordinary Test Print tests what the user is looking at and makes it - * live Unit0. The regression suite supplies its one-shot T: config - * directly and MUST NOT overwrite the user's persistent Unit0 while it - * cycles synthetic matrix values through these same in-memory fields. */ + /* Save the profile being viewed. The driver itself always reads Unit0, + * so for Unit1..7 copy that saved profile to its existing one-job T: + * override. DriverOpen consumes and deletes the override after loading + * it, leaving the user's active Unit0 completely unchanged. The + * regression suite supplies its own override and skips this block. */ if (!mp_test_print_skip_config_save && !save_driver_config(win)) { - printf("Test Print: could not save Unit0 settings\n"); + printf("Test Print: could not save Unit%d settings\n", current_unit_index); return FALSE; } + if (!mp_test_print_skip_config_save && current_unit_index != 0) { + char selected_config[64]; + + if (!unit_config_source_path(current_unit_index, selected_config, + sizeof(selected_config)) || + !mp_copy_file((CONST_STRPTR)selected_config, + MP_TEST_PRINT_CONFIG)) { + printf("Test Print: could not prepare Unit%d for this test\n", + current_unit_index); + DeleteFile(MP_TEST_PRINT_CONFIG); + return FALSE; + } + printf("Test Print: using Unit%d for this job; Unit0 remains active\n", + current_unit_index); + } have_installed_ver = mp_read_driver_version(MINTPRINT_DRIVER_DEST, &installed_ver); @@ -2235,6 +2290,8 @@ static BOOL mintprint_test_page(struct Window *win) { if (OpenDevice((CONST_STRPTR)"printer.device", 0, (struct IORequest *)test_print_job.request, 0) != 0) { printf("Test Print: could not open printer.device\n"); + if (!mp_test_print_skip_config_save && current_unit_index != 0) + DeleteFile(MP_TEST_PRINT_CONFIG); mp_test_print_release(win); return FALSE; } @@ -10243,19 +10300,22 @@ void process_window_events(struct Window *win) { custom_printf("Unit%d has no saved settings yet - nothing to activate.\n", current_unit_index); } else { - char src_env[64], src_envarc[64]; + char src_config[64]; char dst_env[64], dst_envarc[64]; BOOL ok; - unit_config_path(current_unit_index, FALSE, src_env, sizeof(src_env)); - unit_config_path(current_unit_index, TRUE, src_envarc, sizeof(src_envarc)); unit_config_path(0, FALSE, dst_env, sizeof(dst_env)); unit_config_path(0, TRUE, dst_envarc, sizeof(dst_envarc)); ok = ensure_config_dir((CONST_STRPTR)"ENV:MintPRINT") && ensure_config_dir((CONST_STRPTR)"ENVARC:MintPRINT") && - mp_copy_file((CONST_STRPTR)src_env, (CONST_STRPTR)dst_env) && - mp_copy_file((CONST_STRPTR)src_envarc, (CONST_STRPTR)dst_envarc); + unit_config_source_path(current_unit_index, + src_config, + sizeof(src_config)) && + mp_copy_file((CONST_STRPTR)src_config, + (CONST_STRPTR)dst_env) && + mp_copy_file((CONST_STRPTR)src_config, + (CONST_STRPTR)dst_envarc); if (ok) { char src_cache_env[64], src_cache_envarc[64];