/* * Return about the screen. */ void GdGetScreenInfo(PSD psd, PMWSCREENINFO psi) { psd->GetScreenInfo(psd, psi); GdGetButtonInfo(&psi->buttons); GdGetModifierInfo(&psi->modifiers, NULL); GdGetCursorPos(&psi->xpos, &psi->ypos); }
/* * Handle all mouse events. These are mouse enter, mouse exit, mouse * motion, mouse position, button down, and button up. This also moves * the cursor to the new mouse position and changes it shape if needed. */ void GsHandleMouseStatus(GR_COORD newx, GR_COORD newy, int newbuttons) { int changebuttons; /* buttons that have changed */ MWKEYMOD modifiers; /* latest modifiers */ GdGetModifierInfo(NULL, &modifiers); /* Read kbd modifiers */ /* If we are currently in raw mode, then just deliver the raw event */ if (mousedev.flags & MOUSE_RAW) { GsDeliverRawMouseEvent(newx, newy, newbuttons, modifiers); return; } /* * First, if the mouse has moved, then position the cursor to the * new location, which will send mouse enter, mouse exit, focus in, * and focus out events if needed. Check here for mouse motion and * mouse position events. Flush the device queue to make sure the * new cursor location is quickly seen by the user. */ if ((newx != cursorx) || (newy != cursory)) { GsResetScreenSaver(); GrMoveCursor(newx, newy); GsDeliverMotionEvent(GR_EVENT_TYPE_MOUSE_MOTION, newbuttons, modifiers); GsDeliverMotionEvent(GR_EVENT_TYPE_MOUSE_POSITION, newbuttons, modifiers); } /* * Next, generate a button up event if any buttons have been released. */ changebuttons = (curbuttons & ~newbuttons); if (changebuttons) { GsResetScreenSaver(); GsDeliverButtonEvent(GR_EVENT_TYPE_BUTTON_UP, newbuttons, changebuttons, modifiers); } /* * Finally, generate a button down event if any buttons have been * pressed. */ changebuttons = (~curbuttons & newbuttons); if (changebuttons) { if ((newbuttons&(GR_BUTTON_L|GR_BUTTON_R)) == (GR_BUTTON_L|GR_BUTTON_R)) GsTerminate(); GsResetScreenSaver(); GsDeliverButtonEvent(GR_EVENT_TYPE_BUTTON_DOWN, newbuttons, changebuttons, modifiers); } curbuttons = newbuttons; }
/* * Handle all mouse events. These are mouse enter, mouse exit, mouse * motion, mouse position, button down, and button up. This also moves * the cursor to the new mouse position and changes it shape if needed. */ void MwHandleMouseStatus(MWCOORD newx, MWCOORD newy, int newbuttons) { int changebuttons; /* buttons that have changed */ MWKEYMOD modifiers; /* latest modifiers */ static int curbuttons; GdGetModifierInfo(NULL, &modifiers); /* Read kbd modifiers */ /* * First, if the mouse has moved, then position the cursor to the * new location, which will send mouse enter, mouse exit, focus in, * and focus out events if needed. Check here for mouse motion and * mouse position events. */ if (newx != cursorx || newy != cursory) { MwMoveCursor(newx, newy); MwDeliverMouseEvent(newbuttons, 0, modifiers); } /* * Next, generate a button up event if any buttons have been released. */ changebuttons = (curbuttons & ~newbuttons); if (changebuttons) MwDeliverMouseEvent(newbuttons, changebuttons, modifiers); /* * Finally, generate a button down event if any buttons have been * pressed. */ changebuttons = (~curbuttons & newbuttons); if (changebuttons) MwDeliverMouseEvent(newbuttons, changebuttons, modifiers); curbuttons = newbuttons; }
/* * Initialize the graphics and mouse devices at startup. * Returns nonzero with a message printed if the initialization failed. */ int GsInitialize(void) { GR_WINDOW *wp; /* root window */ static IMAGEBITS cursorbits[16] = { 0xe000, 0x9800, 0x8600, 0x4180, 0x4060, 0x2018, 0x2004, 0x107c, 0x1020, 0x0910, 0x0988, 0x0544, 0x0522, 0x0211, 0x000a, 0x0004 }; static IMAGEBITS cursormask[16] = { 0xe000, 0xf800, 0xfe00, 0x7f80, 0x7fe0, 0x3ff8, 0x3ffc, 0x1ffc, 0x1fe0, 0x0ff0, 0x0ff8, 0x077c, 0x073e, 0x021f, 0x000e, 0x0004 }; wp = (GR_WINDOW *) malloc(sizeof(GR_WINDOW)); if (wp == NULL) { fprintf(stderr, "Cannot allocate root window\n"); return -1; } #if !NONETWORK if (GsOpenSocket() < 0) { perror("Cannot bind to named socket"); free(wp); return -1; } #endif if ((keyb_fd = GdOpenKeyboard()) < 0) { perror("Cannot initialise keyboard"); /*GsCloseSocket();*/ free(wp); return -1; } if (GdOpenScreen() < 0) { perror("Cannot initialise screen"); /*GsCloseSocket();*/ GdCloseKeyboard(); free(wp); return -1; } if ((mouse_fd = GdOpenMouse()) == -1) { /* -2 == mou_nul.c */ perror("Cannot initialise mouse"); /*GsCloseSocket();*/ GdCloseScreen(); GdCloseKeyboard(); free(wp); return -1; } /* * Get screen dimensions for our own and the client's use, * and the information about the default font. */ GdGetScreenInfo(&scrdev, &sinfo); GdGetFontInfo(&scrdev, FONT_OEM_FIXED, &curfont); GdGetModifierInfo(&sinfo.modifiers); GdGetButtonInfo(&sinfo.buttons); /* * Initialize the root window. */ wp->id = GR_ROOT_WINDOW_ID; wp->parent = wp; wp->children = NULL; wp->siblings = NULL; wp->next = NULL; wp->x = 0; wp->y = 0; wp->width = sinfo.cols; wp->height = sinfo.rows; wp->bordersize = 0; wp->background = BLACK; wp->bordercolor = BLACK; wp->nopropmask = 0; wp->eventclients = NULL; wp->cursor = NULL; wp->mapped = GR_TRUE; wp->unmapcount = 0; wp->output = GR_TRUE; listwp = wp; rootwp = wp; focuswp = wp; mousewp = wp; focusfixed = GR_FALSE; /* * Initialize and position the default cursor. */ curcursor = NULL; cursorx = -1; cursory = -1; GsMoveCursor(sinfo.cols / 2, sinfo.rows / 2); GsSetCursor(GR_ROOT_WINDOW_ID, 16, 16, 0, 0, WHITE, BLACK, cursorbits, cursormask); #if FRAMEBUFFER | BOGL fb_InitVt(); #endif scrdev.FillRect(&scrdev, 0, 0, sinfo.cols-1, sinfo.rows-1, GdFindColor(BLACK)); /* * Finally tell the mouse driver some things. */ curbuttons = 0; /*GdSetAccelMouse(5, 3);*/ GdRestrictMouse(0, 0, sinfo.cols - 1, sinfo.rows - 1); GdMoveMouse(sinfo.cols / 2, sinfo.rows / 2); GsFlush(); /* * All done. */ connectcount = 0; return 0; }