⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tkwinpointer.c

📁 linux系统下的音频通信
💻 C
字号:
/*  * tkWinPointer.c -- * *	Windows specific mouse tracking code. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tkWinPointer.c 1.28 97/10/31 08:40:07 */#include "tkWinInt.h"/* * Check for enter/leave events every MOUSE_TIMER_INTERVAL milliseconds. */#define MOUSE_TIMER_INTERVAL 250/* * Declarations of static variables used in this file. */static int captured = 0;		/* 1 if mouse is currently captured. */static TkWindow *keyboardWinPtr = NULL; /* Current keyboard grab window. */static Tcl_TimerToken mouseTimer;	/* Handle to the latest mouse timer. */static int mouseTimerSet = 0;		/* 1 if the mouse timer is active. *//* * Forward declarations of procedures used in this file. */static void		MouseTimerProc _ANSI_ARGS_((ClientData clientData));/* *---------------------------------------------------------------------- * * TkWinGetModifierState -- * *	Return the modifier state as of the last message. * * Results: *	Returns the X modifier mask. * * Side effects: *	None. * *---------------------------------------------------------------------- */intTkWinGetModifierState(){    int state = 0;    if (GetKeyState(VK_SHIFT) & 0x8000) {	state |= ShiftMask;    }    if (GetKeyState(VK_CONTROL) & 0x8000) {	state |= ControlMask;    }    if (GetKeyState(VK_MENU) & 0x8000) {	state |= Mod2Mask;    }    if (GetKeyState(VK_CAPITAL) & 0x0001) {	state |= LockMask;    }    if (GetKeyState(VK_NUMLOCK) & 0x0001) {	state |= Mod1Mask;    }    if (GetKeyState(VK_SCROLL) & 0x0001) {	state |= Mod3Mask;    }    if (GetKeyState(VK_LBUTTON) & 0x8000) {	state |= Button1Mask;    }    if (GetKeyState(VK_MBUTTON) & 0x8000) {	state |= Button2Mask;    }    if (GetKeyState(VK_RBUTTON) & 0x8000) {	state |= Button3Mask;    }    return state;}/* *---------------------------------------------------------------------- * * Tk_PointerEvent -- * *	This procedure is called for each pointer-related event. *	It converts the position to root coords and updates the *	global pointer state machine.  It also ensures that the *	mouse timer is scheduled. * * Results: *	None. * * Side effects: *	May queue events and change the grab state. * *---------------------------------------------------------------------- */voidTk_PointerEvent(hwnd, x, y)    HWND hwnd;				/* Window for coords, or NULL for					 * the root window. */    int x, y;				/* Coords relative to hwnd, or screen					 * if hwnd is NULL. */{    POINT pos;    int state;    Tk_Window tkwin;    pos.x = x;    pos.y = y;    /*     * Convert client coords to root coords if we were given a window.     */    if (hwnd) {	ClientToScreen(hwnd, &pos);    }    /*     * If the mouse is captured, Windows will report all pointer     * events to the capture window.  So, we need to determine which     * window the mouse is really over and change the event.  Note     * that the computed hwnd may point to a window not owned by Tk,     * or a toplevel decorative frame, so tkwin can be NULL.     */    if (captured || hwnd == NULL) {	hwnd = WindowFromPoint(pos);    }    tkwin = Tk_HWNDToWindow(hwnd);    state = TkWinGetModifierState();    Tk_UpdatePointer(tkwin, pos.x, pos.y, state);    if ((captured || tkwin) && !mouseTimerSet) {	mouseTimerSet = 1;	mouseTimer = Tcl_CreateTimerHandler(MOUSE_TIMER_INTERVAL,		MouseTimerProc, NULL);    }}/* *---------------------------------------------------------------------- * * XGrabKeyboard -- * *	Simulates a keyboard grab by setting the focus. * * Results: *	Always returns GrabSuccess. * * Side effects: *	Sets the keyboard focus to the specified window. * *---------------------------------------------------------------------- */intXGrabKeyboard(display, grab_window, owner_events, pointer_mode,	keyboard_mode, time)    Display* display;    Window grab_window;    Bool owner_events;    int pointer_mode;    int keyboard_mode;    Time time;{    keyboardWinPtr = TkWinGetWinPtr(grab_window);    return GrabSuccess;}/* *---------------------------------------------------------------------- * * XUngrabKeyboard -- * *	Releases the simulated keyboard grab. * * Results: *	None. * * Side effects: *	Sets the keyboard focus back to the value before the grab. * *---------------------------------------------------------------------- */voidXUngrabKeyboard(display, time)    Display* display;    Time time;{    keyboardWinPtr = NULL;}/* *---------------------------------------------------------------------- * * MouseTimerProc -- * *	Check the current mouse position and look for enter/leave  *	events. * * Results: *	None. * * Side effects: *	May schedule a new timer and/or generate enter/leave events. * *---------------------------------------------------------------------- */voidMouseTimerProc(clientData)    ClientData clientData;{    POINT pos;    mouseTimerSet = 0;    /*     * Get the current mouse position and window.  Don't do anything     * if the mouse hasn't moved since the last time we looked.     */    GetCursorPos(&pos);    Tk_PointerEvent(NULL, pos.x, pos.y);}/* *---------------------------------------------------------------------- * * TkGetPointerCoords -- * *	Fetch the position of the mouse pointer. * * Results: *	*xPtr and *yPtr are filled in with the root coordinates *	of the mouse pointer for the display. * * Side effects: *	None. * *---------------------------------------------------------------------- */voidTkGetPointerCoords(tkwin, xPtr, yPtr)    Tk_Window tkwin;		/* Window that identifies screen on which				 * lookup is to be done. */    int *xPtr, *yPtr;		/* Store pointer coordinates here. */{    POINT point;    GetCursorPos(&point);    *xPtr = point.x;    *yPtr = point.y;}/* *---------------------------------------------------------------------- * * XQueryPointer -- * *	Check the current state of the mouse.  This is not a complete *	implementation of this function.  It only computes the root *	coordinates and the current mask. * * Results: *	Sets root_x_return, root_y_return, and mask_return.  Returns *	true on success. * * Side effects: *	None. * *---------------------------------------------------------------------- */BoolXQueryPointer(display, w, root_return, child_return, root_x_return,	root_y_return, win_x_return, win_y_return, mask_return)    Display* display;    Window w;    Window* root_return;    Window* child_return;    int* root_x_return;    int* root_y_return;    int* win_x_return;    int* win_y_return;    unsigned int* mask_return;{    display->request++;    TkGetPointerCoords(NULL, root_x_return, root_y_return);    *mask_return = TkWinGetModifierState();    return True;}/* *---------------------------------------------------------------------- * * XGetInputFocus -- * *	Retrieves the current keyboard focus window. * * Results: *	Returns the current focus window. * * Side effects: *	None. * *---------------------------------------------------------------------- */voidXGetInputFocus(display, focus_return, revert_to_return)    Display *display;    Window *focus_return;    int *revert_to_return;{    Tk_Window tkwin = Tk_HWNDToWindow(GetFocus());    *focus_return = tkwin ? Tk_WindowId(tkwin) : None;    *revert_to_return = RevertToParent;    display->request++;}/* *---------------------------------------------------------------------- * * XSetInputFocus -- * *	Set the current focus window. * * Results: *	None. * * Side effects: *	Changes the keyboard focus and causes the selected window to *	be activated. * *---------------------------------------------------------------------- */voidXSetInputFocus(display, focus, revert_to, time)    Display* display;    Window focus;    int revert_to;    Time time;{    display->request++;    if (focus != None) {	SetFocus(Tk_GetHWND(focus));    }}/* *---------------------------------------------------------------------- * * TkpChangeFocus -- * *	This procedure is invoked to move the system focus from *	one window to another. * * Results: *	The return value is the serial number of the command that *	changed the focus.  It may be needed by the caller to filter *	out focus change events that were queued before the command. *	If the procedure doesn't actually change the focus then *	it returns 0. * * Side effects: *	The official Windows focus window changes;  the application's focus *	window isn't changed by this procedure. * *---------------------------------------------------------------------- */intTkpChangeFocus(winPtr, force)    TkWindow *winPtr;		/* Window that is to receive the X focus. */    int force;			/* Non-zero means claim the focus even				 * if it didn't originally belong to				 * topLevelPtr's application. */{    TkDisplay *dispPtr = winPtr->dispPtr;    Window focusWindow;    int dummy, serial;    TkWindow *winPtr2;    if (!force) {	XGetInputFocus(dispPtr->display, &focusWindow, &dummy);	winPtr2 = (TkWindow *) Tk_IdToWindow(dispPtr->display, focusWindow);	if ((winPtr2 == NULL) || (winPtr2->mainPtr != winPtr->mainPtr)) {	    return 0;	}    }    if (winPtr->window == None) {	panic("ChangeXFocus got null X window");    }     /*     * Change the foreground window so the focus window is raised to the top of     * the system stacking order and gets the keyboard focus.     */    if (force) {	SetForegroundWindow(Tk_GetHWND(winPtr->window));    }    XSetInputFocus(dispPtr->display, winPtr->window, RevertToParent,	    CurrentTime);    /*     * Remember the current serial number for the X server and issue     * a dummy server request.  This marks the position at which we     * changed the focus, so we can distinguish FocusIn and FocusOut     * events on either side of the mark.     */    serial = NextRequest(winPtr->display);    XNoOp(winPtr->display);    return serial;}/* *---------------------------------------------------------------------- * * TkpSetCapture -- * *	This function captures the mouse so that all future events *	will be reported to this window, even if the mouse is outside *	the window.  If the specified window is NULL, then the mouse *	is released.  * * Results: *	None. * * Side effects: *	Sets the capture flag and captures the mouse. * *---------------------------------------------------------------------- */voidTkpSetCapture(winPtr)    TkWindow *winPtr;			/* Capture window, or NULL. */{    if (winPtr) {	SetCapture(Tk_GetHWND(Tk_WindowId(winPtr)));	captured = 1;    } else {	captured = 0;	ReleaseCapture();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -