summaryrefslogtreecommitdiff
path: root/amiga
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2009-08-29 14:00:57 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2009-08-29 14:00:57 +0000
commit0b6f91dd61346d1868bace6b7448aa26c8a75af0 (patch)
treeaa0dfa8ea54ab01eb0c671ae4d2ece97c003475b /amiga
parent4e9480e6c76e119819fe4498262069c6a6e5b7f6 (diff)
downloadnetsurf-0b6f91dd61346d1868bace6b7448aa26c8a75af0.tar.gz
netsurf-0b6f91dd61346d1868bace6b7448aa26c8a75af0.tar.bz2
Changes for asynchronous printing. Currently disabled, as NetSurf window doesn't
redraw while printing in progress svn path=/trunk/netsurf/; revision=9495
Diffstat (limited to 'amiga')
-rwxr-xr-xamiga/gui.c14
-rw-r--r--amiga/print.c85
-rwxr-xr-xamiga/print.h6
3 files changed, 84 insertions, 21 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index b70fceee0..ca9fd3f29 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -262,6 +262,8 @@ void gui_init(int argc, char** argv)
ASO_NoTrack,FALSE,
TAG_DONE))) die(messages_get("NoMemory"));
+ ami_print_init();
+
if(PopupMenuBase = OpenLibrary("popupmenu.class",0))
{
IPopupMenu = (struct PopupMenuIFace *)GetInterface(PopupMenuBase,"main",1,NULL);
@@ -1406,9 +1408,11 @@ void ami_get_msg(void)
ULONG winsignal = 1L << sport->mp_SigBit;
ULONG appsig = 1L << appport->mp_SigBit;
ULONG schedulesig = 1L << msgport->mp_SigBit;
- ULONG signalmask = winsignal | appsig | schedulesig | rxsig;
ULONG signal;
struct Message *timermsg = NULL;
+ struct MsgPort *printmsgport = ami_print_get_msgport();
+ ULONG printsig = 1L << printmsgport->mp_SigBit;
+ ULONG signalmask = winsignal | appsig | schedulesig | rxsig | printsig;
signal = Wait(signalmask);
@@ -1424,6 +1428,11 @@ void ami_get_msg(void)
{
ami_arexx_handle();
}
+ else if(signal & printsig)
+ {
+ while(GetMsg(printmsgport)); //ReplyMsg
+ ami_print_cont();
+ }
else if(signal & schedulesig)
{
while(GetMsg(msgport))
@@ -1582,6 +1591,7 @@ void gui_quit(void)
}
ami_clipboard_free();
+ ami_print_free();
FreeSysObject(ASOT_PORT,appport);
FreeSysObject(ASOT_PORT,sport);
@@ -2382,6 +2392,7 @@ void ami_do_redraw_limits(struct gui_window *g, struct content *c,int x0, int y0
yoffset=bbox->Top;
plot=amiplot;
+ glob = &browserglob;
if((y1<sy) || (y0>sy+height)) return;
if((x1<sx) || (x0>sx+width)) return;
@@ -2481,6 +2492,7 @@ void ami_do_redraw(struct gui_window_2 *g)
xoffset=bbox->Left;
yoffset=bbox->Top;
plot = amiplot;
+ glob = &browserglob;
if(g->bw->reformat_pending)
{
diff --git a/amiga/print.c b/amiga/print.c
index 72867a0bb..5cd6252a3 100644
--- a/amiga/print.c
+++ b/amiga/print.c
@@ -21,8 +21,8 @@
#include "render/font.h"
#include "amiga/gui.h"
#include "amiga/options.h"
+#include "amiga/print.h"
-#include <proto/exec.h>
#include <proto/Picasso96API.h>
#include <devices/printer.h>
#include <devices/prtbase.h>
@@ -46,18 +46,19 @@ struct ami_printer_info
struct PrinterData *PD;
struct PrinterExtendedData *PED;
struct MsgPort *msgport;
+ struct content *c;
+ struct print_settings *ps;
int page;
+ int pages;
};
struct ami_printer_info ami_print_info;
void ami_print(struct content *c)
{
- struct print_settings *ps;
+ double height, print_height;
- if(!(ami_print_info.msgport = AllocSysObjectTags(ASOT_PORT,
- ASO_NoTrack,FALSE,
- TAG_DONE))) return;
+ if(!ami_print_info.msgport) return;
if(!(ami_print_info.PReq =
(struct IODRPTagsReq *)AllocSysObjectTags(ASOT_IOREQUEST,
@@ -67,23 +68,69 @@ void ami_print(struct content *c)
TAG_DONE))) return;
if(OpenDevice("printer.device", option_printer_unit,
- (struct IORequest *)ami_print_info.PReq, 0)) return;
+ (struct IORequest *)ami_print_info.PReq, 0))
+ {
+ warn_user("CompError","printer.device");
+ return;
+ }
ami_print_info.PD = (struct PrinterData *)ami_print_info.PReq->io_Device;
ami_print_info.PED = &ami_print_info.PD->pd_SegmentData->ps_PED;
- ps = print_make_settings(PRINT_DEFAULT, c->url, &nsfont);
- ps->page_width = ami_print_info.PED->ped_MaxXDots;
- ps->page_height = ami_print_info.PED->ped_MaxYDots;
- ps->scale = 1.0;
+ ami_print_info.ps = print_make_settings(PRINT_DEFAULT, c->url, &nsfont);
+ ami_print_info.ps->page_width = ami_print_info.PED->ped_MaxXDots;
+ ami_print_info.ps->page_height = ami_print_info.PED->ped_MaxYDots;
+ ami_print_info.ps->scale = 1.0;
- print_basic_run(c, &amiprinter, ps);
+ print_set_up(c, &amiprinter, ami_print_info.ps, &height);
- CloseDevice(ami_print_info.PReq);
- FreeSysObject(ASOT_IOREQUEST,ami_print_info.PReq);
+ height *= ami_print_info.ps->scale;
+ ami_print_info.pages = height / ami_print_info.ps->page_height;
+ ami_print_info.c = c;
+
+ while(ami_print_cont()); /* remove while() for async printing */
+}
+
+bool ami_print_cont(void)
+{
+ bool ret = false;
+
+ if(ami_print_info.page <= ami_print_info.pages)
+ {
+ glob = ami_print_info.gg;
+ print_draw_next_page(&amiprinter, ami_print_info.ps);
+ ami_print_dump();
+ glob = &browserglob;
+ ret = true;
+ }
+ else
+ {
+ print_cleanup(ami_print_info.c, &amiprinter, ami_print_info.ps);
+ ret = false;
+ }
+
+ return ret;
+}
+
+struct MsgPort *ami_print_init(void)
+{
+ ami_print_info.msgport = AllocSysObjectTags(ASOT_PORT,
+ ASO_NoTrack,FALSE,
+ TAG_DONE);
+
+ return ami_print_info.msgport;
+}
+
+void ami_print_free(void)
+{
FreeSysObject(ASOT_PORT,ami_print_info.msgport);
}
+struct MsgPort *ami_print_get_msgport(void)
+{
+ return ami_print_info.msgport;
+}
+
bool ami_print_begin(struct print_settings *ps)
{
ami_print_info.gg = AllocVec(sizeof(struct gui_globals),
@@ -94,7 +141,6 @@ bool ami_print_begin(struct print_settings *ps)
ami_print_info.PED->ped_MaxXDots,
ami_print_info.PED->ped_MaxYDots);
- glob = ami_print_info.gg;
ami_print_info.page = 0;
return true;
@@ -102,20 +148,19 @@ bool ami_print_begin(struct print_settings *ps)
bool ami_print_next_page(void)
{
- bool ret = true;
-
- if(ami_print_info.page > 0) ret = ami_print_dump();
ami_print_info.page++;
- return ret;
+ return true;
}
void ami_print_end(void)
{
- ami_print_dump();
ami_free_layers(ami_print_info.gg);
FreeVec(ami_print_info.gg);
glob = &browserglob;
+
+ CloseDevice(ami_print_info.PReq);
+ FreeSysObject(ASOT_IOREQUEST,ami_print_info.PReq);
}
bool ami_print_dump(void)
@@ -134,7 +179,7 @@ bool ami_print_dump(void)
ami_print_info.PReq->io_DestRows = ami_print_info.PED->ped_MaxYDots;
ami_print_info.PReq->io_Special = 0;
- DoIO(ami_print_info.PReq);
+ DoIO(ami_print_info.PReq); /* SendIO for async printing */
return true;
}
diff --git a/amiga/print.h b/amiga/print.h
index 88c1791a6..95f2ef896 100755
--- a/amiga/print.h
+++ b/amiga/print.h
@@ -18,7 +18,13 @@
#ifndef AMIGA_PRINT_H
#define AMIGA_PRINT_H
+#include <proto/exec.h>
+
struct content;
void ami_print(struct content *c);
+bool ami_print_cont(void);
+struct MsgPort *ami_print_init(void);
+void ami_print_free(void);
+struct MsgPort *ami_print_get_msgport(void);
#endif