void GLUTAPIENTRY glutMotionFunc(GLUTmotionCB motionFunc) { /* Hack. Some window managers (4Dwm by default) will mask motion events if the client is not selecting for button press and release events. So we select for press and release events too (being careful to use reference counting). */ if (__glutCurrentWindow->motion) { if (!motionFunc) { /* previous mouseFunc being disabled */ __glutCurrentWindow->buttonUses--; __glutChangeWindowEventMask( ButtonPressMask | ButtonReleaseMask, __glutCurrentWindow->buttonUses > 0); } } else { if (motionFunc) { /* Previously no mouseFunc, new one being installed. */ __glutCurrentWindow->buttonUses++; __glutChangeWindowEventMask( ButtonPressMask | ButtonReleaseMask, True); } } /* Real work of selecting for passive mouse motion. */ __glutChangeWindowEventMask( Button1MotionMask | Button2MotionMask | Button3MotionMask, motionFunc != NULL); __glutCurrentWindow->motion = motionFunc; }
void GLUTAPIENTRY glutPassiveMotionFunc(GLUTpassiveCB passiveMotionFunc) { __glutChangeWindowEventMask(PointerMotionMask, passiveMotionFunc != NULL); /* Passive motion also requires watching enters and leaves so that a fake passive motion event can be generated on an enter. */ __glutChangeWindowEventMask(EnterWindowMask | LeaveWindowMask, __glutCurrentWindow->entry != NULL || passiveMotionFunc != NULL); __glutCurrentWindow->passive = passiveMotionFunc; }
void GLUTAPIENTRY glutSpecialFunc(GLUTspecialCB specialFunc) { __glutChangeWindowEventMask(KeyPressMask, specialFunc != NULL || __glutCurrentWindow->keyboard != NULL); __glutCurrentWindow->special = specialFunc; }
/* CENTRY */ void GLUTAPIENTRY glutKeyboardFunc(GLUTkeyboardCB keyboardFunc) { __glutChangeWindowEventMask(KeyPressMask, keyboardFunc != NULL || __glutCurrentWindow->special != NULL); __glutCurrentWindow->keyboard = keyboardFunc; }
void GLUTAPIENTRY glutSpecialUpFunc(GLUTspecialCB specialUpFunc) { __glutChangeWindowEventMask(KeyReleaseMask, specialUpFunc != NULL || __glutCurrentWindow->keyboardUp != NULL); __glutCurrentWindow->specialUp = specialUpFunc; }
void GLUTAPIENTRY glutEntryFunc(GLUTentryCB entryFunc) { __glutChangeWindowEventMask(EnterWindowMask | LeaveWindowMask, entryFunc != NULL || __glutCurrentWindow->passive); __glutCurrentWindow->entry = entryFunc; if (!entryFunc) { __glutCurrentWindow->entryState = -1; } }
void GLUTAPIENTRY glutWindowStatusFunc(GLUTwindowStatusCB windowStatusFunc) { __glutChangeWindowEventMask(VisibilityChangeMask, windowStatusFunc != NULL); __glutCurrentWindow->windowStatus = windowStatusFunc; if (!windowStatusFunc) { /* Make state invalid. */ __glutCurrentWindow->visState = -1; } }
void GLUTAPIENTRY glutMouseFunc(GLUTmouseCB mouseFunc) { if (__glutCurrentWindow->mouse) { if (!mouseFunc) { /* Previous mouseFunc being disabled. */ __glutCurrentWindow->buttonUses--; __glutChangeWindowEventMask( ButtonPressMask | ButtonReleaseMask, __glutCurrentWindow->buttonUses > 0); } } else { if (mouseFunc) { /* Previously no mouseFunc, new one being installed. */ __glutCurrentWindow->buttonUses++; __glutChangeWindowEventMask( ButtonPressMask | ButtonReleaseMask, True); } } __glutCurrentWindow->mouse = mouseFunc; }
void GLUTAPIENTRY glutDetachMenu(int button) { if (__glutMappedMenu) { __glutMenuModificationError(); } if (__glutCurrentWindow->menu[button] > 0) { __glutCurrentWindow->buttonUses--; __glutChangeWindowEventMask(ButtonPressMask | ButtonReleaseMask, __glutCurrentWindow->buttonUses > 0); __glutCurrentWindow->menu[button] = 0; } }