/* * 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 MwInitialize(void) { HWND wp; /* root window */ PSD psd; WNDCLASS wc; int fd; static MWCURSOR arrow = { /* default arrow cursor*/ 16, 16, 0, 0, RGB(255, 255, 255), RGB(0, 0, 0), { 0xe000, 0x9800, 0x8600, 0x4180, 0x4060, 0x2018, 0x2004, 0x107c, 0x1020, 0x0910, 0x0988, 0x0544, 0x0522, 0x0211, 0x000a, 0x0004 }, { 0xe000, 0xf800, 0xfe00, 0x7f80, 0x7fe0, 0x3ff8, 0x3ffc, 0x1ffc, 0x1fe0, 0x0ff0, 0x0ff8, 0x077c, 0x073e, 0x021f, 0x000e, 0x0004 } }; extern MWLISTHEAD mwClassHead; #if (UNIX | DOS_DJGPP) && !_MINIX for (fd = 0; fd < FD_SETSIZE; fd++) { userregfd[fd].read = NULL; userregfd[fd].write = NULL; userregfd[fd].except = NULL; userregfd[fd].next = -1; } userregfd_head = -1; #endif /* catch terminate signal to restore tty state*/ signal(SIGTERM, (void *)MwTerminate); startTicks = GetTickCount(); if ((keyb_fd = GdOpenKeyboard()) == -1) { EPRINTF("Cannot initialise keyboard\n"); return -1; } if ((psd = GdOpenScreen()) == NULL) { EPRINTF("Cannot initialise screen\n"); GdCloseKeyboard(); return -1; } if ((mouse_fd = GdOpenMouse()) == -1) { EPRINTF("Cannot initialise mouse\n"); GdCloseScreen(psd); GdCloseKeyboard(); return -1; } #if ANIMATEPALETTE setfadelevel(psd, 0); #endif /* * Initialize the root window. */ wc.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW; wc.lpfnWndProc = (WNDPROC)DefWindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = 0; wc.hIcon = 0; /*LoadIcon(GetHInstance(), MAKEINTRESOURCE( 1));*/ wc.hCursor = 0; /*LoadCursor(NULL, IDC_ARROW);*/ wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BACKGROUND)); wc.lpszMenuName = NULL; wc.lpszClassName = "DeskTop"; RegisterClass( &wc); wp = GdItemNew(struct hwnd); if (!wp) { EPRINTF("No memory for root window\n"); GdCloseMouse(); GdCloseScreen(psd); GdCloseKeyboard(); return -1; } /* remove the WS_CAPTION to have bare desktop window*/ /*wp->style = WS_CLIPCHILDREN | WS_CAPTION | WS_VISIBLE;*/ wp->style = WS_CLIPCHILDREN | WS_VISIBLE; wp->exstyle = 0; wp->pClass = (PWNDCLASS)mwClassHead.head; wp->parent = NULL; wp->children = NULL; wp->siblings = NULL; wp->next = NULL; SetRect(&wp->winrect, 0, 0, psd->xvirtres, psd->yvirtres); MwCalcClientRect(wp); wp->cursor = NULL; wp->unmapcount = 0; wp->id = 0; strcpy(wp->szTitle, "Microwindows"); wp->gotPaintMsg = PAINT_PAINTED; #if UPDATEREGIONS wp->update = GdAllocRegion(); #endif listwp = wp; rootwp = wp; focuswp = wp; mousewp = wp; /* schedule desktop window paint*/ InvalidateRect(rootwp, NULL, TRUE); #if VTSWITCH MwInitVt(); /* Check for VT change every 50 ms: */ GdAddTimer(50, CheckVtChange, NULL); #endif /* * Initialize and position the default cursor. */ curcursor = NULL; cursorx = -1; cursory = -1; GdShowCursor(psd); MwMoveCursor(psd->xvirtres / 2, psd->yvirtres / 2); MwSetCursor(rootwp, &arrow); /* * Finally tell the mouse driver some things. */ GdRestrictMouse(0, 0, psd->xvirtres - 1, psd->yvirtres - 1); GdMoveMouse(psd->xvirtres / 2, psd->yvirtres / 2); return 0; }