home *** CD-ROM | disk | FTP | other *** search
- /* > $.CLIB.C.pollwind
- *
- * HASWIN Graphics Library
- * =========================
- *
- * Copyright (C) H.A.Shaw 1990.
- * Howard A. Shaw.
- * The Unit for Space Sciences,
- * Room 165,
- * Physics Building,
- * University of Kent at Canterbury.
- * Canterbury.
- * Kent. CT2 7NJ
- * You may use and distribute this code freely, however please leave
- * it alone. If you find bugs (and there will be many) please contact
- * me and the master source can be modified. If you keep me informed
- * of who you give copies of this to then I can get release upgrades
- * to them.
- *
- * routine to perform windows related reason code returns from
- * SWI(Wimp_Poll)
- */
- #include "c.poll_h"
-
- /*
- * this routine handles window redrawing called from SWI(Wimp_Poll)
- * reason code 1. It checks to see if output must be redirected to
- * a sprite.
- */
- int haswin_poll_redraw(int (*user)(int, buffer *), buffer *pbuf) {
-
- int adjx, adjy, whandle, more;
- window *wptr;
- _kernel_swi_regs regs;
- buffer buff;
-
- if ((user) && (!((*user)(HASWIN_POLL_Redraw, pbuf))))
- return(HASWIN_FALSE);
- whandle = pbuf->i[0];
- if (haswin_spritejob.win == whandle) {
- regs.r[0] = 0x3C;
- regs.r[3] = (int)haswin_spritejob.savearea;
- haswin_spriteop(haswin_spritejob.name, ®s);
- haswin_spritejob.r0 = regs.r[0];
- haswin_spritejob.r1 = regs.r[1];
- haswin_spritejob.r2 = regs.r[2];
- haswin_spritejob.r3 = regs.r[3];
- }
- buff.i[0] = whandle;
- regs.r[1] = (int)&buff;
- if (!haswin_swi(HASWIN_Redraw_window, ®s)) {
- if (haswin_spritejob.win == whandle) {
- /* switch output back to screen */
- regs.r[0] = haswin_spritejob.r0;
- regs.r[1] = haswin_spritejob.r1;
- regs.r[2] = haswin_spritejob.r2;
- regs.r[3] = haswin_spritejob.r3;
- haswin_spriteop(0, ®s);
- }
- return(HASWIN_FALSE);
- }
- more = regs.r[0];
- if (haswin_spritejob.win == whandle) {
- /* switch output back to screen */
- regs.r[0] = haswin_spritejob.r0;
- regs.r[1] = haswin_spritejob.r1;
- regs.r[2] = haswin_spritejob.r2;
- regs.r[3] = haswin_spritejob.r3;
- haswin_spriteop(0, ®s);
- }
- while (more) {
- whandle = buff.i[0];
- if ((int)(wptr=haswin_findwindowhandle(whandle)) > 0) {
- haswin_updatewindowinfo(wptr);
- if (haswin_spritejob.win == whandle) {
- regs.r[0] = 0x3C;
- regs.r[3] = (int)haswin_spritejob.savearea;
- haswin_spriteop(haswin_spritejob.name, ®s);
- haswin_spritejob.r0 = regs.r[0];
- haswin_spritejob.r1 = regs.r[1];
- haswin_spritejob.r2 = regs.r[2];
- haswin_spritejob.r3 = regs.r[3];
- }
- if (!((wptr->drawroutine) &&
- (!wptr->drawroutine(wptr, &buff)))) {
- if (wptr->text) {
- adjx=buff.i[1]-buff.i[5]+wptr->orgx;
- adjy=buff.i[4]-buff.i[6]+wptr->orgy;
- text_plot(wptr->text, adjx,
- adjy, buff.i[7], buff.i[ 9],
- buff.i[8], buff.i[10]);
- }
- if (wptr->picture) {
- adjx=buff.i[1]-buff.i[5]+wptr->orgx;
- adjy=buff.i[4]-buff.i[6]+wptr->orgy;
- graphics_plot(wptr->picture, adjx,
- adjy, buff.i[7], buff.i[ 9],
- buff.i[8], buff.i[10]);
- }
- }
- }
- buff.i[0] = whandle;
- regs.r[1] = (int)&buff;
- if (!haswin_swi(HASWIN_Get_rectangle, ®s)) {
- if (haswin_spritejob.win == whandle) {
- /* switch output back to screen */
- regs.r[0] = haswin_spritejob.r0;
- regs.r[1] = haswin_spritejob.r1;
- regs.r[2] = haswin_spritejob.r2;
- regs.r[3] = haswin_spritejob.r3;
- haswin_spriteop(0, ®s);
- }
- return(HASWIN_FALSE);
- }
- more = regs.r[0];
- if (haswin_spritejob.win == whandle) {
- /* switch output back to screen */
- regs.r[0] = haswin_spritejob.r0;
- regs.r[1] = haswin_spritejob.r1;
- regs.r[2] = haswin_spritejob.r2;
- regs.r[3] = haswin_spritejob.r3;
- haswin_spriteop(0, ®s);
- }
- }
- if (haswin_spritejob.win == whandle)
- haswin_spritejob.win=0; /* sprite drawn in, finished */
- if ((user) && (!((*user)(HASWIN_POLL_PostRedraw, pbuf))))
- return(HASWIN_FALSE);
- return(HASWIN_TRUE);
- }
-
- void haswin_redrawwindow(window *win, int x0, int x1, int y0, int y1) {
-
- _kernel_swi_regs regs;
- int whandle, adjx, adjy, more;
- buffer buff;
- window *wptr;
-
- if ((int)win <= 0)
- whandle = (int)win;
- else
- whandle = win->handle;
- if (!(haswin_getwindowflags(win) & WINDOW_OPEN))
- /* nothing to do if window is not open */
- return;
- if (haswin_spritejob.win == whandle) {
- regs.r[0] = 0x3C;
- regs.r[3] = (int)haswin_spritejob.savearea;
- haswin_spriteop(haswin_spritejob.name, ®s);
- haswin_spritejob.r0 = regs.r[0];
- haswin_spritejob.r1 = regs.r[1];
- haswin_spritejob.r2 = regs.r[2];
- haswin_spritejob.r3 = regs.r[3];
- }
- buff.i[0] = whandle;
- buff.i[1] = x0 + win->orgx;
- buff.i[2] = y0 + win->orgy;
- buff.i[3] = x1 + win->orgx;
- buff.i[4] = y1 + win->orgy;
- regs.r[1] = (int)&buff;
- if (!haswin_swi(HASWIN_Update_window, ®s))
- return;
- more = regs.r[0];
- if (haswin_spritejob.win == whandle) {
- /* switch output back to screen */
- regs.r[0] = haswin_spritejob.r0;
- regs.r[1] = haswin_spritejob.r1;
- regs.r[2] = haswin_spritejob.r2;
- regs.r[3] = haswin_spritejob.r3;
- haswin_spriteop(0, ®s);
- }
- while (more) {
- whandle = buff.i[0];
- if ((int)(wptr=haswin_findwindowhandle(whandle)) > 0) {
- haswin_updatewindowinfo(wptr);
- if (haswin_spritejob.win == whandle) {
- regs.r[0] = 0x3C;
- regs.r[3] = (int)haswin_spritejob.savearea;
- haswin_spriteop(haswin_spritejob.name, ®s);
- haswin_spritejob.r0 = regs.r[0];
- haswin_spritejob.r1 = regs.r[1];
- haswin_spritejob.r2 = regs.r[2];
- haswin_spritejob.r3 = regs.r[3];
- }
- graphics_gcol(0, wptr->win[35]);
- graphics_rectanglefill(buff.i[7], buff.i[8],
- buff.i[ 9]-buff.i[ 7],
- buff.i[10]-buff.i[ 8]);
- if (!((wptr->drawroutine) &&
- (!wptr->drawroutine(wptr, &buff)))) {
- if (wptr->text) {
- adjx=buff.i[1]-buff.i[5]+wptr->orgx;
- adjy=buff.i[4]-buff.i[6]+wptr->orgy;
- text_plot(wptr->text, adjx,
- adjy, buff.i[7], buff.i[ 9],
- buff.i[8], buff.i[10]);
- }
- if (wptr->picture) {
- adjx=buff.i[1]-buff.i[5]+wptr->orgx;
- adjy=buff.i[4]-buff.i[6]+wptr->orgy;
- graphics_plot(wptr->picture, adjx,
- adjy, buff.i[7], buff.i[ 9],
- buff.i[8], buff.i[10]);
- }
- }
- if (haswin_spritejob.win == whandle) {
- /* switch output back to screen */
- regs.r[0] = haswin_spritejob.r0;
- regs.r[1] = haswin_spritejob.r1;
- regs.r[2] = haswin_spritejob.r2;
- regs.r[3] = haswin_spritejob.r3;
- haswin_spriteop(0, ®s);
- }
- }
- buff.i[0] = whandle;
- regs.r[1] = (int)&buff;
- if (!haswin_swi(HASWIN_Get_rectangle, ®s))
- return;
- more = regs.r[0];
- }
- }
-
- int haswin_poll_open(int (*user)(int, buffer *), buffer *pbuf) {
-
- window *wptr;
-
- wptr = haswin_findwindowhandle(pbuf->i[0]);
- pbuf->i[8] = (int)wptr;
- if ((user) && (!((*user)(HASWIN_POLL_Open, pbuf))))
- return(HASWIN_FALSE);
- if ((int)wptr > 0) {
- return(haswin_openwindow(wptr, pbuf->i[1], pbuf->i[2], pbuf->i[3], pbuf->i[4], pbuf->i[5], pbuf->i[6], pbuf->i[7]));
- }
- return(HASWIN_FALSE);
- }
-
- int haswin_poll_close(int (*user)(int, buffer *), buffer *pbuf) {
-
- pointer *mouse;
- window *wptr;
-
- wptr = haswin_findwindowhandle(pbuf->i[0]);
- pbuf->i[1] = (int)wptr;
- if ((user) && (!((*user)(HASWIN_POLL_Close, pbuf))))
- return(HASWIN_FALSE);
- if ((int)wptr > 0) {
- if (wptr->flags&WINDOW_FILER) {
- mouse = haswin_getpointerinfo(0);
- if ((mouse->buttons&POINTER_MOUSEBUTTONS) == POINTER_MOUSE_R)
- haswin_openfiler("adfs", haswin_getwindowname(wptr));
- haswin_free(mouse);
- }
- haswin_closewindow(wptr);
- return(HASWIN_TRUE);
- } else
- return(HASWIN_FALSE);
- }
-
- int haswin_poll_leaving(int (*user)(int, buffer *), buffer *pbuf) {
-
- window *wptr;
- caret car;
-
- wptr = haswin_findwindowhandle(pbuf->i[0]);
- pbuf->i[1] = (int)wptr;
- if ((user) && (!((*user)(HASWIN_POLL_Leaving, pbuf))))
- return(HASWIN_FALSE);
- if ((int)wptr > 0) {
- if (wptr->flags & WINDOW_SELECT) {
- haswin_getcaretinfo(&car);
- if (wptr == car.win)
- haswin_popcaret();
- }
- if (wptr->pointer)
- haswin_poppointer(HASWIN_FALSE);
- }
- return(HASWIN_TRUE);
- }
-
- int haswin_poll_entering(int (*user)(int, buffer *), buffer *pbuf) {
-
- window *wptr;
- caret car;
-
- wptr = haswin_findwindowhandle(pbuf->i[0]);
- pbuf->i[1] = (int)wptr;
- if ((user) && (!((*user)(HASWIN_POLL_Entering, pbuf))))
- return(HASWIN_FALSE);
- if ((int)wptr > 0) {
- if (wptr->flags & WINDOW_SELECT) {
- if (wptr->caret)
- haswin_pushcaret(wptr->caret);
- else {
- car.win = wptr;
- car.ic = (icon *)(-1);
- car.x = 5;
- car.y = -45;
- car.flags = 0;
- car.index = 0;
- car.height = 40;
- car.colour = 11;
- haswin_pushcaret(&car);
- }
- }
- if (wptr->pointer) {
- haswin_pushpointer(wptr->pointer, HASWIN_FALSE);
- }
- }
- return(HASWIN_TRUE);
- }
-
- int haswin_poll_key(int (*user)(int, buffer *), buffer *pbuf) {
-
- window *wptr;
- icon *iptr;
- pointer *mouse;
- _kernel_swi_regs regs;
-
- wptr = haswin_findwindowhandle(pbuf->i[0]);
- iptr = haswin_findiconhandle(wptr, pbuf->i[1]);
- pbuf->i[7] = (int)wptr;
- pbuf->i[8] = (int)iptr;
- if ((user) && (!((*user)(HASWIN_POLL_Key, pbuf))))
- return(HASWIN_FALSE);
- if ((wptr) && (!iptr) && (wptr->text)) {
- /* key pressed while in a window with text, add it */
- haswin_textvdu(wptr, pbuf->i[6]);
- return(HASWIN_TRUE);
- }
- if (pbuf->i[6] == 13) {
- /* CR used to complete entry, pretend to be mouse SELECT */
- mouse = haswin_getpointerinfo(0);
- regs.r[0] = HASWIN_POLL_Mouse;
- regs.r[1] = (int)pbuf;
- regs.r[2] = pbuf->i[0];
- regs.r[3] = pbuf->i[1];
- pbuf->i[3] = pbuf->i[0];
- pbuf->i[4] = pbuf->i[1];
- pbuf->i[0] = mouse->mx;
- pbuf->i[1] = mouse->my;
- pbuf->i[2] = haswin_buttonHASWINtoWIMP(wptr, iptr, HASWIN_MOUSE_L);
- if (!haswin_swi(HASWIN_Send_message, ®s))
- return(HASWIN_FALSE);
- return(HASWIN_TRUE);
- }
- if ((pbuf->i[6] >= 0x181) && (pbuf->i[6] <= 0x189)) {
- /* F1 - F9, find icon 0 - 8 and pretend to be mouse SELECT */
- iptr = haswin_findiconhandle(wptr, (pbuf->i[6]&0x00F)-1);
- if (iptr) {
- mouse = haswin_getpointerinfo(0);
- mouse->win = wptr;
- mouse->ic = iptr;
- haswin_setpointer(mouse, HASWIN_TRUE);
- regs.r[0] = HASWIN_POLL_Mouse;
- regs.r[1] = (int)pbuf;
- regs.r[2] = iptr->whandle;
- regs.r[3] = iptr->ihandle;
- pbuf->i[4] = iptr->ihandle;
- pbuf->i[3] = iptr->whandle;
- pbuf->i[1] = mouse->my;
- pbuf->i[0] = mouse->mx;
- pbuf->i[2] = haswin_buttonHASWINtoWIMP(wptr, iptr, HASWIN_MOUSE_L);
- if (!haswin_swi(HASWIN_Send_message, ®s))
- return(HASWIN_FALSE);
- return(HASWIN_TRUE);
- }
- }
- /* can't handle key, so pass it on */
- regs.r[0] = pbuf->i[6];
- haswin_swi(HASWIN_Process_key, ®s);
- return(HASWIN_TRUE);
- }
-
- int haswin_poll_lcaret(int (*user)(int, buffer *), buffer *pbuf) {
-
- if ((user) && (!((*user)(HASWIN_POLL_Lose_Caret, pbuf))))
- return(HASWIN_FALSE);
- return(HASWIN_TRUE);
- }
-
- int haswin_poll_gcaret(int (*user)(int, buffer *), buffer *pbuf) {
-
- if ((user) && (!((*user)(HASWIN_POLL_Gane_Caret, pbuf))))
- return(HASWIN_FALSE);
- return(HASWIN_TRUE);
- }
-
-