r9659 jmb - /trunk/netsurf/content/fetchcache.c
by netsurf@semichrome.net
Author: jmb
Date: Tue Nov 3 01:03:07 2009
New Revision: 9659
URL: http://source.netsurf-browser.org?rev=9659&view=rev
Log:
Realm may be NULL iff there's no WWW-Authenticate header served up with a 401.
Default the realm to the fetch URL in this case. Fixes #2890933
Note for new cache implementation (which is actually capable of utilising response bodies in this situation): if there is no WWW-Authenticate header, serve up the response body immediately -- don't present an authentication dialogue.
Modified:
trunk/netsurf/content/fetchcache.c
Modified: trunk/netsurf/content/fetchcache.c
URL: http://source.netsurf-browser.org/trunk/netsurf/content/fetchcache.c?rev=...
==============================================================================
--- trunk/netsurf/content/fetchcache.c (original)
+++ trunk/netsurf/content/fetchcache.c Tue Nov 3 01:03:07 2009
@@ -1147,8 +1147,12 @@
char *headers = NULL;
/* Preconditions */
- assert(c && realm);
+ assert(c);
assert(c->status == CONTENT_STATUS_TYPE_UNKNOWN);
+ /* Realm may be NULL iff there was no WWW-Authenticate header
+ * Use the content's URL as the realm in this case */
+ if (realm == NULL)
+ realm = c->url;
/* Extract fetch details */
ref = fetch_get_referer(c->fetch);
@@ -1179,7 +1183,7 @@
if (auth == NULL || c->tried_with_auth) {
/* No authentication details or we tried what we had, so ask
* our client for them. */
- c->tried_with_auth = false; /* Allow rety. */
+ c->tried_with_auth = false; /* Allow retry. */
c->status = CONTENT_STATUS_ERROR;
msg_data.auth_realm = realm;
13 years, 10 months
r9658 chris_y - /trunk/netsurf/amiga/gui.c
by netsurf@semichrome.net
Author: chris_y
Date: Mon Nov 2 17:12:28 2009
New Revision: 9658
URL: http://source.netsurf-browser.org?rev=9658&view=rev
Log:
Basic keyboard scrolling
Modified:
trunk/netsurf/amiga/gui.c
Modified: trunk/netsurf/amiga/gui.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.c?rev=9658&r1=9...
==============================================================================
--- trunk/netsurf/amiga/gui.c (original)
+++ trunk/netsurf/amiga/gui.c Mon Nov 2 17:12:28 2009
@@ -1214,10 +1214,13 @@
* key presses. Context menus need to be changed to use MENUVERIFY not RMBTRAP */
switch(nskey)
{
+ case 'a':
+ browser_window_key_press(gwin->bw, KEY_SELECT_ALL);
+ break;
+
case 'c':
browser_window_key_press(gwin->bw, KEY_COPY_SELECTION);
- browser_window_key_press(gwin->bw, KEY_ESCAPE);
- break;
+ browser_window_key_press(gwin->bw, KEY_CLEAR_SELECTION);
case 'v':
browser_window_key_press(gwin->bw, KEY_PASTE);
break;
@@ -1225,7 +1228,39 @@
}
else
{
- browser_window_key_press(gwin->bw, nskey);
+ if(!browser_window_key_press(gwin->bw, nskey))
+ {
+ gui_window_get_scroll(gwin->bw->window,
+ &gwin->bw->window->scrollx,
+ &gwin->bw->window->scrolly);
+
+ switch(nskey)
+ {
+ case KEY_UP:
+ gui_window_set_scroll(gwin->bw->window,
+ gwin->bw->window->scrollx,
+ gwin->bw->window->scrolly - 5);
+ break;
+
+ case KEY_DOWN:
+ gui_window_set_scroll(gwin->bw->window,
+ gwin->bw->window->scrollx,
+ gwin->bw->window->scrolly + 5);
+ break;
+
+ case KEY_LEFT:
+ gui_window_set_scroll(gwin->bw->window,
+ gwin->bw->window->scrollx - 5,
+ gwin->bw->window->scrolly);
+ break;
+
+ case KEY_RIGHT:
+ gui_window_set_scroll(gwin->bw->window,
+ gwin->bw->window->scrollx + 5,
+ gwin->bw->window->scrolly);
+ break;
+ }
+ }
}
break;
13 years, 10 months
r9657 chris_y - /trunk/netsurf/amiga/gui.c
by netsurf@semichrome.net
Author: chris_y
Date: Mon Nov 2 17:02:53 2009
New Revision: 9657
URL: http://source.netsurf-browser.org?rev=9657&view=rev
Log:
New key handling code borrowed from the treeview branch.
Modified:
trunk/netsurf/amiga/gui.c
Modified: trunk/netsurf/amiga/gui.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.c?rev=9657&r1=9...
==============================================================================
--- trunk/netsurf/amiga/gui.c (original)
+++ trunk/netsurf/amiga/gui.c Mon Nov 2 17:02:53 2009
@@ -731,6 +731,105 @@
bw = browser_window_create(option_homepage_url, 0, 0, true,false);
}
+int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie)
+{
+ int nskey = 0, chars;
+ UBYTE buffer[20];
+
+ if(keycode >= IECODE_UP_PREFIX) return 0;
+
+ switch(keycode)
+ {
+ case RAWKEY_CRSRUP:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_PAGE_UP;
+ }
+ else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
+ {
+ nskey = KEY_TEXT_START;
+ }
+ else nskey = KEY_UP;
+ break;
+ case RAWKEY_CRSRDOWN:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_PAGE_DOWN;
+ }
+ else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
+ {
+ nskey = KEY_TEXT_END;
+ }
+ else nskey = KEY_DOWN;
+ break;
+ case RAWKEY_CRSRLEFT:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_LINE_START;
+ }
+ else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
+ {
+ nskey = KEY_WORD_LEFT;
+ }
+ else nskey = KEY_LEFT;
+ break;
+ case RAWKEY_CRSRRIGHT:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_LINE_END;
+ }
+ else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
+ {
+ nskey = KEY_WORD_RIGHT;
+ }
+ else nskey = KEY_RIGHT;
+ break;
+ case RAWKEY_ESC:
+ nskey = KEY_ESCAPE;
+ break;
+ case RAWKEY_PAGEUP:
+ nskey = KEY_PAGE_UP;
+ break;
+ case RAWKEY_PAGEDOWN:
+ nskey = KEY_PAGE_DOWN;
+ break;
+ case RAWKEY_HOME:
+ nskey = KEY_TEXT_START;
+ break;
+ case RAWKEY_END:
+ nskey = KEY_TEXT_END;
+ break;
+ case RAWKEY_BACKSPACE:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_DELETE_LINE_START;
+ }
+ else nskey = KEY_DELETE_LEFT;
+ break;
+ case RAWKEY_DEL:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_DELETE_LINE_END;
+ }
+ else nskey = KEY_DELETE_RIGHT;
+ break;
+ case RAWKEY_TAB:
+ if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
+ {
+ nskey = KEY_SHIFT_TAB;
+ }
+ else nskey = KEY_TAB;
+ break;
+ default:
+ if((chars = MapRawKey(ie,buffer,20,NULL)) > 0)
+ {
+ nskey = buffer[0];
+ }
+ break;
+ }
+ return nskey;
+}
+
void ami_update_quals(struct gui_window_2 *gwin)
{
uint32 quals = 0;
@@ -767,8 +866,7 @@
struct MenuItem *item;
struct InputEvent *ie;
struct Node *tabnode;
- UBYTE buffer[20];
- int chars,i;
+ int i, nskey;
if(IsMinListEmpty(window_list))
{
@@ -1106,123 +1204,28 @@
GetAttr(WINDOW_InputEvent,gwin->objects[OID_MAIN],(ULONG *)&ie);
- switch(storage)
+ nskey = ami_key_to_nskey(storage, ie);
+
+ if(ie->ie_Qualifier & IEQUALIFIER_RCOMMAND)
{
- case RAWKEY_CRSRUP:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_PAGE_UP);
- }
- else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
- {
- browser_window_key_press(gwin->bw,KEY_TEXT_START);
- }
- else browser_window_key_press(gwin->bw,KEY_UP);
- break;
- case RAWKEY_CRSRDOWN:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_PAGE_DOWN);
- }
- else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
- {
- browser_window_key_press(gwin->bw,KEY_TEXT_END);
- }
- else browser_window_key_press(gwin->bw,KEY_DOWN);
- break;
- case RAWKEY_CRSRLEFT:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_LINE_START);
- }
- else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
- {
- browser_window_key_press(gwin->bw,KEY_WORD_LEFT);
- }
- else browser_window_key_press(gwin->bw,KEY_LEFT);
- break;
- case RAWKEY_CRSRRIGHT:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_LINE_END);
- }
- else if(ie->ie_Qualifier & IEQUALIFIER_RALT)
- {
- browser_window_key_press(gwin->bw,KEY_WORD_RIGHT);
- }
- else browser_window_key_press(gwin->bw,KEY_RIGHT);
- break;
- case RAWKEY_ESC:
- browser_window_key_press(gwin->bw,KEY_ESCAPE);
- break;
- case RAWKEY_PAGEUP:
- browser_window_key_press(gwin->bw,KEY_PAGE_UP);
- break;
- case RAWKEY_PAGEDOWN:
- browser_window_key_press(gwin->bw,KEY_PAGE_DOWN);
- break;
- case RAWKEY_HOME:
- browser_window_key_press(gwin->bw,KEY_TEXT_START);
- break;
- case RAWKEY_END:
- browser_window_key_press(gwin->bw,KEY_TEXT_END);
- break;
- case RAWKEY_BACKSPACE:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_DELETE_LINE_START);
- }
- else browser_window_key_press(gwin->bw,KEY_DELETE_LEFT);
- break;
- case RAWKEY_DEL:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_DELETE_LINE_END);
- }
- else browser_window_key_press(gwin->bw,KEY_DELETE_RIGHT);
- break;
- case RAWKEY_TAB:
- if(ie->ie_Qualifier & IEQUALIFIER_RSHIFT)
- {
- browser_window_key_press(gwin->bw,KEY_SHIFT_TAB);
- }
- else browser_window_key_press(gwin->bw,KEY_TAB);
- break;
- default:
- if((chars = MapRawKey(ie,buffer,20,NULL)) > 0)
- {
-/* this doesn't work - MapRawKey would take notice of capslock if it was in
-ie_qualifier anyway
- if(ie->ie_Qualifier & IEQUALIFIER_CAPSLOCK)
- {
- for(i=0;i<chars;i++)
- buffer[i] = ToUpper(buffer[i]);
- }
-*/
- if(ie->ie_Qualifier & IEQUALIFIER_RCOMMAND)
- {
/* We are duplicating the menu shortcuts here, as if RMBTRAP is active
* (ie. when context menus are enabled and the mouse is over the browser
* rendering area), Intuition also does not catch the menu shortcut
* key presses. Context menus need to be changed to use MENUVERIFY not RMBTRAP */
- switch(buffer[0])
- {
- case 'c':
- browser_window_key_press(gwin->bw, KEY_COPY_SELECTION);
- browser_window_key_press(gwin->bw, KEY_ESCAPE);
- break;
-
- case 'v':
- browser_window_key_press(gwin->bw, KEY_PASTE);
- break;
- }
- }
- else
- {
- browser_window_key_press(gwin->bw,buffer[0]);
- }
- }
- break;
+ switch(nskey)
+ {
+ case 'c':
+ browser_window_key_press(gwin->bw, KEY_COPY_SELECTION);
+ browser_window_key_press(gwin->bw, KEY_ESCAPE);
+ break;
+ case 'v':
+ browser_window_key_press(gwin->bw, KEY_PASTE);
+ break;
+ }
+ }
+ else
+ {
+ browser_window_key_press(gwin->bw, nskey);
}
break;
13 years, 10 months
r9656 chris_y - /trunk/netsurf/amiga/misc.c
by netsurf@semichrome.net
Author: chris_y
Date: Sun Nov 1 10:01:07 2009
New Revision: 9656
URL: http://source.netsurf-browser.org?rev=9656&view=rev
Log:
Support file://(/)localhost/ as well as file://(/)
As NetSurf insists on adding a third slash after file://, it is not possible to open
any local files which are in subdirectory "localhost" of the current directory.
Workaround is to type the "localhost" part in something other than fully lowercase.
In practice it is incredibly unlikely that even the workaround will need to be used.
Modified:
trunk/netsurf/amiga/misc.c
Modified: trunk/netsurf/amiga/misc.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/misc.c?rev=9656&r1=...
==============================================================================
--- trunk/netsurf/amiga/misc.c (original)
+++ trunk/netsurf/amiga/misc.c Sun Nov 1 10:01:07 2009
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ * Copyright 2008, 2009 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -51,25 +51,22 @@
char *url_to_path(const char *url)
{
- char *tmps,*unesc;
+ char *tmps, *unesc;
CURL *curl;
- if(tmps = strchr(url,'/'))
+ tmps = strstr(url, "///localhost/") + 13;
+
+ if(tmps < url) tmps = strstr(url,"///") + 3;
+
+ if(tmps >= url)
{
- if(tmps = strchr(tmps+1,'/'))
+ if(curl = curl_easy_init())
{
- if(tmps = strchr(tmps+1,'/'))
- {
- if(curl = curl_easy_init())
- {
- unesc = curl_easy_unescape(curl,tmps+1,0,NULL);
- tmps = strdup(unesc);
- curl_free(unesc);
- curl_easy_cleanup(curl);
- return tmps;
-
- }
- }
+ unesc = curl_easy_unescape(curl,tmps,0,NULL);
+ tmps = strdup(unesc);
+ curl_free(unesc);
+ curl_easy_cleanup(curl);
+ return tmps;
}
}
13 years, 11 months
r9655 chris_y - in /trunk/netsurf: !NetSurf/Resources/de/Messages !NetSurf/Resources/en/Messages !NetSurf/Resources/fr/Messages !NetSurf/Resources/nl/Messages amiga/gui.c amiga/menu.c amiga/object.h amiga/options.h amiga/print.c amiga/print.h
by netsurf@semichrome.net
Author: chris_y
Date: Sun Nov 1 08:53:04 2009
New Revision: 9655
URL: http://source.netsurf-browser.org?rev=9655&view=rev
Log:
Amiga print UI
Modified:
trunk/netsurf/!NetSurf/Resources/de/Messages
trunk/netsurf/!NetSurf/Resources/en/Messages
trunk/netsurf/!NetSurf/Resources/fr/Messages
trunk/netsurf/!NetSurf/Resources/nl/Messages
trunk/netsurf/amiga/gui.c
trunk/netsurf/amiga/menu.c
trunk/netsurf/amiga/object.h
trunk/netsurf/amiga/options.h
trunk/netsurf/amiga/print.c
trunk/netsurf/amiga/print.h
Modified: trunk/netsurf/!NetSurf/Resources/de/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/de/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/de/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/de/Messages Sun Nov 1 08:53:04 2009
@@ -248,7 +248,7 @@
IFF:IFF...
OpenFile:Open local file...
About:About...
-PrintNS:Print
+PrintNS:Print...
# Edit menu
#
Modified: trunk/netsurf/!NetSurf/Resources/en/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/en/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/en/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/en/Messages Sun Nov 1 08:53:04 2009
@@ -248,7 +248,7 @@
IFF:IFF...
OpenFile:Open local file...
About:About...
-PrintNS:Print
+PrintNS:Print...
# Edit menu
#
Modified: trunk/netsurf/!NetSurf/Resources/fr/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/fr/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/fr/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/fr/Messages Sun Nov 1 08:53:04 2009
@@ -248,7 +248,7 @@
IFF:IFF...
OpenFile:Open local file...
About:About...
-PrintNS:Print
+PrintNS:Print...
# Edit menu
#
Modified: trunk/netsurf/!NetSurf/Resources/nl/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/nl/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/nl/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/nl/Messages Sun Nov 1 08:53:04 2009
@@ -248,7 +248,7 @@
IFF:IFF...
OpenFile:Open local file...
About:About...
-PrintNS:Print
+PrintNS:Print...
# Edit menu
#
Modified: trunk/netsurf/amiga/gui.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.c?rev=9655&r1=9...
==============================================================================
--- trunk/netsurf/amiga/gui.c (original)
+++ trunk/netsurf/amiga/gui.c Sun Nov 1 08:53:04 2009
@@ -822,6 +822,23 @@
else if(node->Type == AMINS_HISTORYWINDOW)
{
if(ami_history_event((struct history_window *)gwin))
+ {
+ if(IsMinListEmpty(window_list))
+ {
+ /* last window closed, so exit */
+ ami_try_quit();
+ }
+ break;
+ }
+ else
+ {
+ node = nnode;
+ continue;
+ }
+ }
+ else if(node->Type == AMINS_PRINTWINDOW)
+ {
+ if(ami_print_event((struct ami_print_window *)gwin))
{
if(IsMinListEmpty(window_list))
{
@@ -1549,6 +1566,7 @@
ami_handle_msg();
ami_handle_appmsg();
+ ami_handle_applib();
ami_arexx_handle();
}
@@ -1564,6 +1582,7 @@
schedule_run checks every event, really they need to be sorted so only
the first event needs to be run on each signal. */
+
if(active)
{
@@ -2748,8 +2767,8 @@
{
content_redraw(c, -hcurrent,
-vcurrent,
- (width / g->bw->scale) - hcurrent,
- (height / g->bw->scale) - vcurrent,
+ width - hcurrent,
+ height - vcurrent,
0,0,width,
height,
g->bw->scale,0xFFFFFF);
Modified: trunk/netsurf/amiga/menu.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/menu.c?rev=9655&r1=...
==============================================================================
--- trunk/netsurf/amiga/menu.c (original)
+++ trunk/netsurf/amiga/menu.c Sun Nov 1 08:53:04 2009
@@ -576,7 +576,7 @@
case 9: // print
ami_update_pointer(gwin->win,GUI_POINTER_WAIT);
- ami_print(gwin->bw->current_content);
+ ami_print_ui(gwin->bw->current_content);
ami_update_pointer(gwin->win,GUI_POINTER_DEFAULT);
break;
Modified: trunk/netsurf/amiga/object.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/object.h?rev=9655&r...
==============================================================================
--- trunk/netsurf/amiga/object.h (original)
+++ trunk/netsurf/amiga/object.h Sun Nov 1 08:53:04 2009
@@ -33,6 +33,7 @@
AMINS_FINDWINDOW,
AMINS_HISTORYWINDOW,
AMINS_GUIOPTSWINDOW,
+ AMINS_PRINTWINDOW,
AMINS_FETCHER,
};
Modified: trunk/netsurf/amiga/options.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/options.h?rev=9655&...
==============================================================================
--- trunk/netsurf/amiga/options.h (original)
+++ trunk/netsurf/amiga/options.h Sun Nov 1 08:53:04 2009
@@ -42,6 +42,7 @@
extern bool option_scale_quality;
extern bool option_ask_overwrite;
extern int option_printer_unit;
+extern int option_print_scale;
extern bool option_startup_no_window;
extern bool option_close_no_quit;
@@ -68,6 +69,7 @@
bool option_scale_quality = false; \
bool option_ask_overwrite = false; \
int option_printer_unit = 0; \
+int option_print_scale = 100; \
bool option_startup_no_window = false; \
bool option_close_no_quit = false; \
@@ -94,6 +96,7 @@
{ "scale_quality", OPTION_BOOL, &option_scale_quality}, \
{ "ask_overwrite", OPTION_BOOL, &option_ask_overwrite}, \
{ "printer_unit", OPTION_INTEGER, &option_printer_unit}, \
+{ "print_scale", OPTION_INTEGER, &option_print_scale}, \
{ "startup_no_window", OPTION_BOOL, &option_startup_no_window}, \
{ "close_no_quit", OPTION_BOOL, &option_close_no_quit},
Modified: trunk/netsurf/amiga/print.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/print.c?rev=9655&r1...
==============================================================================
--- trunk/netsurf/amiga/print.c (original)
+++ trunk/netsurf/amiga/print.c Sun Nov 1 08:53:04 2009
@@ -24,19 +24,32 @@
#include "amiga/print.h"
#include "utils/messages.h"
#include "utils/utils.h"
-
+#include "amiga/utf8.h"
+
+#include <proto/utility.h>
+#include <proto/iffparse.h>
+#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/Picasso96API.h>
#include <devices/printer.h>
#include <devices/prtbase.h>
+#include <prefs/prefhdr.h>
+#include <prefs/printertxt.h>
+#include <libraries/gadtools.h>
+
#include <proto/window.h>
#include <proto/layout.h>
-
+#include <proto/integer.h>
+#include <proto/label.h>
+#include <proto/chooser.h>
#include <proto/fuelgauge.h>
#include <classes/window.h>
#include <gadgets/fuelgauge.h>
#include <gadgets/layout.h>
+#include <gadgets/integer.h>
+#include <gadgets/chooser.h>
+#include <images/label.h>
#include <reaction/reaction_macros.h>
@@ -69,11 +82,296 @@
struct Window *win;
};
+enum
+{
+ PGID_MAIN=0,
+ PGID_PRINTER,
+ PGID_SCALE,
+ PGID_COPIES,
+ PGID_PRINT,
+ PGID_CANCEL,
+ PGID_LAST
+};
+
+#define IFFPrefChunkCnt 2
+static LONG IFFPrefChunks[] =
+{
+ ID_PREF, ID_PRHD,
+ ID_PREF, ID_PDEV,
+};
+
struct ami_printer_info ami_print_info;
-void ami_print(struct content *c)
+CONST_STRPTR gadlab[PGID_LAST];
+CONST_STRPTR printers[11];
+
+void ami_print_ui_setup(void)
+{
+ gadlab[PGID_PRINTER] = (char *)ami_utf8_easy((char *)messages_get("Printer"));
+ gadlab[PGID_SCALE] = (char *)ami_utf8_easy((char *)messages_get("Scale"));
+ gadlab[PGID_COPIES] = (char *)ami_utf8_easy((char *)messages_get("Copies"));
+ gadlab[PGID_PRINT] = (char *)ami_utf8_easy((char *)messages_get("ObjPrint"));
+ gadlab[PGID_CANCEL] = (char *)ami_utf8_easy((char *)messages_get("Cancel"));
+}
+
+void ami_print_ui_free(void)
+{
+ int i;
+
+ for(i = 0; i++; i < PGID_LAST)
+ if(gadlab[i]) FreeVec((APTR)gadlab[i]);
+
+ for(i = 0; i++; i < 10)
+ if(printers[i]) FreeVec((APTR)printers[i]);
+}
+
+BOOL ami_print_readunit(CONST_STRPTR filename, char name[],
+ uint32 namesize, int unitnum)
+{
+ /* This is a modified version of a function from the OS4 SDK.
+ * The README says "You can use it in your application",
+ * no licence is specified. (c) 1999 Amiga Inc */
+
+ BPTR fp;
+ BOOL ok;
+ struct IFFHandle *iff;
+ struct ContextNode *cn;
+ struct PrefHeader phead;
+ struct PrinterDeviceUnitPrefs pdev;
+
+ SNPrintf(name,namesize,"Unit %ld",unitnum);
+ fp = Open(filename, MODE_OLDFILE);
+ if (fp)
+ {
+ iff = AllocIFF();
+ if (iff)
+ {
+ iff->iff_Stream = fp;
+ InitIFFasDOS(iff);
+
+ if (!OpenIFF(iff, IFFF_READ))
+ {
+ if (!ParseIFF(iff, IFFPARSE_STEP))
+ {
+ cn = CurrentChunk(iff);
+ if (cn->cn_ID == ID_FORM && cn->cn_Type == ID_PREF)
+ {
+ if (!StopChunks(iff, IFFPrefChunks, IFFPrefChunkCnt))
+ {
+ ok = TRUE;
+ while (ok)
+ {
+ if (ParseIFF(iff, IFFPARSE_SCAN))
+ break;
+ cn = CurrentChunk(iff);
+ if (cn->cn_Type == ID_PREF)
+ {
+ switch (cn->cn_ID)
+ {
+ case ID_PRHD:
+ if (ReadChunkBytes(iff, &phead, sizeof(struct PrefHeader)) != sizeof(struct PrefHeader))
+ {
+ ok = FALSE;
+ break;
+ }
+ if (phead.ph_Version != 0)
+ {
+ ok = FALSE;
+ break;
+ }
+ break;
+ case ID_PDEV:
+ if (ReadChunkBytes(iff, &pdev, sizeof(pdev)) == sizeof(pdev))
+ {
+ if (pdev.pd_UnitName[0])
+ strcpy(name,pdev.pd_UnitName);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ CloseIFF(iff);
+ }
+ FreeIFF(iff);
+ }
+ Close(fp);
+ }
+ else return FALSE;
+
+ return TRUE;
+}
+
+void ami_print_ui(struct content *c)
+{
+ char filename[30];
+ int i;
+
+ struct ami_print_window *pw = AllocVec(sizeof(struct ami_print_window),
+ MEMF_PRIVATE | MEMF_CLEAR);
+
+ pw->c = c;
+
+ printers[0] = AllocVec(50, MEMF_PRIVATE | MEMF_CLEAR);
+ ami_print_readunit("ENV:Sys/printer.prefs", printers[0], 50, 0);
+
+ strcpy(filename,"ENV:Sys/printerN.prefs");
+ for (i = 1; i < 10; i++)
+ {
+ filename[15] = '0' + i;
+ printers[i] = AllocVec(50, MEMF_PRIVATE | MEMF_CLEAR);
+ if(!ami_print_readunit(filename, (void *)printers[i], 50, i))
+ {
+ FreeVec((void *)printers[i]);
+ printers[i] = NULL;
+ break;
+ }
+
+ }
+
+ ami_print_ui_setup();
+
+ pw->objects[OID_MAIN] = WindowObject,
+ WA_ScreenTitle, nsscreentitle,
+ WA_Title, gadlab[PGID_PRINT],
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, FALSE,
+ WA_CustomScreen, scrn,
+ WINDOW_SharedPort, sport,
+ WINDOW_UserData, pw,
+ WINDOW_IconifyGadget, FALSE,
+ WINDOW_Position, WPOS_CENTERSCREEN,
+ WINDOW_ParentGroup, pw->gadgets[PGID_MAIN] = VGroupObject,
+ LAYOUT_AddChild, ChooserObject,
+ GA_ID, PGID_PRINTER,
+ GA_RelVerify, TRUE,
+ GA_TabCycle, TRUE,
+ CHOOSER_LabelArray, printers,
+ CHOOSER_Selected, option_printer_unit,
+ ChooserEnd,
+ CHILD_Label, LabelObject,
+ LABEL_Text, gadlab[PGID_PRINTER],
+ LabelEnd,
+ LAYOUT_AddChild, IntegerObject,
+ GA_ID, PGID_COPIES,
+ GA_RelVerify, TRUE,
+ GA_TabCycle, TRUE,
+ INTEGER_Number, 1,
+ INTEGER_Minimum, 1,
+ INTEGER_Maximum, 100,
+ INTEGER_Arrows, TRUE,
+ IntegerEnd,
+ CHILD_Label, LabelObject,
+ LABEL_Text, gadlab[PGID_COPIES],
+ LabelEnd,
+ LAYOUT_AddChild, HGroupObject,
+ LAYOUT_LabelColumn, PLACETEXT_RIGHT,
+ LAYOUT_AddChild, pw->gadgets[PGID_SCALE] = IntegerObject,
+ GA_ID, PGID_SCALE,
+ GA_RelVerify, TRUE,
+ GA_TabCycle, TRUE,
+ INTEGER_Number, option_print_scale,
+ INTEGER_Minimum, 0,
+ INTEGER_Maximum, 100,
+ INTEGER_Arrows, TRUE,
+ IntegerEnd,
+ CHILD_WeightedWidth, 0,
+ CHILD_Label, LabelObject,
+ LABEL_Text, "%",
+ LabelEnd,
+ LayoutEnd,
+ CHILD_Label, LabelObject,
+ LABEL_Text, gadlab[PGID_SCALE],
+ LabelEnd,
+ LAYOUT_AddChild, HGroupObject,
+ LAYOUT_AddChild, pw->gadgets[PGID_PRINT] = ButtonObject,
+ GA_ID, PGID_PRINT,
+ GA_RelVerify,TRUE,
+ GA_Text, gadlab[PGID_PRINT],
+ GA_TabCycle,TRUE,
+ ButtonEnd,
+ CHILD_WeightedHeight,0,
+ LAYOUT_AddChild, pw->gadgets[GID_CANCEL] = ButtonObject,
+ GA_ID, PGID_CANCEL,
+ GA_RelVerify, TRUE,
+ GA_Text, gadlab[PGID_CANCEL],
+ GA_TabCycle,TRUE,
+ ButtonEnd,
+ LayoutEnd,
+ CHILD_WeightedHeight,0,
+ EndGroup,
+ EndWindow;
+
+ pw->win = (struct Window *)RA_OpenWindow(pw->objects[OID_MAIN]);
+
+ pw->node = AddObject(window_list, AMINS_PRINTWINDOW);
+ pw->node->objstruct = pw;
+}
+
+void ami_print_close(struct ami_print_window *pw)
+{
+ DisposeObject(pw->objects[OID_MAIN]);
+ DelObject(pw->node);
+
+ ami_print_ui_free();
+}
+
+BOOL ami_print_event(struct ami_print_window *pw)
+{
+ /* return TRUE if window destroyed */
+ ULONG class,result;
+ uint16 code;
+ struct content *c;
+ int copies;
+
+ while((result = RA_HandleInput(pw->objects[OID_MAIN],&code)) != WMHI_LASTMSG)
+ {
+ switch(result & WMHI_CLASSMASK) // class
+ {
+ case WMHI_GADGETUP:
+ switch(result & WMHI_GADGETMASK)
+ {
+ case PGID_PRINT:
+ GetAttr(INTEGER_Number, pw->gadgets[PGID_SCALE],
+ (ULONG *)&option_print_scale);
+ GetAttr(INTEGER_Number, pw->gadgets[PGID_COPIES],
+ (ULONG *)&copies);
+ GetAttr(CHOOSER_Selected, pw->gadgets[PGID_PRINTER],
+ (ULONG *)&option_printer_unit);
+
+ c = pw->c;
+ ami_print_close(pw);
+ ami_print(c, copies);
+ return TRUE;
+ break;
+
+ case PGID_CANCEL:
+ ami_print_close(pw);
+ return TRUE;
+ break;
+ }
+ break;
+
+ case WMHI_CLOSEWINDOW:
+ ami_print_close(pw);
+ return TRUE;
+ break;
+ }
+ }
+ return FALSE;
+}
+
+void ami_print(struct content *c, int copies)
{
double height, print_height;
+ float scale = option_print_scale / 100.0;
if(!ami_print_info.msgport) return;
@@ -97,7 +395,7 @@
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;
+ ami_print_info.ps->scale = scale;
print_set_up(c, &amiprinter, ami_print_info.ps, &height);
Modified: trunk/netsurf/amiga/print.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/print.h?rev=9655&r1...
==============================================================================
--- trunk/netsurf/amiga/print.h (original)
+++ trunk/netsurf/amiga/print.h Sun Nov 1 08:53:04 2009
@@ -22,7 +22,17 @@
struct content;
-void ami_print(struct content *c);
+struct ami_print_window {
+ struct Window *win;
+ Object *objects[OID_LAST];
+ struct Gadget *gadgets[GID_LAST];
+ struct nsObject *node;
+ struct content *c;
+};
+
+void ami_print(struct content *c, int copies);
+void ami_print_ui(struct content *c);
+BOOL ami_print_event(struct ami_print_window *pw);
bool ami_print_cont(void);
struct MsgPort *ami_print_init(void);
void ami_print_free(void);
13 years, 11 months