static void do_buttondown(GR_EVENT_BUTTON *ep) { mwin * mwp; static int app_no; if (ep->wid == w1) { app_no = ep->y / fheight; if (app_no >= num_apps) { app_no = num_apps - 1; } if (!vfork()) { char * nargv[2]; nargv[0] = Apps[app_no].app_path; nargv[1] = 0; execve(nargv[0], nargv, environ); /* write(1, "\7", 1); */ exit(1); } } else if ((mwp = IsDecoration(ep->wid)) != NULL) { GrRaiseWindow(mwp->wid); GrRaiseWindow(mwp->fid); in_motion = mwp; move_xoff = ep->x; move_yoff = ep->y; } }
static void do_buttondown(GR_EVENT_BUTTON *ep) { mwin * mwp; static int app_no; char *userargs; int r,taskid,queid,n; char s[16]; char *argv[2]; if (ep->wid == w1) { app_no = ep->y / fheight; if (app_no >= num_apps) { app_no = num_apps - 1; } taskid=syscall_pgm_load( Apps[app_no].app_path, SYSCALL_PGM_TYPE_VGA|SYSCALL_PGM_TYPE_IO); if(taskid<0) { display_puts("load error="); int2dec(-taskid,s); display_puts(s); display_puts("\n"); return; } argv[0]=Apps[app_no].app_path; argv[1]=""; userargs=environment_copy_session(); n = environment_get_session_size(); environment_make_args(userargs, 2, argv); r = syscall_pgm_setargs(taskid, userargs, n); if(r<0) { display_puts("setargs error="); int2dec(-r,s); display_puts(s); display_puts("\n"); return; } mfree(userargs); queid = environment_getqueid(); r=syscall_pgm_start(taskid, queid); if(r<0) { display_puts("start error="); int2dec(-r,s); display_puts(s); display_puts("\n"); return; } } else if ((mwp = IsDecoration(ep->wid)) != NULL) { GrRaiseWindow(mwp->wid); GrRaiseWindow(mwp->fid); in_motion = mwp; move_xoff = ep->x; move_yoff = ep->y; } }
static void do_update(GR_EVENT_UPDATE *ep) { mwin * mwp; mwin * tmwp; GR_WINDOW_INFO winfo; if (IsDecoration(ep->wid)) return; if ((mwp = FindWindow(ep->wid)) == NULL) { /* We have a new window */ if (ep->utype != GR_UPDATE_MAP) return; if ((mwp = NewWindow(ep->wid)) == NULL) { GrError("malloc failed\n"); return; } GrGetWindowInfo(ep->wid, &winfo); mwp->x = ep->x - winfo.bordersize; mwp->y = ep->y - winfo.bordersize; mwp->width = ep->width + 2 * winfo.bordersize; GrMoveWindow(mwp->wid, mwp->x + winfo.bordersize, mwp->y + DEC_HEIGHT + 2 * winfo.bordersize); mwp->fid = GrNewWindow(GR_ROOT_WINDOW_ID, mwp->x + 1, mwp->y + 1, mwp->width - 2, DEC_HEIGHT - 2, 1, BLUE, BLACK); GrSelectEvents(mwp->fid, GR_EVENT_MASK_BUTTON_DOWN | GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION); GrMapWindow(mwp->fid); } else { switch (ep->utype) { case GR_UPDATE_UNMAP: GrUnmapWindow(mwp->fid); GrDestroyWindow(mwp->fid); if (mwins == mwp) { mwins = mwp->next; } else for(tmwp = mwins; tmwp; tmwp = tmwp->next) { if (tmwp->next == mwp) { tmwp->next = mwp->next; } } free(mwp); break; case GR_UPDATE_MOVE: GrGetWindowInfo(ep->wid, &winfo); if ((ep->x == (mwp->x + winfo.bordersize)) && (ep->y == (mwp->y + winfo.bordersize + DEC_HEIGHT))) { return; } mwp->x = ep->x - winfo.bordersize; mwp->y = ep->y - winfo.bordersize - DEC_HEIGHT; GrMoveWindow(mwp->fid, mwp->x + 1, mwp->y + 1); default: break; } } }
static void do_buttonup(GR_EVENT_BUTTON *ep) { #ifdef SHOW_WINDOW_MOTION in_motion = NULL; #else mwin * mwp; GR_WINDOW_INFO winfo; if ((mwp = IsDecoration(ep->wid)) != NULL) { if (mwp == in_motion) { mwp->x = ep->rootx - 1 - move_xoff; mwp->y = ep->rooty - 1 - move_yoff; GrMoveWindow(mwp->fid, mwp->x + 1, mwp->y + 1); GrGetWindowInfo(mwp->wid, &winfo); GrMoveWindow(mwp->wid, mwp->x + winfo.bordersize, mwp->y + 2 * winfo.bordersize + DEC_HEIGHT); in_motion = NULL; } } #endif }