summaryrefslogtreecommitdiff
path: root/amiga
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2008-09-22 20:41:01 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2008-09-22 20:41:01 +0000
commit8c4cbd2b1b10c4d4b76ecc6911faa0da2524d540 (patch)
treed591ead871d347e035fc2fa6c9773ed93bb369dc /amiga
parent4c058dd92ce221db0df0bafe691f1431721b6dbd (diff)
downloadnetsurf-8c4cbd2b1b10c4d4b76ecc6911faa0da2524d540.tar.gz
netsurf-8c4cbd2b1b10c4d4b76ecc6911faa0da2524d540.tar.bz2
32-bit mouse pointer support.
The pointer imagery are the icon files of the 4-colour custom text file images. Tooltypes XOFFSET and YOFFSET specify the "point" of the image. The 32-bit pointers can be disabled by setting option truecolour_mouse_pointers:0 The OS pointers (for "Default" and "Wait" only) can be used by setting os_mouse_pointers:1 Deleting the relevant files has the same effect :) This complete set of 32-bit images is drawn by Martin Merz (Mason). The code to read them is derived from sample code by Joerg Strohmayer. svn path=/trunk/netsurf/; revision=5401
Diffstat (limited to 'amiga')
-rwxr-xr-xamiga/gui.c232
-rwxr-xr-xamiga/gui.h10
-rw-r--r--amiga/options.h10
-rw-r--r--amiga/resources/Pointers/Blank.infobin0 -> 1719 bytes
-rw-r--r--amiga/resources/Pointers/Caret.infobin0 -> 1605 bytes
-rw-r--r--amiga/resources/Pointers/Cross.infobin0 -> 2046 bytes
-rw-r--r--amiga/resources/Pointers/Default.infobin0 -> 2045 bytes
-rw-r--r--amiga/resources/Pointers/Down.infobin0 -> 1719 bytes
-rw-r--r--amiga/resources/Pointers/Help.infobin0 -> 2775 bytes
-rw-r--r--amiga/resources/Pointers/Left.infobin0 -> 1609 bytes
-rw-r--r--amiga/resources/Pointers/LeftDown.infobin0 -> 1765 bytes
-rw-r--r--amiga/resources/Pointers/LeftUp.infobin0 -> 1695 bytes
-rw-r--r--amiga/resources/Pointers/Menu.infobin0 -> 2577 bytes
-rw-r--r--amiga/resources/Pointers/Move.infobin0 -> 2840 bytes
-rw-r--r--amiga/resources/Pointers/NoDrop.infobin0 -> 2801 bytes
-rw-r--r--amiga/resources/Pointers/NotAllowed.infobin0 -> 2533 bytes
-rw-r--r--amiga/resources/Pointers/Point.infobin0 -> 2755 bytes
-rw-r--r--amiga/resources/Pointers/Progress.infobin0 -> 2851 bytes
-rw-r--r--amiga/resources/Pointers/Right.infobin0 -> 1609 bytes
-rw-r--r--amiga/resources/Pointers/RightDown.infobin0 -> 1669 bytes
-rw-r--r--amiga/resources/Pointers/RightUp.infobin0 -> 1687 bytes
-rw-r--r--amiga/resources/Pointers/Up.infobin0 -> 1617 bytes
-rw-r--r--amiga/resources/Pointers/Wait.infobin0 -> 2449 bytes
23 files changed, 183 insertions, 69 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index 5c1e47ee6..78bf209aa 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -57,6 +57,8 @@
#include <workbench/workbench.h>
#include "amiga/iff_cset.h"
#include <proto/datatypes.h>
+#include <proto/icon.h>
+#include <workbench/icon.h>
#ifdef WITH_HUBBUB
#include <hubbub/hubbub.h>
@@ -101,13 +103,13 @@ bool win_destroyed = false;
static struct RastPort dummyrp;
struct IFFHandle *iffh = NULL;
-#define AMI_LASTPOINTER GUI_POINTER_PROGRESS
+#define AMI_LASTPOINTER GUI_POINTER_PROGRESS+1
+Object *mouseptrobj[AMI_LASTPOINTER+1];
struct BitMap *mouseptrbm[AMI_LASTPOINTER+1];
-int mousexpt[AMI_LASTPOINTER+1];
-int mouseypt[AMI_LASTPOINTER+1];
+int mouseptrcurrent=0;
char *ptrs[AMI_LASTPOINTER+1] = {
- "Resources/Pointers/Blank", // replaces default
+ "Resources/Pointers/Default",
"Resources/Pointers/Point",
"Resources/Pointers/Caret",
"Resources/Pointers/Menu",
@@ -125,13 +127,15 @@ char *ptrs[AMI_LASTPOINTER+1] = {
"Resources/Pointers/Help",
"Resources/Pointers/NoDrop",
"Resources/Pointers/NotAllowed",
- "Resources/Pointers/Progress"};
+ "Resources/Pointers/Progress",
+ "Resources/Pointers/Blank"};
void ami_update_throbber(struct gui_window *g);
void ami_update_buttons(struct gui_window *);
void ami_scroller_hook(struct Hook *,Object *,struct IntuiMessage *);
uint32 ami_popup_hook(struct Hook *hook,Object *item,APTR reserved);
void ami_do_redraw(struct gui_window *g);
+void ami_init_mouse_pointers(void);
#ifdef WITH_HUBBUB
static void *myrealloc(void *ptr, size_t len, void *pw);
#endif
@@ -143,8 +147,6 @@ void gui_init(int argc, char** argv)
bool found=FALSE;
int i;
BPTR lock=0;
- struct RastPort mouseptr;
- struct IFFHandle *mpiff = NULL;
Object *dto;
/* ttengine.library
@@ -193,47 +195,10 @@ void gui_init(int argc, char** argv)
}
}
- InitRastPort(&mouseptr);
-
- for(i=0;i<=AMI_LASTPOINTER;i++)
- {
- BPTR ptrfile = 0;
- mouseptrbm[i] = NULL;
-
- if(ptrfile = Open(ptrs[i],MODE_OLDFILE))
- {
- int mx,my;
- UBYTE *pprefsbuf = AllocVec(1061,MEMF_CLEAR);
- Read(ptrfile,pprefsbuf,1061);
-
- mouseptrbm[i]=AllocVec(sizeof(struct BitMap),MEMF_CLEAR);
- InitBitMap(mouseptrbm[i],2,32,32);
- mouseptrbm[i]->Planes[0] = AllocRaster(32,32);
- mouseptrbm[i]->Planes[1] = AllocRaster(32,32);
- mouseptr.BitMap = mouseptrbm[i];
-
- for(my=0;my<32;my++)
- {
- for(mx=0;mx<32;mx++)
- {
- SetAPen(&mouseptr,pprefsbuf[(my*(33))+mx]-'0');
- WritePixel(&mouseptr,mx,my);
- }
- }
-
- mousexpt[i] = ((pprefsbuf[1056]-'0')*10)+(pprefsbuf[1057]-'0');
- mouseypt[i] = ((pprefsbuf[1059]-'0')*10)+(pprefsbuf[1060]-'0');
-
- FreeVec(pprefsbuf);
- Close(ptrfile);
- }
- }
-/* need to do some proper checking that components are opening */
-
options_read("Resources/Options");
verbose_log = option_verbose_log;
-
+ ami_init_mouse_pointers();
nsscreentitle = ASPrintf("NetSurf %s",netsurf_version);
if(lock=Lock("Resources/LangNames",ACCESS_READ))
@@ -1584,39 +1549,170 @@ void gui_window_set_status(struct gui_window *g, const char *text)
RefreshSetGadgetAttrs(g->gadgets[GID_STATUS],g->win,NULL,STRINGA_TextVal,text,TAG_DONE);
}
-Object *ami_custom_pointer(gui_pointer_shape shape)
-{
- if(!mouseptrbm[shape]) printf("%ld is null\n",shape);
-
- return NewObject(NULL,"pointerclass",POINTERA_BitMap,mouseptrbm[shape],POINTERA_WordWidth,2,POINTERA_XOffset,-mousexpt[shape],POINTERA_YOffset,-mouseypt[shape],POINTERA_XResolution,POINTERXRESN_SCREENRES,POINTERA_YResolution,POINTERYRESN_SCREENRESASPECT,TAG_DONE);
-}
-
void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
{
- switch(shape)
+ if(mouseptrcurrent == shape) return;
+
+ if(option_use_os_pointers)
{
- case GUI_POINTER_DEFAULT:
- SetWindowPointer(g->win,TAG_DONE);
- break;
+ switch(shape)
+ {
+ case GUI_POINTER_DEFAULT:
+ SetWindowPointer(g->win,TAG_DONE);
+ break;
- case GUI_POINTER_WAIT:
- SetWindowPointer(g->win,
- WA_BusyPointer,TRUE,
- WA_PointerDelay,TRUE,
- TAG_DONE);
- break;
+ case GUI_POINTER_WAIT:
+ SetWindowPointer(g->win,
+ WA_BusyPointer,TRUE,
+ WA_PointerDelay,TRUE,
+ TAG_DONE);
+ break;
- default:
- SetWindowPointer(g->win,WA_Pointer,ami_custom_pointer(shape),TAG_DONE);
- break;
+ default:
+ if(mouseptrobj[shape])
+ {
+ SetWindowPointer(g->win,WA_Pointer,mouseptrobj[shape],TAG_DONE);
+ }
+ else
+ {
+ SetWindowPointer(g->win,TAG_DONE);
+ }
+ break;
+ }
+ }
+ else
+ {
+ if(mouseptrobj[shape])
+ {
+ SetWindowPointer(g->win,WA_Pointer,mouseptrobj[shape],TAG_DONE);
+ }
+ else
+ {
+ SetWindowPointer(g->win,TAG_DONE);
+ }
}
-
+ mouseptrcurrent = shape;
}
void gui_window_hide_pointer(struct gui_window *g)
{
- SetWindowPointer(g->win,WA_Pointer,ami_custom_pointer(0),TAG_DONE);
+ if(mouseptrcurrent != AMI_LASTPOINTER)
+ {
+ SetWindowPointer(g->win,WA_Pointer,mouseptrobj[AMI_LASTPOINTER],TAG_DONE);
+ mouseptrcurrent = AMI_LASTPOINTER;
+ }
+}
+
+void ami_init_mouse_pointers(void)
+{
+ int i;
+ struct RastPort mouseptr;
+ struct DiskObject *dobj;
+ uint32 format = IDFMT_BITMAPPED;
+ int32 mousexpt=0,mouseypt=0;
+
+ InitRastPort(&mouseptr);
+
+ for(i=0;i<=AMI_LASTPOINTER;i++)
+ {
+ BPTR ptrfile = 0;
+ mouseptrbm[i] = NULL;
+ mouseptrobj[i] = NULL;
+
+ if(option_truecolour_mouse_pointers)
+ {
+ if(dobj = GetIconTags(ptrs[i],ICONGETA_UseFriendBitMap,TRUE,TAG_DONE))
+ {
+ if(IconControl(dobj, ICONCTRLA_GetImageDataFormat, &format, TAG_DONE))
+ {
+ if(IDFMT_DIRECTMAPPED == format)
+ {
+ int32 width = 0, height = 0;
+ uint8* data = 0;
+ IconControl(dobj,
+ ICONCTRLA_GetWidth, &width,
+ ICONCTRLA_GetHeight, &height,
+ ICONCTRLA_GetImageData1, &data,
+ TAG_DONE);
+
+ if (width > 0 && width <= 64 && height > 0 && height <= 64 && data)
+ {
+ STRPTR tooltype;
+
+ if(tooltype = FindToolType(dobj->do_ToolTypes, "XOFFSET"))
+ mousexpt = atoi(tooltype);
+
+ if(tooltype = FindToolType(dobj->do_ToolTypes, "YOFFSET"))
+ mouseypt = atoi(tooltype);
+
+ if (mousexpt < 0 || mousexpt >= width)
+ mousexpt = 0;
+ if (mouseypt < 0 || mouseypt >= height)
+ mouseypt = 0;
+
+ static uint8 dummyPlane[64 * 64 / 8];
+ static struct BitMap dummyBitMap = { 64 / 8, 64, 0, 2, 0, { dummyPlane, dummyPlane, 0, 0, 0, 0, 0, 0 }, };
+
+ mouseptrobj[i] = NewObject(NULL, POINTERCLASS,
+ POINTERA_BitMap, &dummyBitMap,
+ POINTERA_XOffset, -mousexpt,
+ POINTERA_YOffset, -mouseypt,
+ POINTERA_WordWidth, (width + 15) / 16,
+ POINTERA_XResolution, POINTERXRESN_SCREENRES,
+ POINTERA_YResolution, POINTERYRESN_SCREENRESASPECT,
+ POINTERA_Dummy + 0x07, data,
+ POINTERA_Dummy + 0x08, width,
+ POINTERA_Dummy + 0x09, height,
+ TAG_DONE);
+ }
+ }
+ }
+ }
+ }
+
+ if(!mouseptrobj[i])
+ {
+ if(ptrfile = Open(ptrs[i],MODE_OLDFILE))
+ {
+ int mx,my;
+ UBYTE *pprefsbuf = AllocVec(1061,MEMF_CLEAR);
+ Read(ptrfile,pprefsbuf,1061);
+
+ mouseptrbm[i]=AllocVec(sizeof(struct BitMap),MEMF_CLEAR);
+ InitBitMap(mouseptrbm[i],2,32,32);
+ mouseptrbm[i]->Planes[0] = AllocRaster(32,32);
+ mouseptrbm[i]->Planes[1] = AllocRaster(32,32);
+ mouseptr.BitMap = mouseptrbm[i];
+
+ for(my=0;my<32;my++)
+ {
+ for(mx=0;mx<32;mx++)
+ {
+ SetAPen(&mouseptr,pprefsbuf[(my*(33))+mx]-'0');
+ WritePixel(&mouseptr,mx,my);
+ }
+ }
+
+ mousexpt = ((pprefsbuf[1056]-'0')*10)+(pprefsbuf[1057]-'0');
+ mouseypt = ((pprefsbuf[1059]-'0')*10)+(pprefsbuf[1060]-'0');
+
+ mouseptrobj[i] = NewObject(NULL,"pointerclass",
+ POINTERA_BitMap,mouseptrbm[i],
+ POINTERA_WordWidth,2,
+ POINTERA_XOffset,-mousexpt,
+ POINTERA_YOffset,-mouseypt,
+ POINTERA_XResolution,POINTERXRESN_SCREENRES,
+ POINTERA_YResolution,POINTERYRESN_SCREENRESASPECT,
+ TAG_DONE);
+
+ FreeVec(pprefsbuf);
+ Close(ptrfile);
+ }
+
+ }
+
+ } // for
}
void gui_window_set_url(struct gui_window *g, const char *url)
@@ -1692,6 +1788,8 @@ void gui_window_remove_caret(struct gui_window *g)
GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox);
BltBitMapRastPort(g->bm,g->c_x,g->c_y,g->win->RPort,bbox->Left+g->c_x,bbox->Top+g->c_y,2,g->c_h,0x0C0);
+
+ g->c_h = 0;
}
void gui_window_new_content(struct gui_window *g)
diff --git a/amiga/gui.h b/amiga/gui.h
index 179d43e8c..89cd74f03 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -24,6 +24,16 @@
#include "desktop/browser.h"
#include <dos/dos.h>
+/* temp icon.library stuff */
+#define ICONCTRLA_SetImageDataFormat (ICONA_Dummy + 0x67) /*103*/
+#define ICONCTRLA_GetImageDataFormat (ICONA_Dummy + 0x68) /*104*/
+
+/* Values for ICONCTRLA_Set/GetImageDataFormat */
+#define IDFMT_BITMAPPED (0) /* Bitmapped icon (planar, legacy) */
+#define IDFMT_PALETTEMAPPED (1) /* Palette mapped icon (chunky, V44+) */
+#define IDFMT_DIRECTMAPPED (2) /* Direct mapped icon (truecolor 0xAARRGGBB, V51+) */
+/* temp icon.library stuff */
+
void ami_get_msg(void);
enum
diff --git a/amiga/options.h b/amiga/options.h
index 40ad24d69..4859ba084 100644
--- a/amiga/options.h
+++ b/amiga/options.h
@@ -29,6 +29,8 @@ extern char *option_toolbar_images;
extern bool option_no_iframes;
extern bool option_utf8_clipboard;
extern int option_throbber_frames;
+extern bool option_truecolour_mouse_pointers;
+extern bool option_use_os_pointers;
#define EXTRA_OPTION_DEFINE \
bool option_verbose_log = false; \
@@ -39,7 +41,9 @@ int option_modeid = 0; \
char *option_toolbar_images = 0; \
bool option_no_iframes = false; \
bool option_utf8_clipboard = false; \
-int option_throbber_frames = 1;
+int option_throbber_frames = 1; \
+bool option_truecolour_mouse_pointers = true; \
+bool option_use_os_pointers = false; \
#define EXTRA_OPTION_TABLE \
{ "verbose_log", OPTION_BOOL, &option_verbose_log}, \
@@ -50,5 +54,7 @@ int option_throbber_frames = 1;
{ "toolbar_images", OPTION_STRING, &option_toolbar_images }, \
{ "no_iframes", OPTION_BOOL, &option_no_iframes}, \
{ "clipboard_write_utf8", OPTION_BOOL, &option_utf8_clipboard}, \
-{ "throbber_frames", OPTION_INTEGER, &option_throbber_frames},
+{ "throbber_frames", OPTION_INTEGER, &option_throbber_frames}, \
+{ "truecolour_mouse_pointers", OPTION_BOOL, &option_truecolour_mouse_pointers}, \
+{ "os_mouse_pointers", OPTION_BOOL, &option_use_os_pointers},
#endif
diff --git a/amiga/resources/Pointers/Blank.info b/amiga/resources/Pointers/Blank.info
new file mode 100644
index 000000000..5ce812b26
--- /dev/null
+++ b/amiga/resources/Pointers/Blank.info
Binary files differ
diff --git a/amiga/resources/Pointers/Caret.info b/amiga/resources/Pointers/Caret.info
new file mode 100644
index 000000000..11d9c5fc9
--- /dev/null
+++ b/amiga/resources/Pointers/Caret.info
Binary files differ
diff --git a/amiga/resources/Pointers/Cross.info b/amiga/resources/Pointers/Cross.info
new file mode 100644
index 000000000..7aa433139
--- /dev/null
+++ b/amiga/resources/Pointers/Cross.info
Binary files differ
diff --git a/amiga/resources/Pointers/Default.info b/amiga/resources/Pointers/Default.info
new file mode 100644
index 000000000..dc8c2b0ed
--- /dev/null
+++ b/amiga/resources/Pointers/Default.info
Binary files differ
diff --git a/amiga/resources/Pointers/Down.info b/amiga/resources/Pointers/Down.info
new file mode 100644
index 000000000..e4667bca1
--- /dev/null
+++ b/amiga/resources/Pointers/Down.info
Binary files differ
diff --git a/amiga/resources/Pointers/Help.info b/amiga/resources/Pointers/Help.info
new file mode 100644
index 000000000..ca5947105
--- /dev/null
+++ b/amiga/resources/Pointers/Help.info
Binary files differ
diff --git a/amiga/resources/Pointers/Left.info b/amiga/resources/Pointers/Left.info
new file mode 100644
index 000000000..5a4575cfc
--- /dev/null
+++ b/amiga/resources/Pointers/Left.info
Binary files differ
diff --git a/amiga/resources/Pointers/LeftDown.info b/amiga/resources/Pointers/LeftDown.info
new file mode 100644
index 000000000..e8f39cb24
--- /dev/null
+++ b/amiga/resources/Pointers/LeftDown.info
Binary files differ
diff --git a/amiga/resources/Pointers/LeftUp.info b/amiga/resources/Pointers/LeftUp.info
new file mode 100644
index 000000000..be80018f3
--- /dev/null
+++ b/amiga/resources/Pointers/LeftUp.info
Binary files differ
diff --git a/amiga/resources/Pointers/Menu.info b/amiga/resources/Pointers/Menu.info
new file mode 100644
index 000000000..2a1143f11
--- /dev/null
+++ b/amiga/resources/Pointers/Menu.info
Binary files differ
diff --git a/amiga/resources/Pointers/Move.info b/amiga/resources/Pointers/Move.info
new file mode 100644
index 000000000..606f5d283
--- /dev/null
+++ b/amiga/resources/Pointers/Move.info
Binary files differ
diff --git a/amiga/resources/Pointers/NoDrop.info b/amiga/resources/Pointers/NoDrop.info
new file mode 100644
index 000000000..22e77a4be
--- /dev/null
+++ b/amiga/resources/Pointers/NoDrop.info
Binary files differ
diff --git a/amiga/resources/Pointers/NotAllowed.info b/amiga/resources/Pointers/NotAllowed.info
new file mode 100644
index 000000000..01545bbba
--- /dev/null
+++ b/amiga/resources/Pointers/NotAllowed.info
Binary files differ
diff --git a/amiga/resources/Pointers/Point.info b/amiga/resources/Pointers/Point.info
new file mode 100644
index 000000000..6c7d65f0a
--- /dev/null
+++ b/amiga/resources/Pointers/Point.info
Binary files differ
diff --git a/amiga/resources/Pointers/Progress.info b/amiga/resources/Pointers/Progress.info
new file mode 100644
index 000000000..c47d52e99
--- /dev/null
+++ b/amiga/resources/Pointers/Progress.info
Binary files differ
diff --git a/amiga/resources/Pointers/Right.info b/amiga/resources/Pointers/Right.info
new file mode 100644
index 000000000..7080c4e77
--- /dev/null
+++ b/amiga/resources/Pointers/Right.info
Binary files differ
diff --git a/amiga/resources/Pointers/RightDown.info b/amiga/resources/Pointers/RightDown.info
new file mode 100644
index 000000000..0f5c181cf
--- /dev/null
+++ b/amiga/resources/Pointers/RightDown.info
Binary files differ
diff --git a/amiga/resources/Pointers/RightUp.info b/amiga/resources/Pointers/RightUp.info
new file mode 100644
index 000000000..140ef15c5
--- /dev/null
+++ b/amiga/resources/Pointers/RightUp.info
Binary files differ
diff --git a/amiga/resources/Pointers/Up.info b/amiga/resources/Pointers/Up.info
new file mode 100644
index 000000000..f4b44421f
--- /dev/null
+++ b/amiga/resources/Pointers/Up.info
Binary files differ
diff --git a/amiga/resources/Pointers/Wait.info b/amiga/resources/Pointers/Wait.info
new file mode 100644
index 000000000..88aa27a03
--- /dev/null
+++ b/amiga/resources/Pointers/Wait.info
Binary files differ