/* * Drag a moving XOR box(w,h) that tracks relative to the mouse * until the button comes up. The starting x and y represent * the location of the upper left hand corner of the rectangle * relative to the mouse position. This relative distance should * be maintained. A constraining rectangle is also given. The * box should not be able to be dragged out of the contraining * rectangle. */ void gr_dragbox(WORD w, WORD h, WORD sx, WORD sy, GRECT *pc, WORD *pdx, WORD *pdy) { WORD offx, offy, down; GRECT o; wm_update(TRUE); gr_setup(BLACK); gr_clamp(sx+1, sy+1, 0, 0, &offx, &offy); r_set(&o, sx, sy, w, h); /* get box's x,y from */ /* mouse's x,y then */ /* constrain result */ do { o.g_x = xrat - offx; o.g_y = yrat - offy; rc_constrain(pc, &o); down = gr_wait(&o, &gl_rzero); } while (down); *pdx = o.g_x; *pdy = o.g_y; wm_update(FALSE); } /* gr_dragbox */
/* * Give everyone a chance to run, at least once */ void all_run(void) { WORD i; /* let all the acc's run*/ for(i=0; i<NUM_ACCS; i++) { dsptch(); } /* then get in the wait line */ wm_update(TRUE); wm_update(FALSE); }
/* return 1 if event was handled by window manager*/ int wm_handle_event(GR_EVENT *event) { switch(event->type) { case GR_EVENT_TYPE_EXPOSURE: return wm_exposure(&event->exposure); case GR_EVENT_TYPE_BUTTON_DOWN: return wm_button_down(&event->button); case GR_EVENT_TYPE_BUTTON_UP: return wm_button_up(&event->button); case GR_EVENT_TYPE_MOUSE_ENTER: return wm_mouse_enter(&event->general); case GR_EVENT_TYPE_MOUSE_EXIT: return wm_mouse_exit(&event->general); case GR_EVENT_TYPE_MOUSE_POSITION: return wm_mouse_moved(&event->mouse); case GR_EVENT_TYPE_KEY_DOWN: return wm_key_down(&event->keystroke); case GR_EVENT_TYPE_KEY_UP: return wm_key_up(&event->keystroke); case GR_EVENT_TYPE_FOCUS_IN: return wm_focus_in(&event->general); case GR_EVENT_TYPE_CHLD_UPDATE: return wm_update(&event->update); case GR_EVENT_TYPE_NONE: break; case GR_EVENT_TYPE_ERROR: Dprintf("nanowm: error event code %d\n", event->error.code); break; default: Dprintf("nanowm: unexpected event %d\n", event->type); break; } return 0; }
/* * This function deletes _ALL_ windows and clears all locks that have been * done with wind_update() */ void wm_new(void) { int wh; /* Remove locks: */ while(ml_ocnt > 0) wm_update(2); /* END_MCTRL */ while(wind_spb.sy_tas > 0) wm_update(0); /* END_UPDATE */ /* Delete windows: */ for(wh = 1; wh < NUM_WIN; wh++) { if(D.w_win[wh].w_flags & VF_INTREE) wm_close(wh); if(D.w_win[wh].w_flags & VF_INUSE) wm_delete(wh); } }
/* * Opens or closes a window. */ void wm_opcl(WORD wh, GRECT *pt, WORD isadd) { GRECT t; rc_copy(pt, &t); wm_update(TRUE); if (isadd) { D.w_win[wh].w_flags |= VF_INTREE; w_obadd(&W_TREE[ROOT], ROOT, wh); } else { ob_delete(gl_wtree, wh); D.w_win[wh].w_flags &= ~VF_INTREE; } draw_change(wh, &t); if (isadd) w_setsize(WS_PREV, wh, pt); wm_update(FALSE); }
void ct_mouse(WORD grabit) { if (grabit) { wm_update(TRUE); gl_ctmown = TRUE; gl_mowner = rlr; gsx_mfset(ad_armice); gl_tmpmoff = gl_moff; if (gl_tmpmoff) ratinit(); } else { if (gl_tmpmoff) gsx_moff(); gl_moff = gl_tmpmoff; gsx_mfset(&gl_mouse); gl_ctmown = FALSE; wm_update(FALSE); } }
/* * Stretch the free corner of an XOR box(w,h) that is pinned at * another corner based on mouse movement until the button comes * up. Also draw a second box offset from the stretching box. */ void gr_rubwind(WORD xorigin, WORD yorigin, WORD wmin, WORD hmin, GRECT *poff, WORD *pwend, WORD *phend) { WORD down; GRECT o; wm_update(TRUE); gr_setup(BLACK); r_set(&o, xorigin, yorigin, 0, 0); /* clamp size of rubber */ /* box to no smaller */ /* than wmin, hmin */ do { gr_clamp(o.g_x, o.g_y, wmin, hmin, &o.g_w, &o.g_h); down = gr_wait(&o, poff); } while (down); *pwend = o.g_w; *phend = o.g_h; wm_update(FALSE); } /* gr_rubwind */
WORD fm_alert(WORD defbut, LONG palstr) { register WORD i; WORD inm, nummsg, mlenmsg, numbut, mlenbut, image; LONG tree; GRECT d, t; OBJECT *obj; /* init tree pointer */ tree = (LONG) rs_trees[DIALERT]; gsx_mfset(ad_armice); fm_parse(tree, palstr, &inm, &nummsg, &mlenmsg, &numbut, &mlenbut); fm_build(tree, (inm != 0), nummsg, mlenmsg, numbut, mlenbut); if (defbut) { obj = ((OBJECT *)tree) + BUTOFF + defbut - 1; obj->ob_flags |= DEFAULT; } obj = ((OBJECT *)tree) + 1; if (inm != 0) { switch(inm) { case 1: image = NOTEBB; break; case 2: image = QUESTBB; break; default: image = STOPBB; break; } obj->ob_spec = (LONG) &rs_bitblk[image]; } /* convert to pixels */ for(i=0; i<NUM_ALOBJS; i++) rs_obfix(tree, i); /* fix up icon, 32x32 */ obj->ob_type = G_IMAGE; obj->ob_width = obj->ob_height = 32; /* center tree on screen*/ ob_center(tree, &d); /* Fix 2003-09-25: Limit drawing to the screen! */ rc_intersect(&gl_rscreen, &d); /* save screen under- */ /* neath the alert */ wm_update(TRUE); gsx_gclip(&t); bb_save(&d); /* draw the alert */ gsx_sclip(&d); ob_draw(tree, ROOT, MAX_DEPTH); /* turn on the mouse */ ct_mouse(TRUE); /* let user pick button */ i = fm_do(tree, 0); /* turn off mouse if necessary */ ct_mouse(FALSE); /* restore saved screen */ gsx_sclip(&d); bb_restore(&d); gsx_sclip(&t); wm_update(FALSE); /* return selection */ return( i - BUTOFF + 1 ); }
void wm_set(WORD w_handle, WORD w_field, WORD *pinwds) { WORD which, liketop, i; register WORD wbar; WORD osl, osz, nsl, nsz; GRECT t; WINDOW *pwin; osl = osz = nsl = nsz = 0; which = -1; /* grab the window sync */ wm_update(TRUE); pwin = &D.w_win[w_handle]; wbar = wm_gsizes(w_field, &osl, &osz); if (wbar) { pinwds[0] = max(-1, pinwds[0]); pinwds[0] = min(1000, pinwds[0]); } liketop = ( ( w_handle == gl_wtop ) || ( pwin->w_flags & VF_SUBWIN ) ); switch(w_field) { case WF_NAME: which = W_NAME; break; case WF_INFO: which = W_INFO; break; case WF_SIZTOP: ob_order(gl_wtree, w_handle, NIL); /* fall thru */ case WF_CXYWH: draw_change(w_handle, (GRECT *)&pinwds[0]); break; case WF_TOP: if (w_handle != gl_wtop) { for(i=W_TREE[ROOT].ob_head; i>ROOT; i=W_TREE[i].ob_next) { if ( (i != w_handle) && (D.w_win[i].w_owner == rlr) && (D.w_win[i].w_flags & VF_SUBWIN) && (pwin->w_flags & VF_SUBWIN) ) wm_mktop(i); } wm_mktop(w_handle); } break; case WF_NEWDESK: pwin->w_owner = rlr; desk_tree[rlr->p_pid] = gl_newdesk = *(LONG *) &pinwds[0]; desk_root[rlr->p_pid] = gl_newroot = pinwds[2]; break; case WF_HSLSIZ: pwin->w_hslsiz = pinwds[0]; break; case WF_VSLSIZ: pwin->w_vslsiz = pinwds[0]; break; case WF_HSLIDE: pwin->w_hslide = pinwds[0]; break; case WF_VSLIDE: pwin->w_vslide = pinwds[0]; break; case WF_TATTRB: if (pinwds[0] & WA_SUBWIN) pwin->w_flags |= VF_SUBWIN; else pwin->w_flags &= ~VF_SUBWIN; if (pinwds[0] & WA_KEEPWIN) pwin->w_flags |= VF_KEEPWIN; else pwin->w_flags &= ~VF_KEEPWIN; break; } if ( (wbar) && (liketop) ) { w_bldactive(w_handle); wm_gsizes(w_field, &nsl, &nsz); if ( (osl != nsl) || (osz != nsz) || (pwin->w_flags & VF_SUBWIN) ) { w_getsize(WS_TRUE, w_handle, &t); do_walk(w_handle, gl_awind, wbar + 3, MAX_DEPTH, &t); } } if (which != -1) w_strchg(w_handle, which, *(LONG *)pinwds); /* give up the sync */ wm_update(FALSE); }
static UWORD crysbind(WORD opcode, LONG pglobal, WORD control[], WORD int_in[], WORD int_out[], LONG addr_in[]) { LONG maddr; LONG tree; WORD mouse, ret; WORD unsupported = FALSE; maddr = 0; ret = TRUE; switch(opcode) { /* Application Manager */ case APPL_INIT: #if DBG_GEMSUPER aestrace("appl_init()"); #endif LWSET(pglobal, AES_VERSION); /* version number */ LWSET(pglobal+2, 0x0001); /* num of concurrent procs*/ /* LLSET(pglobal, 0x00010200L); */ LWSET(pglobal+4, rlr->p_pid); sh_deskf(0, pglobal+6); LWSET(pglobal+20, gl_nplanes); LLSET(pglobal+22, ADDR(&D)); /* reset dispatcher */ /* count to let the app*/ /* run a while. */ dspcnt = 0; ret = ap_init(); break; case APPL_READ: case APPL_WRITE: ap_rdwr(opcode == APPL_READ ? MU_MESAG : MU_SDMSG, fpdnm(NULLPTR, AP_RWID), AP_LENGTH, AP_PBUFF); break; case APPL_FIND: ret = ap_find( AP_PNAME ); break; case APPL_TPLAY: ap_tplay(AP_TBUFFER, AP_TLENGTH, AP_TSCALE); break; case APPL_TRECORD: ret = ap_trecd(AP_TBUFFER, AP_TLENGTH); break; #if CONF_WITH_PCGEM case APPL_YIELD: dsptch(); break; #endif case APPL_EXIT: #if DBG_GEMSUPER aestrace("appl_exit()"); #endif ap_exit(); break; /* Event Manager */ case EVNT_KEYBD: ret = ev_block(MU_KEYBD, 0x0L); break; case EVNT_BUTTON: ret = ev_button(B_CLICKS, B_MASK, B_STATE, &EV_MX); break; case EVNT_MOUSE: ret = ev_mouse((MOBLK *)&MO_FLAGS, &EV_MX); break; case EVNT_MESAG: #if DBG_GEMSUPER aestrace("evnt_mesag()"); #endif ap_rdwr(MU_MESAG, rlr, 16, ME_PBUFF); break; case EVNT_TIMER: ev_timer( HW(T_HICOUNT) + LW(T_LOCOUNT) ); break; case EVNT_MULTI: #if DBG_GEMSUPER aestrace("evnt_multi()"); #endif if (MU_FLAGS & MU_TIMER) maddr = HW(MT_HICOUNT) + LW(MT_LOCOUNT); tree = HW(MB_CLICKS) | LW((MB_MASK << 8) | MB_STATE); ret = ev_multi(MU_FLAGS, (MOBLK *)&MMO1_FLAGS, (MOBLK *)&MMO2_FLAGS, maddr, tree, MME_PBUFF, &EV_MX); break; case EVNT_DCLICK: ret = ev_dclick(EV_DCRATE, EV_DCSETIT); break; /* Menu Manager */ case MENU_BAR: if (gl_mnppd == rlr || gl_mnppd == NULL) mn_bar(MM_ITREE, SHOW_IT, rlr->p_pid); else menu_tree[rlr->p_pid] = (SHOW_IT) ? MM_ITREE : 0x0L; break; case MENU_ICHECK: do_chg(MM_ITREE, ITEM_NUM, CHECKED, CHECK_IT, FALSE, FALSE); break; case MENU_IENABLE: do_chg(MM_ITREE, (ITEM_NUM & 0x7fff), DISABLED, !ENABLE_IT, ((ITEM_NUM & 0x8000) != 0x0), FALSE); break; case MENU_TNORMAL: if (gl_mntree == menu_tree[rlr->p_pid]) do_chg(MM_ITREE, TITLE_NUM, SELECTED, !NORMAL_IT, TRUE, TRUE); break; case MENU_TEXT: tree = MM_ITREE; strcpy((char *)LLGET(OB_SPEC(ITEM_NUM)), (char *)MM_PTEXT); break; case MENU_REGISTER: ret = mn_register(MM_PID, MM_PSTR); break; case MENU_UNREGISTER: #if CONF_WITH_PCGEM /* distinguish between menu_unregister() and menu_popup() */ if (IN_LEN == 1) mn_unregister( MM_MID ); else #endif unsupported = TRUE; break; case MENU_CLICK: /* distinguish between menu_click() and menu_attach() */ /* * although menu_click() is PC-GEM only, it's always * enabled because the desktop uses it. */ if (IN_LEN == 2) { if (MN_SETIT) gl_mnclick = MN_CLICK; ret = gl_mnclick; } else unsupported = TRUE; break; /* Object Manager */ case OBJC_ADD: ob_add(OB_TREE, OB_PARENT, OB_CHILD); break; case OBJC_DELETE: ob_delete(OB_TREE, OB_DELOB); break; case OBJC_DRAW: gsx_sclip((GRECT *)&OB_XCLIP); ob_draw(OB_TREE, OB_DRAWOB, OB_DEPTH); break; case OBJC_FIND: ret = ob_find(OB_TREE, OB_STARTOB, OB_DEPTH, OB_MX, OB_MY); break; case OBJC_OFFSET: ob_offset(OB_TREE, OB_OBJ, &OB_XOFF, &OB_YOFF); break; case OBJC_ORDER: ob_order(OB_TREE, OB_OBJ, OB_NEWPOS); break; case OBJC_EDIT: gsx_sclip(&gl_rfull); OB_ODX = OB_IDX; ret = ob_edit(OB_TREE, OB_OBJ, OB_CHAR, &OB_ODX, OB_KIND); break; case OBJC_CHANGE: gsx_sclip((GRECT *)&OB_XCLIP); ob_change(OB_TREE, OB_DRAWOB, OB_NEWSTATE, OB_REDRAW); break; /* Form Manager */ case FORM_DO: ret = fm_do(FM_FORM, FM_START); break; case FORM_DIAL: ret = fm_dial(FM_TYPE, (GRECT *)&FM_X); break; case FORM_ALERT: ret = fm_alert(FM_DEFBUT, FM_ASTRING); break; case FORM_ERROR: ret = fm_error(FM_ERRNUM); break; case FORM_CENTER: ob_center(FM_FORM, (GRECT *)&FM_XC); break; case FORM_KEYBD: gsx_sclip(&gl_rfull); FM_OCHAR = FM_ICHAR; FM_ONXTOB = FM_INXTOB; ret = fm_keybd(FM_FORM, FM_OBJ, &FM_OCHAR, &FM_ONXTOB); break; case FORM_BUTTON: gsx_sclip(&gl_rfull); ret = fm_button(FM_FORM, FM_OBJ, FM_CLKS, &FM_ONXTOB); break; /* Graphics Manager */ case GRAF_RUBBOX: gr_rubbox(GR_I1, GR_I2, GR_I3, GR_I4, &GR_O1, &GR_O2); break; case GRAF_DRAGBOX: gr_dragbox(GR_I1, GR_I2, GR_I3, GR_I4, (GRECT *)&GR_I5, &GR_O1, &GR_O2); break; case GRAF_MBOX: gr_movebox(GR_I1, GR_I2, GR_I3, GR_I4, GR_I5, GR_I6); break; case GRAF_GROWBOX: gr_growbox((GRECT *)&GR_I1, (GRECT *)&GR_I5); break; case GRAF_SHRINKBOX: gr_shrinkbox((GRECT *)&GR_I1, (GRECT *)&GR_I5); break; case GRAF_WATCHBOX: ret = gr_watchbox(GR_TREE, GR_OBJ, GR_INSTATE, GR_OUTSTATE); break; case GRAF_SLIDEBOX: ret = gr_slidebox(GR_TREE, GR_PARENT, GR_OBJ, GR_ISVERT); break; case GRAF_HANDLE: GR_WCHAR = gl_wchar; GR_HCHAR = gl_hchar; GR_WBOX = gl_wbox; GR_HBOX = gl_hbox; ret = gl_handle; break; case GRAF_MOUSE: if (GR_MNUMBER > 255) { if (GR_MNUMBER == M_OFF) gsx_moff(); if (GR_MNUMBER == M_ON) gsx_mon(); } else { if (GR_MNUMBER != 255) { switch(GR_MNUMBER) { case 1: mouse = MICE01; break; case 2: mouse = MICE02; break; case 3: mouse = MICE03; break; case 4: mouse = MICE04; break; case 5: mouse = MICE05; break; case 6: mouse = MICE06; break; case 7: mouse = MICE07; break; default: mouse = MICE00; break; } maddr = *(LONG *) &rs_bitblk[mouse]; } else maddr = GR_MADDR; gsx_mfset(maddr); } break; case GRAF_MKSTATE: gr_mkstate(&GR_MX, &GR_MY, &GR_MSTATE, &GR_KSTATE); break; /* Scrap Manager */ case SCRP_READ: ret = sc_read((BYTE*)SC_PATH); break; case SCRP_WRITE: ret = sc_write((const BYTE*)SC_PATH); break; #if CONF_WITH_PCGEM case SCRP_CLEAR: ret = sc_clear(); break; #endif /* File Selector Manager */ case FSEL_INPUT: ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, NULL); break; case FSEL_EXINPUT: ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, (BYTE *)FS_ILABEL); break; /* Window Manager */ case WIND_CREATE: ret = wm_create(WM_KIND, (GRECT *)&WM_WX); break; case WIND_OPEN: wm_open(WM_HANDLE, (GRECT *)&WM_WX); break; case WIND_CLOSE: wm_close(WM_HANDLE); break; case WIND_DELETE: wm_delete(WM_HANDLE); break; case WIND_GET: wm_get(WM_HANDLE, WM_WFIELD, &WM_OX); break; case WIND_SET: wm_set(WM_HANDLE, WM_WFIELD, &WM_IX); break; case WIND_FIND: ret = wm_find(WM_MX, WM_MY); break; case WIND_UPDATE: wm_update(WM_BEGUP); break; case WIND_CALC: wm_calc(WM_WCTYPE, WM_WCKIND, WM_WCIX, WM_WCIY, WM_WCIW, WM_WCIH, &WM_WCOX, &WM_WCOY, &WM_WCOW, &WM_WCOH); break; case WIND_NEW: wm_new(); break; /* Resource Manager */ case RSRC_LOAD: ret = rs_load(pglobal, RS_PFNAME); break; case RSRC_FREE: ret = rs_free(pglobal); break; case RSRC_GADDR: ret = rs_gaddr(pglobal, RS_TYPE, RS_INDEX, &ad_rso); break; case RSRC_SADDR: ret = rs_saddr(pglobal, RS_TYPE, RS_INDEX, RS_INADDR); break; case RSRC_OBFIX: rs_obfix(RS_TREE, RS_OBJ); break; /* Shell Manager */ case SHEL_READ: sh_read((BYTE*)SH_PCMD, (BYTE*)SH_PTAIL); break; case SHEL_WRITE: ret = sh_write(SH_DOEX, SH_ISGR, SH_ISCR, (const BYTE*)SH_PCMD, (const BYTE*)SH_PTAIL); break; case SHEL_GET: sh_get((void*)SH_PBUFFER, SH_LEN); break; case SHEL_PUT: sh_put((const void *)SH_PDATA, SH_LEN); break; case SHEL_FIND: ret = sh_find((BYTE*)SH_PATH); break; case SHEL_ENVRN: sh_envrn((BYTE**)SH_PATH, (const BYTE*)SH_SRCH); break; #if CONF_WITH_PCGEM case SHEL_RDEF: sh_rdef((BYTE*)SH_LPCMD, (BYTE*)SH_LPDIR); break; case SHEL_WDEF: sh_wdef((const BYTE*)SH_LPCMD, (const BYTE*)SH_LPDIR); break; #endif default: unsupported = TRUE; break; } if (unsupported) { kprintf("Bad AES function %d\n", opcode); if (opcode != 0) /* Ignore the 0 since some PRGs are this call */ fm_show(ALNOFUNC, &opcode, 1); ret = -1; } return(ret); }