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

📄 tkmacwm.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 5 页
字号:
/*  * tkMacWm.c -- * *	This module takes care of the interactions between a Tk-based *	application and the window manager.  Among other things, it *	implements the "wm" command and passes geometry information *	to the window manager. * * Copyright (c) 1994-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: @(#) tkMacWm.c 1.72 97/10/29 13:27:30 */#include <Gestalt.h>#include <QDOffscreen.h>#include <Windows.h>#include <ToolUtils.h>#include <tclMac.h>#include "tkPort.h"#include "tkInt.h"#include "tkMacInt.h"#include <errno.h>#include "tkScrollbar.h"/* * We now require the Appearance headers.  They come with CodeWarrior Pro, * and are on the SDK CD.  However, we do not require the Appearance  * extension */ #include <Appearance.h>/* * A data structure of the following type holds information for * each window manager protocol (such as WM_DELETE_WINDOW) for * which a handler (i.e. a Tcl command) has been defined for a * particular top-level window. */typedef struct ProtocolHandler {    Atom protocol;		/* Identifies the protocol. */    struct ProtocolHandler *nextPtr;				/* Next in list of protocol handlers for				 * the same top-level window, or NULL for				 * end of list. */    Tcl_Interp *interp;		/* Interpreter in which to invoke command. */    char command[4];		/* Tcl command to invoke when a client				 * message for this protocol arrives. 				 * The actual size of the structure varies				 * to accommodate the needs of the actual				 * command. THIS MUST BE THE LAST FIELD OF				 * THE STRUCTURE. */} ProtocolHandler;#define HANDLER_SIZE(cmdLength) \((unsigned) (sizeof(ProtocolHandler) - 3 + cmdLength))/* * A data structure of the following type holds window-manager-related * information for each top-level window in an application. */typedef struct TkWmInfo {    TkWindow *winPtr;		/* Pointer to main Tk information for				 * this window. */    Window reparent;		/* If the window has been reparented, this				 * gives the ID of the ancestor of the window				 * that is a child of the root window (may				 * not be window's immediate parent).  If				 * the window isn't reparented, this has the				 * value None. */    Tk_Uid titleUid;		/* Title to display in window caption.  If				 * NULL, use name of widget. */    Tk_Uid iconName;		/* Name to display in icon. */    Window master;		/* Master window for TRANSIENT_FOR property,				 * or None. */    XWMHints hints;		/* Various pieces of information for				 * window manager. */    char *leaderName;		/* Path name of leader of window group				 * (corresponds to hints.window_group).				 * Malloc-ed.  Note:  this field doesn't				 * get updated if leader is destroyed. */    char *masterWindowName;	/* Path name of window specified as master				 * in "wm transient" command, or NULL.				 * Malloc-ed. Note:  this field doesn't				 * get updated if masterWindowName is				 * destroyed. */    Tk_Window icon;		/* Window to use as icon for this window,				 * or NULL. */    Tk_Window iconFor;		/* Window for which this window is icon, or				 * NULL if this isn't an icon for anyone. */    /*     * Information used to construct an XSizeHints structure for     * the window manager:     */    int sizeHintsFlags;		/* Flags word for XSizeHints structure.				 * If the PBaseSize flag is set then the				 * window is gridded;  otherwise it isn't				 * gridded. */    int minWidth, minHeight;	/* Minimum dimensions of window, in				 * grid units, not pixels. */    int maxWidth, maxHeight;	/* Maximum dimensions of window, in				 * grid units, not pixels. */    Tk_Window gridWin;		/* Identifies the window that controls				 * gridding for this top-level, or NULL if				 * the top-level isn't currently gridded. */    int widthInc, heightInc;	/* Increments for size changes (# pixels				 * per step). */    struct {	int x;	/* numerator */	int y;  /* denominator */    } minAspect, maxAspect;	/* Min/max aspect ratios for window. */    int reqGridWidth, reqGridHeight;				/* The dimensions of the window (in				 * grid units) requested through				 * the geometry manager. */    int gravity;		/* Desired window gravity. */    /*     * Information used to manage the size and location of a window.     */    int width, height;		/* Desired dimensions of window, specified				 * in grid units.  These values are				 * set by the "wm geometry" command and by				 * ConfigureNotify events (for when wm				 * resizes window).  -1 means user hasn't				 * requested dimensions. */    int x, y;			/* Desired X and Y coordinates for window.				 * These values are set by "wm geometry",				 * plus by ConfigureNotify events (when wm				 * moves window).  These numbers are				 * different than the numbers stored in				 * winPtr->changes because (a) they could be				 * measured from the right or bottom edge				 * of the screen (see WM_NEGATIVE_X and				 * WM_NEGATIVE_Y flags) and (b) if the window				 * has been reparented then they refer to the				 * parent rather than the window itself. */    int parentWidth, parentHeight;				/* Width and height of reparent, in pixels				 * *including border*.  If window hasn't been				 * reparented then these will be the outer				 * dimensions of the window, including				 * border. */    int xInParent, yInParent;	/* Offset of window within reparent,  measured				 * from upper-left outer corner of parent's				 * border to upper-left outer corner of child's				 * border.  If not reparented then these are				 * zero. */    int configWidth, configHeight;				/* Dimensions passed to last request that we				 * issued to change geometry of window.  Used				 * to eliminate redundant resize operations. */    /*     * Information about the virtual root window for this top-level,     * if there is one.     */    Window vRoot;		/* Virtual root window for this top-level,				 * or None if there is no virtual root				 * window (i.e. just use the screen's root). */    int vRootX, vRootY;		/* Position of the virtual root inside the				 * root window.  If the WM_VROOT_OFFSET_STALE				 * flag is set then this information may be				 * incorrect and needs to be refreshed from				 * the X server.  If vRoot is None then these				 * values are both 0. */    unsigned int vRootWidth, vRootHeight;				/* Dimensions of the virtual root window.				 * If vRoot is None, gives the dimensions				 * of the containing screen.  This information				 * is never stale, even though vRootX and				 * vRootY can be. */    /*     * List of children of the toplevel which have private colormaps.     */    TkWindow **cmapList;	/* Array of window with private colormaps. */    int cmapCount;		/* Number of windows in array. */    /*     * Miscellaneous information.     */    ProtocolHandler *protPtr;	/* First in list of protocol handlers for				 * this window (NULL means none). */    int cmdArgc;		/* Number of elements in cmdArgv below. */    char **cmdArgv;		/* Array of strings to store in the				 * WM_COMMAND property.  NULL means nothing				 * available. */    char *clientMachine;	/* String to store in WM_CLIENT_MACHINE				 * property, or NULL. */    int flags;			/* Miscellaneous flags, defined below. */    /*     * Macintosh information.     */    int style;			/* Native window style. */    TkWindow *scrollWinPtr;	/* Ptr to scrollbar handling grow widget. */} WmInfo;/* * Flag values for WmInfo structures: * * WM_NEVER_MAPPED -		non-zero means window has never been *				mapped;  need to update all info when *				window is first mapped. * WM_UPDATE_PENDING -		non-zero means a call to UpdateGeometryInfo *				has already been scheduled for this *				window;  no need to schedule another one. * WM_NEGATIVE_X -		non-zero means x-coordinate is measured in *				pixels from right edge of screen, rather *				than from left edge. * WM_NEGATIVE_Y -		non-zero means y-coordinate is measured in *				pixels up from bottom of screen, rather than *				down from top. * WM_UPDATE_SIZE_HINTS -	non-zero means that new size hints need to be *				propagated to window manager. * WM_SYNC_PENDING -		set to non-zero while waiting for the window *				manager to respond to some state change. * WM_VROOT_OFFSET_STALE -	non-zero means that (x,y) offset information *				about the virtual root window is stale and *				needs to be fetched fresh from the X server. * WM_ABOUT_TO_MAP -		non-zero means that the window is about to *				be mapped by TkWmMapWindow.  This is used *				by UpdateGeometryInfo to modify its behavior. * WM_MOVE_PENDING -		non-zero means the application has requested *				a new position for the window, but it hasn't *				been reflected through the window manager *				yet. * WM_COLORMAPS_EXPLICIT -	non-zero means the colormap windows were *				set explicitly via "wm colormapwindows". * WM_ADDED_TOPLEVEL_COLORMAP - non-zero means that when "wm colormapwindows" *				was called the top-level itself wasn't *				specified, so we added it implicitly at *				the end of the list. * WM_WIDTH_NOT_RESIZABLE -	non-zero means that we're not supposed to *				allow the user to change the width of the *				window (controlled by "wm resizable" *				command). * WM_HEIGHT_NOT_RESIZABLE -	non-zero means that we're not supposed to *				allow the user to change the height of the *				window (controlled by "wm resizable" *				command). */#define WM_NEVER_MAPPED			1#define WM_UPDATE_PENDING		2#define WM_NEGATIVE_X			4#define WM_NEGATIVE_Y			8#define WM_UPDATE_SIZE_HINTS		0x10#define WM_SYNC_PENDING			0x20#define WM_VROOT_OFFSET_STALE		0x40#define WM_ABOUT_TO_MAP			0x100#define WM_MOVE_PENDING			0x200#define WM_COLORMAPS_EXPLICIT		0x400#define WM_ADDED_TOPLEVEL_COLORMAP	0x800#define WM_WIDTH_NOT_RESIZABLE		0x1000#define WM_HEIGHT_NOT_RESIZABLE		0x2000/* * This is a list of all of the toplevels that have been mapped so far. It is * used by the menu code to inval windows that were damaged by menus, and will * eventually also be used to keep track of floating windows. */TkMacWindowList *tkMacWindowListPtr = NULL;/* * The variable below is used to enable or disable tracing in this * module.  If tracing is enabled, then information is printed on * standard output about interesting interactions with the window * manager. */static int wmTracing = 0;/* * The following structure is the official type record for geometry * management of top-level windows. */static void		TopLevelReqProc _ANSI_ARGS_((ClientData dummy,	Tk_Window tkwin));static Tk_GeomMgr wmMgrType = {    "wm",				/* name */    TopLevelReqProc,			/* requestProc */    (Tk_GeomLostSlaveProc *) NULL,	/* lostSlaveProc */};/* * Hash table for Mac Window -> TkWindow mapping. */static Tcl_HashTable windowTable;static int windowHashInit = false;void tkMacMoveWindow(WindowRef window, int x, int y);/* * Forward declarations for procedures defined in this file: */static void		InitialWindowBounds _ANSI_ARGS_((TkWindow *winPtr, 			    Rect *geometry));static int		ParseGeometry _ANSI_ARGS_((Tcl_Interp *interp,			    char *string, TkWindow *winPtr));static void		TopLevelEventProc _ANSI_ARGS_((ClientData clientData,			    XEvent *eventPtr));static void		TopLevelReqProc _ANSI_ARGS_((ClientData dummy,			    Tk_Window tkwin));static void		UpdateGeometryInfo _ANSI_ARGS_((			    ClientData clientData));static void		UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr));static void		UpdateVRootGeometry _ANSI_ARGS_((WmInfo *wmPtr));/* *-------------------------------------------------------------- * * TkWmNewWindow -- * *	This procedure is invoked whenever a new top-level *	window is created.  Its job is to initialize the WmInfo *	structure for the window. * * Results: *	None. * * Side effects: *	A WmInfo structure gets allocated and initialized. * *-------------------------------------------------------------- */voidTkWmNewWindow(    TkWindow *winPtr)		/* Newly-created top-level window. */{    register WmInfo *wmPtr;	    wmPtr = (WmInfo *) ckalloc(sizeof(WmInfo));    wmPtr->winPtr = winPtr;    wmPtr->reparent = None;    wmPtr->titleUid = NULL;    wmPtr->iconName = NULL;    wmPtr->master = None;    wmPtr->hints.flags = InputHint | StateHint;    wmPtr->hints.input = True;    wmPtr->hints.initial_state = NormalState;    wmPtr->hints.icon_pixmap = None;    wmPtr->hints.icon_window = None;    wmPtr->hints.icon_x = wmPtr->hints.icon_y = 0;    wmPtr->hints.icon_mask = None;    wmPtr->hints.window_group = None;    wmPtr->leaderName = NULL;    wmPtr->masterWindowName = NULL;    wmPtr->icon = NULL;    wmPtr->iconFor = NULL;    wmPtr->sizeHintsFlags = 0;    wmPtr->minWidth = wmPtr->minHeight = 1;    /*     * Default the maximum dimensions to the size of the display, minus     * a guess about how space is needed for window manager decorations.     */    wmPtr->maxWidth = DisplayWidth(winPtr->display, winPtr->screenNum) - 15;    wmPtr->maxHeight = DisplayHeight(winPtr->display, winPtr->screenNum) - 30;    wmPtr->gridWin = NULL;    wmPtr->widthInc = wmPtr->heightInc = 1;    wmPtr->minAspect.x = wmPtr->minAspect.y = 1;    wmPtr->maxAspect.x = wmPtr->maxAspect.y = 1;    wmPtr->reqGridWidth = wmPtr->reqGridHeight = -1;    wmPtr->gravity = NorthWestGravity;    wmPtr->width = -1;    wmPtr->height = -1;    wmPtr->x = winPtr->changes.x;    wmPtr->y = winPtr->changes.y;    wmPtr->parentWidth = winPtr->changes.width	+ 2*winPtr->changes.border_width;    wmPtr->parentHeight = winPtr->changes.height	+ 2*winPtr->changes.border_width;    wmPtr->xInParent = 0;    wmPtr->yInParent = 0;    wmPtr->cmapList = NULL;    wmPtr->cmapCount = 0;    wmPtr->configWidth = -1;    wmPtr->configHeight = -1;    wmPtr->vRoot = None;    wmPtr->protPtr = NULL;    wmPtr->cmdArgv = NULL;    wmPtr->clientMachine = NULL;    wmPtr->flags = WM_NEVER_MAPPED;    wmPtr->style = zoomDocProc;    wmPtr->scrollWinPtr = NULL;    winPtr->wmInfoPtr = wmPtr;    UpdateVRootGeometry(wmPtr);    /*     * Tk must monitor structure events for top-level windows, in order     * to detect size and position changes caused by window managers.     */    Tk_CreateEventHandler((Tk_Window) winPtr, StructureNotifyMask,	    TopLevelEventProc, (ClientData) winPtr);    /*     * Arrange for geometry requests to be reflected from the window     * to the window manager.     */    Tk_ManageGeometry((Tk_Window) winPtr, &wmMgrType, (ClientData) 0);}/* *-------------------------------------------------------------- *

⌨️ 快捷键说明

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