Tk
view release on metacpan or search on metacpan
pTk/mTk/unix/tkUnixEmbed.c view on Meta::CPAN
}
/*
* Tk sets the window colormap to the screen default colormap in
* tkWindow.c:AllocWindow. This doesn't work well for embedded
* windows. So we override the colormap and visual settings to be
* the same as the parent window (which is in the container app).
*/
anyError = 0;
handler = Tk_CreateErrorHandler(winPtr->display, -1, -1, -1,
EmbedErrorProc, (ClientData) &anyError);
if (!XGetWindowAttributes(winPtr->display, parent, &parentAtts)) {
anyError = 1;
}
XSync(winPtr->display, False);
Tk_DeleteErrorHandler(handler);
if (anyError) {
if (interp != NULL) {
Tcl_AppendResult(interp, "couldn't create child of window \"",
Tcl_GetString(string), "\"", (char *) NULL);
}
return TCL_ERROR;
}
Tk_SetWindowVisual(tkwin, parentAtts.visual, parentAtts.depth,
parentAtts.colormap);
/*
* Create an event handler to clean up the Container structure when
* tkwin is eventually deleted.
*/
Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbeddedEventProc,
(ClientData) winPtr);
/*
* Save information about the container and the embedded window
* in a Container structure. If there is already an existing
* Container structure, it means that both container and embedded
* app. are in the same process.
*/
for (containerPtr = tsdPtr->firstContainerPtr; containerPtr != NULL;
containerPtr = containerPtr->nextPtr) {
if (containerPtr->parent == parent) {
winPtr->flags |= TK_BOTH_HALVES;
containerPtr->parentPtr->flags |= TK_BOTH_HALVES;
break;
}
}
if (containerPtr == NULL) {
containerPtr = (Container *) ckalloc(sizeof(Container));
containerPtr->parent = parent;
containerPtr->parentRoot = parentAtts.root;
containerPtr->parentPtr = NULL;
containerPtr->wrapper = None;
containerPtr->nextPtr = tsdPtr->firstContainerPtr;
tsdPtr->firstContainerPtr = containerPtr;
}
containerPtr->embeddedPtr = winPtr;
winPtr->flags |= TK_EMBEDDED;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TkpMakeWindow --
*
* Create an actual window system window object based on the
* current attributes of the specified TkWindow.
*
* Results:
* Returns the handle to the new window, or None on failure.
*
* Side effects:
* Creates a new X window.
*
*----------------------------------------------------------------------
*/
Window
TkpMakeWindow(winPtr, parent)
TkWindow *winPtr; /* Tk's information about the window that
* is to be instantiated. */
Window parent; /* Window system token for the parent in
* which the window is to be created. */
{
Container *containerPtr;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
if (winPtr->flags & TK_EMBEDDED) {
/*
* This window is embedded. Don't create the new window in the
* given parent; instead, create it as a child of the root window
* of the container's screen. The window will get reparented
* into a wrapper window later.
*/
for (containerPtr = tsdPtr->firstContainerPtr; ;
containerPtr = containerPtr->nextPtr) {
if (containerPtr == NULL) {
panic("TkMakeWindow couldn't find container for window");
}
if (containerPtr->embeddedPtr == winPtr) {
break;
}
}
parent = containerPtr->parentRoot;
}
#ifdef __PM__
return TkMakeWindow(winPtr, parent);
#else
return XCreateWindow(winPtr->display, parent, winPtr->changes.x,
winPtr->changes.y, (unsigned) winPtr->changes.width,
(unsigned) winPtr->changes.height,
(unsigned) winPtr->changes.border_width, winPtr->depth,
InputOutput, winPtr->visual, winPtr->dirtyAtts,
&winPtr->atts);
#endif
}
/*
*----------------------------------------------------------------------
*
* TkpMakeContainer --
*
* This procedure is called to indicate that a particular window
* will be a container for an embedded application. This changes
* certain aspects of the window's behavior, such as whether it
* will receive events anymore.
*
* Results:
* None.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
void
TkpMakeContainer(tkwin)
Tk_Window tkwin; /* Token for a window that is about to
* become a container. */
{
TkWindow *winPtr = (TkWindow *) tkwin;
Container *containerPtr;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
pTk/mTk/unix/tkUnixEmbed.c view on Meta::CPAN
return containerPtr->embeddedPtr;
}
}
panic("TkpGetOtherWindow couldn't find window");
return NULL;
}
/*
*----------------------------------------------------------------------
*
* TkpRedirectKeyEvent --
*
* This procedure is invoked when a key press or release event
* arrives for an application that does not believe it owns the
* input focus. This can happen because of embedding; for example,
* X can send an event to an embedded application when the real
* focus window is in the container application and is an ancestor
* of the container. This procedure's job is to forward the event
* back to the application where it really belongs.
*
* Results:
* None.
*
* Side effects:
* The event may get sent to a different application.
*
*----------------------------------------------------------------------
*/
void
TkpRedirectKeyEvent(winPtr, eventPtr)
TkWindow *winPtr; /* Window to which the event was originally
* reported. */
XEvent *eventPtr; /* X event to redirect (should be KeyPress
* or KeyRelease). */
{
Container *containerPtr;
Window saved;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
/*
* First, find the top-level window corresponding to winPtr.
*/
while (1) {
if (winPtr == NULL) {
/*
* This window is being deleted. This is too confusing a
* case to handle so discard the event.
*/
return;
}
if (winPtr->flags & TK_TOP_HIERARCHY) {
break;
}
winPtr = winPtr->parentPtr;
}
if (winPtr->flags & TK_EMBEDDED) {
/*
* This application is embedded. If we got a key event without
* officially having the focus, it means that the focus is
* really in the container, but the mouse was over the embedded
* application. Send the event back to the container.
*/
for (containerPtr = tsdPtr->firstContainerPtr;
containerPtr->embeddedPtr != winPtr;
containerPtr = containerPtr->nextPtr) {
/* Empty loop body. */
}
saved = eventPtr->xkey.window;
eventPtr->xkey.window = containerPtr->parent;
XSendEvent(eventPtr->xkey.display, eventPtr->xkey.window, False,
KeyPressMask|KeyReleaseMask, eventPtr);
eventPtr->xkey.window = saved;
}
}
/*
*----------------------------------------------------------------------
*
* TkpClaimFocus --
*
* This procedure is invoked when someone asks or the input focus
* to be put on a window in an embedded application, but the
* application doesn't currently have the focus. It requests the
* input focus from the container application.
*
* Results:
* None.
*
* Side effects:
* The input focus may change.
*
*----------------------------------------------------------------------
*/
void
TkpClaimFocus(topLevelPtr, force)
TkWindow *topLevelPtr; /* Top-level window containing desired
* focus window; should be embedded. */
int force; /* One means that the container should
* claim the focus if it doesn't
* currently have it. */
{
XEvent event;
Container *containerPtr;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
if (!(topLevelPtr->flags & TK_EMBEDDED)) {
return;
}
for (containerPtr = tsdPtr->firstContainerPtr;
containerPtr->embeddedPtr != topLevelPtr;
containerPtr = containerPtr->nextPtr) {
/* Empty loop body. */
}
event.xfocus.type = FocusIn;
event.xfocus.serial = LastKnownRequestProcessed(topLevelPtr->display);
event.xfocus.send_event = 1;
event.xfocus.display = topLevelPtr->display;
event.xfocus.window = containerPtr->parent;
event.xfocus.mode = EMBEDDED_APP_WANTS_FOCUS;
event.xfocus.detail = force;
XSendEvent(event.xfocus.display, event.xfocus.window, False, 0, &event);
}
#if 0
/*
*----------------------------------------------------------------------
*
* TkpTestembedCmd --
*
* This procedure implements the "testembed" command. It returns
* some or all of the information in the list pointed to by
* firstContainerPtr.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
int
TkpTestembedCmd(clientData, interp, argc, argv)
ClientData clientData; /* Main window for application. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
CONST char **argv; /* Argument strings. */
{
int all;
Container *containerPtr;
Tcl_DString dString;
char buffer[50];
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
if ((argc > 1) && (strcmp(argv[1], "all") == 0)) {
all = 1;
} else {
all = 0;
}
Tcl_DStringInit(&dString);
for (containerPtr = tsdPtr->firstContainerPtr; containerPtr != NULL;
containerPtr = containerPtr->nextPtr) {
Tcl_DStringStartSublist(&dString);
if (containerPtr->parent == None) {
Tcl_DStringAppendElement(&dString, "");
} else {
if (all) {
sprintf(buffer, "0x%x", (int) containerPtr->parent);
Tcl_DStringAppendElement(&dString, buffer);
} else {
Tcl_DStringAppendElement(&dString, "XXX");
}
}
if (containerPtr->parentPtr == NULL) {
Tcl_DStringAppendElement(&dString, "");
} else {
Tcl_DStringAppendElement(&dString,
( run in 0.489 second using v1.01-cache-2.11-cpan-71847e10f99 )