summaryrefslogtreecommitdiff
path: root/tcl/win/tkWinWindow.c
diff options
context:
space:
mode:
Diffstat (limited to 'tcl/win/tkWinWindow.c')
-rw-r--r--tcl/win/tkWinWindow.c813
1 files changed, 0 insertions, 813 deletions
diff --git a/tcl/win/tkWinWindow.c b/tcl/win/tkWinWindow.c
deleted file mode 100644
index 580531f9aa0..00000000000
--- a/tcl/win/tkWinWindow.c
+++ /dev/null
@@ -1,813 +0,0 @@
-/*
- * tkWinWindow.c --
- *
- * Xlib emulation routines for Windows related to creating,
- * displaying and destroying windows.
- *
- * 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.
- *
- * RCS: @(#) $Id$
- */
-
-#include "tkWinInt.h"
-
-typedef struct ThreadSpecificData {
- int initialized; /* 0 means table below needs initializing. */
- Tcl_HashTable windowTable; /* The windowTable maps from HWND to
- * Tk_Window handles. */
-} ThreadSpecificData;
-static Tcl_ThreadDataKey dataKey;
-
-/*
- * Forward declarations for procedures defined in this file:
- */
-
-static void NotifyVisibility _ANSI_ARGS_((XEvent *eventPtr,
- TkWindow *winPtr));
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_AttachHWND --
- *
- * This function binds an HWND and a reflection procedure to
- * the specified Tk_Window.
- *
- * Results:
- * Returns an X Window that encapsulates the HWND.
- *
- * Side effects:
- * May allocate a new X Window. Also enters the HWND into the
- * global window table.
- *
- *----------------------------------------------------------------------
- */
-
-Window
-Tk_AttachHWND(tkwin, hwnd)
- Tk_Window tkwin;
- HWND hwnd;
-{
- int new;
- Tcl_HashEntry *entryPtr;
- TkWinDrawable *twdPtr = (TkWinDrawable *) Tk_WindowId(tkwin);
- ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
- Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
-
- if (!tsdPtr->initialized) {
- Tcl_InitHashTable(&tsdPtr->windowTable, TCL_ONE_WORD_KEYS);
- tsdPtr->initialized = 1;
- }
-
- /*
- * Allocate a new drawable if necessary. Otherwise, remove the
- * previous HWND from from the window table.
- */
-
- if (twdPtr == NULL) {
- twdPtr = (TkWinDrawable*) ckalloc(sizeof(TkWinDrawable));
- twdPtr->type = TWD_WINDOW;
- twdPtr->window.winPtr = (TkWindow *) tkwin;
- } else if (twdPtr->window.handle != NULL) {
- entryPtr = Tcl_FindHashEntry(&tsdPtr->windowTable,
- (char *)twdPtr->window.handle);
- Tcl_DeleteHashEntry(entryPtr);
- }
-
- /*
- * Insert the new HWND into the window table.
- */
-
- twdPtr->window.handle = hwnd;
- entryPtr = Tcl_CreateHashEntry(&tsdPtr->windowTable, (char *)hwnd, &new);
- Tcl_SetHashValue(entryPtr, (ClientData)tkwin);
-
- return (Window)twdPtr;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_HWNDToWindow --
- *
- * This function retrieves a Tk_Window from the window table
- * given an HWND.
- *
- * Results:
- * Returns the matching Tk_Window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-Tk_Window
-Tk_HWNDToWindow(hwnd)
- HWND hwnd;
-{
- Tcl_HashEntry *entryPtr;
- ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
- Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
-
- if (!tsdPtr->initialized) {
- Tcl_InitHashTable(&tsdPtr->windowTable, TCL_ONE_WORD_KEYS);
- tsdPtr->initialized = 1;
- }
- entryPtr = Tcl_FindHashEntry(&tsdPtr->windowTable, (char*)hwnd);
- if (entryPtr != NULL) {
- return (Tk_Window) Tcl_GetHashValue(entryPtr);
- }
- return NULL;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetHWND --
- *
- * This function extracts the HWND from an X Window.
- *
- * Results:
- * Returns the HWND associated with the Window.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-HWND
-Tk_GetHWND(window)
- Window window;
-{
- return ((TkWinDrawable *) window)->window.handle;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpPrintWindowId --
- *
- * This routine stores the string representation of the
- * platform dependent window handle for an X Window in the
- * given buffer.
- *
- * Results:
- * Returns the result in the specified buffer.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkpPrintWindowId(buf, window)
- char *buf; /* Pointer to string large enough to hold
- * the hex representation of a pointer. */
- Window window; /* Window to be printed into buffer. */
-{
- HWND hwnd = (window) ? Tk_GetHWND(window) : 0;
- /*
- * Use pointer representation, because Win64 is P64 (*not* LP64).
- * Windows doesn't print the 0x for %p, so we do it.
- */
- sprintf(buf, "0x%p", hwnd);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpScanWindowId --
- *
- * Given a string which represents the platform dependent window
- * handle, produce the X Window id for the window.
- *
- * Results:
- * The return value is normally TCL_OK; in this case *idPtr
- * will be set to the X Window id equivalent to string. If
- * string is improperly formed then TCL_ERROR is returned and
- * an error message will be left in the interp's result. If the
- * number does not correspond to a Tk Window, then *idPtr will
- * be set to None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpScanWindowId(interp, string, idPtr)
- Tcl_Interp *interp; /* Interpreter to use for error reporting. */
- CONST char *string; /* String containing a (possibly signed)
- * integer in a form acceptable to strtol. */
- Window *idPtr; /* Place to store converted result. */
-{
- Tk_Window tkwin;
- Window number;
-
- /*
- * We want sscanf for the 64-bit check, but if that doesn't work,
- * then Tcl_GetInt manages the error correctly.
- */
- if (
-#ifdef _WIN64
- (sscanf(string, "0x%p", &number) != 1) &&
-#endif
- Tcl_GetInt(interp, string, (int *)&number) != TCL_OK) {
- return TCL_ERROR;
- }
-
- tkwin = Tk_HWNDToWindow((HWND)number);
- if (tkwin) {
- *idPtr = Tk_WindowId(tkwin);
- } else {
- *idPtr = None;
- }
- return TCL_OK;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpMakeWindow --
- *
- * Creates a Windows window object based on the current attributes
- * of the specified TkWindow.
- *
- * Results:
- * Returns a pointer to a new TkWinDrawable cast to a Window.
- *
- * Side effects:
- * Creates a new window.
- *
- *----------------------------------------------------------------------
- */
-
-Window
-TkpMakeWindow(winPtr, parent)
- TkWindow *winPtr;
- Window parent;
-{
- HWND parentWin;
- int style;
- HWND hwnd;
-
- if (parent != None) {
- parentWin = Tk_GetHWND(parent);
- style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
- } else {
- parentWin = NULL;
- style = WS_POPUP | WS_CLIPCHILDREN;
- }
-
- /*
- * Create the window, then ensure that it is at the top of the
- * stacking order.
- */
-
- hwnd = CreateWindowEx(WS_EX_NOPARENTNOTIFY, TK_WIN_CHILD_CLASS_NAME, NULL,
- style, Tk_X(winPtr), Tk_Y(winPtr), Tk_Width(winPtr),
- Tk_Height(winPtr), parentWin, NULL, Tk_GetHINSTANCE(), NULL);
- SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0,
- SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
- return Tk_AttachHWND((Tk_Window)winPtr, hwnd);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XDestroyWindow --
- *
- * Destroys the given window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Sends the WM_DESTROY message to the window and then destroys
- * it the Win32 resources associated with the window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XDestroyWindow(display, w)
- Display* display;
- Window w;
-{
- Tcl_HashEntry *entryPtr;
- TkWinDrawable *twdPtr = (TkWinDrawable *)w;
- TkWindow *winPtr = TkWinGetWinPtr(w);
- HWND hwnd = Tk_GetHWND(w);
- ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
- Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
-
- display->request++;
-
- /*
- * Remove references to the window in the pointer module then
- * release the drawable.
- */
-
- TkPointerDeadWindow(winPtr);
-
- entryPtr = Tcl_FindHashEntry(&tsdPtr->windowTable, (char*)hwnd);
- if (entryPtr != NULL) {
- Tcl_DeleteHashEntry(entryPtr);
- }
-
- ckfree((char *)twdPtr);
-
- /*
- * Don't bother destroying the window if we are going to destroy
- * the parent later.
- */
-
- if (hwnd != NULL && !(winPtr->flags & TK_DONT_DESTROY_WINDOW)) {
- DestroyWindow(hwnd);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMapWindow --
- *
- * Cause the given window to become visible.
- *
- * Results:
- * None
- *
- * Side effects:
- * Causes the window state to change, and generates a MapNotify
- * event.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMapWindow(display, w)
- Display* display;
- Window w;
-{
- XEvent event;
- TkWindow *parentPtr;
- TkWindow *winPtr = TkWinGetWinPtr(w);
-
- display->request++;
-
- ShowWindow(Tk_GetHWND(w), SW_SHOWNORMAL);
- winPtr->flags |= TK_MAPPED;
-
- /*
- * Check to see if this window is visible now. If all of the parent
- * windows up to the first toplevel are mapped, then this window and
- * its mapped children have just become visible.
- */
-
- if (!(winPtr->flags & TK_TOP_HIERARCHY)) {
- for (parentPtr = winPtr->parentPtr; ;
- parentPtr = parentPtr->parentPtr) {
- if ((parentPtr == NULL) || !(parentPtr->flags & TK_MAPPED)) {
- return;
- }
- if (parentPtr->flags & TK_TOP_HIERARCHY) {
- break;
- }
- }
- } else {
- event.type = MapNotify;
- event.xmap.serial = display->request;
- event.xmap.send_event = False;
- event.xmap.display = display;
- event.xmap.event = winPtr->window;
- event.xmap.window = winPtr->window;
- event.xmap.override_redirect = winPtr->atts.override_redirect;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- }
-
- /*
- * Generate VisibilityNotify events for this window and its mapped
- * children.
- */
-
- event.type = VisibilityNotify;
- event.xvisibility.serial = display->request;
- event.xvisibility.send_event = False;
- event.xvisibility.display = display;
- event.xvisibility.window = winPtr->window;
- event.xvisibility.state = VisibilityUnobscured;
- NotifyVisibility(&event, winPtr);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * NotifyVisibility --
- *
- * This function recursively notifies the mapped children of the
- * specified window of a change in visibility. Note that we don't
- * properly report the visibility state, since Windows does not
- * provide that info. The eventPtr argument must point to an event
- * that has been completely initialized except for the window slot.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Generates lots of events.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-NotifyVisibility(eventPtr, winPtr)
- XEvent *eventPtr; /* Initialized VisibilityNotify event. */
- TkWindow *winPtr; /* Window to notify. */
-{
- if (winPtr->atts.event_mask & VisibilityChangeMask) {
- eventPtr->xvisibility.window = winPtr->window;
- Tk_QueueWindowEvent(eventPtr, TCL_QUEUE_TAIL);
- }
- for (winPtr = winPtr->childList; winPtr != NULL;
- winPtr = winPtr->nextPtr) {
- if (winPtr->flags & TK_MAPPED) {
- NotifyVisibility(eventPtr, winPtr);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XUnmapWindow --
- *
- * Cause the given window to become invisible.
- *
- * Results:
- * None
- *
- * Side effects:
- * Causes the window state to change, and generates an UnmapNotify
- * event.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XUnmapWindow(display, w)
- Display* display;
- Window w;
-{
- XEvent event;
- TkWindow *winPtr = TkWinGetWinPtr(w);
-
- display->request++;
-
- /*
- * Bug fix: Don't short circuit this routine based on TK_MAPPED because
- * it will be cleared before XUnmapWindow is called.
- */
-
- ShowWindow(Tk_GetHWND(w), SW_HIDE);
- winPtr->flags &= ~TK_MAPPED;
-
- if (winPtr->flags & TK_WIN_MANAGED) {
- event.type = UnmapNotify;
- event.xunmap.serial = display->request;
- event.xunmap.send_event = False;
- event.xunmap.display = display;
- event.xunmap.event = winPtr->window;
- event.xunmap.window = winPtr->window;
- event.xunmap.from_configure = False;
- Tk_HandleEvent(&event);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMoveResizeWindow --
- *
- * Move and resize a window relative to its parent.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Repositions and resizes the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMoveResizeWindow(display, w, x, y, width, height)
- Display* display;
- Window w;
- int x; /* Position relative to parent. */
- int y;
- unsigned int width;
- unsigned int height;
-{
- display->request++;
- MoveWindow(Tk_GetHWND(w), x, y, width, height, TRUE);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMoveWindow --
- *
- * Move a window relative to its parent.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Repositions the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMoveWindow(display, w, x, y)
- Display* display;
- Window w;
- int x;
- int y;
-{
- TkWindow *winPtr = TkWinGetWinPtr(w);
-
- display->request++;
-
- MoveWindow(Tk_GetHWND(w), x, y, winPtr->changes.width,
- winPtr->changes.height, TRUE);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XResizeWindow --
- *
- * Resize a window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Resizes the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XResizeWindow(display, w, width, height)
- Display* display;
- Window w;
- unsigned int width;
- unsigned int height;
-{
- TkWindow *winPtr = TkWinGetWinPtr(w);
-
- display->request++;
-
- MoveWindow(Tk_GetHWND(w), winPtr->changes.x, winPtr->changes.y, width,
- height, TRUE);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XRaiseWindow --
- *
- * Change the stacking order of a window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the stacking order of the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XRaiseWindow(display, w)
- Display* display;
- Window w;
-{
- HWND window = Tk_GetHWND(w);
-
- display->request++;
- SetWindowPos(window, HWND_TOPMOST, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOSIZE);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XConfigureWindow --
- *
- * Change the size, position, stacking, or border of the specified
- * window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the attributes of the specified window. Note that we
- * ignore the passed in values and use the values stored in the
- * TkWindow data structure.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XConfigureWindow(display, w, value_mask, values)
- Display* display;
- Window w;
- unsigned int value_mask;
- XWindowChanges* values;
-{
- TkWindow *winPtr = TkWinGetWinPtr(w);
- HWND hwnd = Tk_GetHWND(w);
-
- display->request++;
-
- /*
- * Change the shape and/or position of the window.
- */
-
- if (value_mask & (CWX|CWY|CWWidth|CWHeight)) {
- MoveWindow(hwnd, winPtr->changes.x, winPtr->changes.y,
- winPtr->changes.width, winPtr->changes.height, TRUE);
- }
-
- /*
- * Change the stacking order of the window.
- */
-
- if (value_mask & CWStackMode) {
- HWND sibling;
- if ((value_mask & CWSibling) && (values->sibling != None)) {
- sibling = Tk_GetHWND(values->sibling);
- } else {
- sibling = NULL;
- }
- TkWinSetWindowPos(hwnd, sibling, values->stack_mode);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XClearWindow --
- *
- * Clears the entire window to the current background color.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Erases the current contents of the window.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XClearWindow(display, w)
- Display* display;
- Window w;
-{
- RECT rc;
- HBRUSH brush;
- HPALETTE oldPalette, palette;
- TkWindow *winPtr;
- HWND hwnd = Tk_GetHWND(w);
- HDC dc = GetDC(hwnd);
-
- palette = TkWinGetPalette(display->screens[0].cmap);
- oldPalette = SelectPalette(dc, palette, FALSE);
-
- display->request++;
-
- winPtr = TkWinGetWinPtr(w);
- brush = CreateSolidBrush(winPtr->atts.background_pixel);
- GetWindowRect(hwnd, &rc);
- rc.right = rc.right - rc.left;
- rc.bottom = rc.bottom - rc.top;
- rc.left = rc.top = 0;
- FillRect(dc, &rc, brush);
-
- DeleteObject(brush);
- SelectPalette(dc, oldPalette, TRUE);
- ReleaseDC(hwnd, dc);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XChangeWindowAttributes --
- *
- * This function is called when the attributes on a window are
- * updated. Since Tk maintains all of the window state, the only
- * relevant value is the cursor.
- *
- * Results:
- * None.
- *
- * Side effects:
- * May cause the mouse position to be updated.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XChangeWindowAttributes(display, w, valueMask, attributes)
- Display* display;
- Window w;
- unsigned long valueMask;
- XSetWindowAttributes* attributes;
-{
- if (valueMask & CWCursor) {
- XDefineCursor(display, w, attributes->cursor);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWinSetWindowPos --
- *
- * Adjust the stacking order of a window relative to a second
- * window (or NULL).
- *
- * Results:
- * None.
- *
- * Side effects:
- * Moves the specified window in the stacking order.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkWinSetWindowPos(hwnd, siblingHwnd, pos)
- HWND hwnd; /* Window to restack. */
- HWND siblingHwnd; /* Sibling window. */
- int pos; /* One of Above or Below. */
-{
- HWND temp;
-
- /*
- * Since Windows does not support Above mode, we place the
- * specified window below the sibling and then swap them.
- */
-
- if (siblingHwnd) {
- if (pos == Above) {
- SetWindowPos(hwnd, siblingHwnd, 0, 0, 0, 0,
- SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
- temp = hwnd;
- hwnd = siblingHwnd;
- siblingHwnd = temp;
- }
- } else {
- siblingHwnd = (pos == Above) ? HWND_TOP : HWND_BOTTOM;
- }
-
- SetWindowPos(hwnd, siblingHwnd, 0, 0, 0, 0,
- SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkpWindowWasRecentlyDeleted --
- *
- * Determines whether we know if the window given as argument was
- * recently deleted. Called by the generic code error handler to
- * handle BadWindow events.
- *
- * Results:
- * Always 0. We do not keep this information on Windows.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-TkpWindowWasRecentlyDeleted(win, dispPtr)
- Window win;
- TkDisplay *dispPtr;
-{
- return 0;
-}