Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions Aminet/MintPRINT.readme
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
13 changes: 11 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,13 @@ MintPrint Settings for setup, discovery and test printing.
<img width="525" height="327" alt="image" src="https://github.com/user-attachments/assets/ba4cfd1f-8b0f-4aee-91b9-a6b221712ca5" />


## 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.
Expand Down
5 changes: 5 additions & 0 deletions docs/MintPrintSettings.guide
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
84 changes: 72 additions & 12 deletions src/MintPrintSettings.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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];
Expand Down
Loading