/******************************************************************** * 1.20* * XAES: New mouse driver and creation * * Code by Ken Hollis, GNU C Extensions by Sascha Blank * * * * Copyright (C) 1994, Bitgate Software * * * * The incredibly, revolutionary mouse routines. These routines * * are about 20 times smarter than normal GEM's routines. They * * don't flicker the mouse like normal GEM does. What a concept. * * * ********************************************************************/ #include #include #include #ifdef __GNUC__ #include #endif #include "xaes.h" #ifndef __MOUSE__ #define __MOUSE__ #endif MICE mouseform; /* forms */ int cur_mouse = 1, cur_mouse_form = BUSYBEE; int init_mouse[37] = { 8, 8, 1, 0, 1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFE, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x7FFE, 0x4002, 0x43C2, 0x47E2, 0x47E2, 0x43C2, 0x4002, 0x43C2, 0x4002, 0x7FFE, 0x1008, 0x2D74, 0x4002, 0x7FFE, 0x0000 }; int loadresource_mouse[37] = { 8, 8, 1, 0, 1, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x1FFE, 0x28F2, 0x48F2, 0x48F2, 0x48F2, 0x4FF2, 0x4002, 0x5DDA, 0x5512, 0x59D2, 0x5452, 0x55DA, 0x4002, 0x7FFE, 0x0000 }; int lrmove_mouse[37] = { 8, 8, 1, 0, 1, 0x0000, 0x0000, 0x0000, 0x1E78, 0x3E7C, 0x7E7E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7E7E, 0x3E7C, 0x1E78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C30, 0x1C38, 0x3C3C, 0x7FFE, 0x7FFE, 0x3C3C, 0x1C38, 0x0C30, 0x0000, 0x0000, 0x0000, 0x0000 }; int lrsize_mouse[37] = { 8, 8, 1, 0, 1, 0x081F, 0x1C1F, 0x3E3F, 0x7F7F, 0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF, 0x0FFF, 0x1FFF, 0x3FFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x080E, 0x1C0E, 0x3E2E, 0x7F6E, 0x3FEE, 0x1FEE, 0x0FEE, 0x07EE, 0x0FEE, 0x1FEE, 0x000E, 0x7FFE, 0x7FFE, 0x7FFE, 0x0000 }; int llsize_mouse[37] = { 8, 8, 1, 0, 1, 0xF810, 0xF838, 0xFC7C, 0xFEFE, 0xFFFF, 0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x7010, 0x7038, 0x747C, 0x76FE, 0x77FC, 0x77F8, 0x77F0, 0x77E0, 0x77F0, 0x77F8, 0x7000, 0x7FFE, 0x7FFE, 0x7FFE, 0x0000 }; int ulsize_mouse[37] = { 8, 8, 1, 0, 1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFC, 0xFFF8, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF, 0xFEFE, 0xFC7C, 0xF838, 0xF810, 0x0000, 0x7FFE, 0x7FFE, 0x7FFE, 0x7000, 0x77F8, 0x77F0, 0x77E0, 0x77F0, 0x77F8, 0x77FC, 0x76FE, 0x747C, 0x7038, 0x7010, 0x0000 }; int ursize_mouse[37] = { 8, 8, 1, 0, 1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x3FFF, 0x1FFF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x7F7F, 0x3E3F, 0x1C1F, 0x081F, 0x0000, 0x7FFE, 0x7FFE, 0x7FFE, 0x000E, 0x1FEE, 0x0FEE, 0x07EE, 0x0FEE, 0x1FEE, 0x3FEE, 0x7F6E, 0x3E2E, 0x1C0E, 0x080E, 0x0000 }; int udmove_mouse[37] = { 8, 8, 1, 0, 1, 0x0000, 0x03C0, 0x07E0, 0x0FF0, 0x1FF8, 0x1FF8, 0x1FF8, 0x03C0, 0x03C0, 0x1FF8, 0x1FF8, 0x1FF8, 0x0FF0, 0x07E0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0180, 0x03C0, 0x07E0, 0x0FF0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0FF0, 0x07E0, 0x03C0, 0x0180, 0x0000, 0x0000 }; int help_mouse[37] = { 0, 0, 1, 0, 1, 0xC07E, 0xE0FF, 0xF0FF, 0xF8FF, 0xFCFF, 0xFE3F, 0xFF3E, 0xFFBC, 0xFFFC, 0xFFFC, 0xFE3C, 0xEF3C, 0xCF00, 0x8780, 0x0780, 0x0780, 0x0000, 0x403C, 0x607E, 0x7066, 0x780E, 0x7C1C, 0x7E18, 0x7F18, 0x7F80, 0x7C18, 0x6C18, 0x4600, 0x0600, 0x0300, 0x0300, 0x0000 }; int ibarhelp_mouse[37] = { 8, 8, 1, 0, 1, 0xFFFE, 0xFFFF, 0xFFFF, 0x3FFF, 0x1EFF, 0x1E3F, 0x1E3E, 0x1E3C, 0x1E3C, 0x1E3C, 0x1E3C, 0x1E3C, 0x3F00, 0xFFC0, 0xFFC0, 0xFFC0, 0x0000, 0x73BC, 0x1E7E, 0x0C66, 0x0C0E, 0x0C1C, 0x0C18, 0x0C18, 0x0C00, 0x0C18, 0x0C18, 0x0C00, 0x0C00, 0x1E00, 0x7380, 0x0000 }; int tsizer_mouse[37] = { 8, 8, 1, 0, 1, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0xFFFF, 0xFFFF, 0xFFFF, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0x0000, 0x7FFE, 0x7FFE, 0x7FFE, 0x0180, 0x03C0, 0x07E0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x03C0, 0x03C0, 0x03C0, 0x03C0, 0x0000 }; int lsizer_mouse[37] = { 8, 8, 1, 0, 1, 0xF870, 0xF8F0, 0xF9F0, 0xFBF0, 0xFFF0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFF0, 0xFBF0, 0xF9F0, 0xF8F0, 0xF870, 0x0000, 0x7020, 0x7060, 0x70E0, 0x71E0, 0x73E0, 0x77FE, 0x7FFE, 0x7FFE, 0x77FE, 0x73E0, 0x71E0, 0x70E0, 0x7060, 0x7020, 0x0000 }; int rsizer_mouse[37] = { 8, 8, 1, 0, 1, 0x0E1F, 0x0F1F, 0x0F9F, 0x0FDF, 0x0FFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0FFF, 0x0FDF, 0x0F9F, 0x0F1F, 0x0E1F, 0x0000, 0x040E, 0x060E, 0x070E, 0x078E, 0x07CE, 0x7FEE, 0x7FFE, 0x7FFE, 0x7FEE, 0x07CE, 0x078E, 0x070E, 0x060E, 0x040E, 0x0000 }; int bsizer_mouse[37] = { 8, 8, 1, 0, 1, 0x07E0, 0x07E0, 0x07E0, 0x07E0, 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x03C0, 0x03C0, 0x03C0, 0x03C0, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x07E0, 0x03C0, 0x0180, 0x7FFE, 0x7FFE, 0x7FFE, 0x0000 }; int mover_mouse[37] = { 8, 8, 1, 0, 1, 0x0380, 0x07C0, 0x0FE0, 0x0FE0, 0x37D8, 0x7FFC, 0xFFFE, 0xFFFF, 0xFFFE, 0x7FFC, 0x37D8, 0x0FE0, 0x0FE0, 0x07C0, 0x0380, 0x0100, 0x0100, 0x0380, 0x07C0, 0x0380, 0x0380, 0x2388, 0x7FFC, 0xFFFE, 0x7FFC, 0x2388, 0x0380, 0x0380, 0x07C0, 0x0380, 0x0100, 0x0000 }; int nomodal_mouse[37] = { 8, 8, 1, 0, 1, 0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0, 0x0000, 0x03C0, 0x0FF0, 0x1FF8, 0x3E7C, 0x38FC, 0x79FE, 0x73EE, 0x77CE, 0x7F9E, 0x3F1C, 0x3E7C, 0x1FF8, 0x0FF0, 0x03C0, 0x0000 }; int nowindow_mouse[37] = { 8, 8, 1, 0, 1, 0x1008, 0x381C, 0x7C3E, 0xFE7F, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0xFE7F, 0x7C3E, 0x381C, 0x1008, 0x0000, 0x1008, 0x381C, 0x7C3E, 0x3E7C, 0x1FF8, 0x0FF0, 0x07E0, 0x07E0, 0x0FF0, 0x1FF8, 0x3E7C, 0x7C3E, 0x381C, 0x1008, 0x0000 }; /* * Custom mouse routine * by Ken Hollis * * Returns: (0) on any type of failure * (-1) on successful custom mouse transaction * (any other number) to report the mouse result or a * successful AES mouse transaction */ GLOBAL int WGrafMouse(int mo_sfield, ...) { va_list argptr; int mform, store; switch(mo_sfield) { case GET_MOUSE: va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); if (mouseform.forms[cur_mouse]!=0) { if (store) cur_mouse_form = (mouseform.forms[cur_mouse] == 0) ? cur_mouse_form : mouseform.forms[cur_mouse]; return((mouseform.forms[cur_mouse] == 0) ? 0 : mouseform.forms[cur_mouse]); } else return(0); case SAVE_MOUSE: va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); if (cur_mouse==16) return(0); else { if (store) cur_mouse_form = mform; mouseform.forms[cur_mouse++] = mform; } return(-1); case PREV_MOUSE: va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); if (cur_mouse==1) return(0); else { if (store) cur_mouse_form = (mouseform.forms[(cur_mouse-1)] == 0) ? cur_mouse_form : mouseform.forms[(cur_mouse-1)]; return((mouseform.forms[(cur_mouse-1)] == 0) ? 0 : mouseform.forms[(cur_mouse-1)]); } case NEXT_MOUSE: va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); if (cur_mouse==16) return(0); else { if (store) cur_mouse_form = (mouseform.forms[(cur_mouse+1)] == 0) ? cur_mouse_form : mouseform.forms[(cur_mouse+1)]; return((mouseform.forms[(cur_mouse+1)] == 0) ? 0 : mouseform.forms[(cur_mouse+1)]); } case FIRST_MOUSE: va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); if (cur_mouse==1) { if (store) cur_mouse_form = (mouseform.forms[cur_mouse] == 0) ? cur_mouse_form : mouseform.forms[cur_mouse]; return((mouseform.forms[cur_mouse] == 0) ? 0 : mouseform.forms[cur_mouse]); } else { if (store) cur_mouse_form = (mouseform.forms[1] == 0) ? cur_mouse_form : mouseform.forms[1]; return((mouseform.forms[1] == 0) ? 0 : mouseform.forms[1]); } case LAST_MOUSE: { int pos = 1; va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); do { if(mouseform.forms[pos]!=0) pos++; else { if (store) cur_mouse_form = mouseform.forms[pos]; return(mouseform.forms[pos]); } } while(pos<16); return(0); } case CLEAR_MOUSE: { int pos = 1; do { mouseform.forms[pos++] = 0; } while(pos<16); return(-1); } case FIND_MOUSE: { int pos = 1; va_start(argptr, mo_sfield); mform = va_arg(argptr, int); store = va_arg(argptr, int); va_end(argptr); do { if(mouseform.forms[pos]==mform) { if (store) cur_mouse_form = mouseform.forms[pos]; return(pos); } else pos++; } while(pos<16); return(0); } case NEWPOS_MOUSE: va_start(argptr, mo_sfield); mform = va_arg(argptr, int); va_end(argptr); cur_mouse = mform; return(-1); case TEXT_CRSR: case BUSYBEE: case POINT_HAND: case FLAT_HAND: case THIN_CROSS: case THICK_CROSS: case OUTLN_CROSS: case M_OFF: case M_ON: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(mo_sfield, 0L)); } break; case ARROW: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; helpmode = FALSE; if (helpmode) return(graf_mouse(USER_DEF, (MFORM *) help_mouse)); else return(graf_mouse(mo_sfield, 0L)); } break; case INIT_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) init_mouse)); } break; case LOAD_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) loadresource_mouse)); } break; case LRSLIDE_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) lrmove_mouse)); } break; case UDSLIDE_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) udmove_mouse)); } break; case URMOVE_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) ursize_mouse)); } break; case ULMOVE_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) ulsize_mouse)); } break; case LLMOVE_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) llsize_mouse)); } break; case LRMOVE_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) lrsize_mouse)); } break; case HELP_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; helpmode = TRUE; return(graf_mouse(USER_DEF, (MFORM *) help_mouse)); } break; case IBARHELP_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; helpmode = TRUE; return(graf_mouse(USER_DEF, (MFORM *) ibarhelp_mouse)); } break; case TSIZER_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) tsizer_mouse)); } break; case LSIZER_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) lsizer_mouse)); } break; case RSIZER_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) rsizer_mouse)); } break; case BSIZER_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) bsizer_mouse)); } break; case MOVER_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) mover_mouse)); } break; case NOMODAL_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) nomodal_mouse)); } break; case NOWINDOW_MOUSE: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(USER_DEF, (MFORM *) nowindow_mouse)); } break; default: if (cur_mouse_form != mo_sfield) { mouseform.forms[cur_mouse] = cur_mouse_form = mo_sfield; return(graf_mouse(mo_sfield, 0L)); } break; } return(-1); }