summaryrefslogtreecommitdiffstats
path: root/macosx
diff options
context:
space:
mode:
authorculler <culler>2019-01-23 19:36:08 (GMT)
committerculler <culler>2019-01-23 19:36:08 (GMT)
commite96fc3a32df21660d658d31b1b837a760271ed46 (patch)
tree2536db5633d0cceada3225964e9d7ad6d0e7d19d /macosx
parentb73da99404e8cda51a2d689a82a96719a7f65aeb (diff)
parentd95baf225d20655610eed2ced4f322d47a2d9686 (diff)
downloadtk-e96fc3a32df21660d658d31b1b837a760271ed46.zip
tk-e96fc3a32df21660d658d31b1b837a760271ed46.tar.gz
tk-e96fc3a32df21660d658d31b1b837a760271ed46.tar.bz2
Fix unixEmbed test failures on macOS.
Diffstat (limited to 'macosx')
-rw-r--r--macosx/tkMacOSXEmbed.c131
-rw-r--r--macosx/tkMacOSXEvent.c38
2 files changed, 60 insertions, 109 deletions
diff --git a/macosx/tkMacOSXEmbed.c b/macosx/tkMacOSXEmbed.c
index f093c96..61aff6c 100644
--- a/macosx/tkMacOSXEmbed.c
+++ b/macosx/tkMacOSXEmbed.c
@@ -272,7 +272,14 @@ TkpUseWindow(
}
usePtr = (TkWindow *) Tk_IdToWindow(winPtr->display, (Window) parent);
- if (usePtr != NULL && !(usePtr->flags & TK_CONTAINER)) {
+ if (usePtr == NULL) {
+ if (interp != NULL) {
+ Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+ "couldn't create child of window \"%s\"", string));
+ Tcl_SetErrorCode(interp, "TK", "EMBED", "NO_TARGET", NULL);
+ }
+ return TCL_ERROR;
+ } else if (!(usePtr->flags & TK_CONTAINER)) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"window \"%s\" doesn't have -container option set",
usePtr->pathName));
@@ -281,15 +288,9 @@ TkpUseWindow(
}
/*
- * The code below can probably be simplified given we have already
- * discovered 'usePtr' above.
- */
-
- /*
- * Save information about the container and the embedded window in a
- * Container structure. Currently, there must already be an existing
- * Container structure, since we only allow the case where both container
- * and embedded app. are in the same process.
+ * Since we do not allow embedding into windows belonging to a different
+ * process, we know that a container will exist showing the parent window
+ * as the parent. This loop finds that container.
*/
for (containerPtr = firstContainerPtr; containerPtr != NULL;
@@ -312,16 +313,6 @@ TkpUseWindow(
}
macWin->winPtr = winPtr;
- winPtr->privatePtr = macWin;
-
- /*
- * The grafPtr will be NULL for a Tk in Tk embedded window. It is none of
- * our business what it is for a Tk not in Tk embedded window, but we will
- * initialize it to NULL, and let the registerWinProc set it. In any case,
- * you must always use TkMacOSXGetDrawablePort to get the portPtr. It will
- * correctly find the container's port.
- */
-
macWin->view = nil;
macWin->context = NULL;
macWin->size = CGSizeZero;
@@ -333,6 +324,7 @@ TkpUseWindow(
macWin->toplevel = macWin;
macWin->toplevel->referenceCount++;
+ winPtr->privatePtr = macWin;
winPtr->flags |= TK_EMBEDDED;
/*
@@ -341,64 +333,28 @@ TkpUseWindow(
*/
macWin->flags |= TK_EMBEDDED;
+ macWin->xOff = parent->winPtr->privatePtr->xOff +
+ parent->winPtr->changes.border_width +
+ winPtr->changes.x;
+ macWin->yOff = parent->winPtr->privatePtr->yOff +
+ parent->winPtr->changes.border_width +
+ winPtr->changes.y;
/*
- * Now check whether it is embedded in another Tk widget. If not (the
- * first case below) we see if there is an in-process embedding handler
- * registered, and if so, let that fill in the rest of the macWin.
+ * Finish filling up the container structure with the embedded
+ * window's information.
*/
- if (containerPtr == NULL) {
- /*
- * If someone has registered an in-process embedding handler, then
- * see if it can handle this window...
- */
-
- if (tkMacOSXEmbedHandler == NULL ||
- tkMacOSXEmbedHandler->registerWinProc((long) parent,
- (Tk_Window) winPtr) != TCL_OK) {
- Tcl_SetObjResult(interp, Tcl_ObjPrintf(
- "The window ID %s does not correspond to a valid Tk Window",
- string));
- Tcl_SetErrorCode(interp, "TK", "EMBED", "HANDLE", NULL);
- return TCL_ERROR;
- }
-
- containerPtr = ckalloc(sizeof(Container));
-
- containerPtr->parentPtr = NULL;
- containerPtr->embedded = (Window) macWin;
- containerPtr->embeddedPtr = macWin->winPtr;
- containerPtr->nextPtr = firstContainerPtr;
- firstContainerPtr = containerPtr;
- } else {
- /*
- * The window is embedded in another Tk window.
- */
+ containerPtr->embedded = (Window) macWin;
+ containerPtr->embeddedPtr = macWin->winPtr;
- macWin->xOff = parent->winPtr->privatePtr->xOff +
- parent->winPtr->changes.border_width +
- winPtr->changes.x;
- macWin->yOff = parent->winPtr->privatePtr->yOff +
- parent->winPtr->changes.border_width +
- winPtr->changes.y;
-
- /*
- * Finish filling up the container structure with the embedded
- * window's information.
- */
-
- containerPtr->embedded = (Window) macWin;
- containerPtr->embeddedPtr = macWin->winPtr;
-
- /*
- * Create an event handler to clean up the Container structure when
- * tkwin is eventually deleted.
- */
+ /*
+ * Create an event handler to clean up the Container structure when
+ * tkwin is eventually deleted.
+ */
- Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbeddedEventProc,
- winPtr);
- }
+ Tk_CreateEventHandler(tkwin, StructureNotifyMask, EmbeddedEventProc,
+ winPtr);
return TCL_OK;
}
@@ -614,6 +570,7 @@ TkpTestembedCmd(
Container *containerPtr;
Tcl_DString dString;
char buffer[50];
+ Tcl_Interp *embeddedInterp = NULL, *parentInterp = NULL;
if ((objc > 1) && (strcmp(Tcl_GetString(objv[1]), "all") == 0)) {
all = 1;
@@ -623,7 +580,17 @@ TkpTestembedCmd(
Tcl_DStringInit(&dString);
for (containerPtr = firstContainerPtr; containerPtr != NULL;
containerPtr = containerPtr->nextPtr) {
+ if (containerPtr->embeddedPtr != NULL) {
+ embeddedInterp = containerPtr->embeddedPtr->mainPtr->interp;
+ }
+ if (containerPtr->parentPtr != NULL) {
+ parentInterp = containerPtr->parentPtr->mainPtr->interp;
+ }
+ if (embeddedInterp != interp && parentInterp != interp) {
+ continue;
+ }
Tcl_DStringStartSublist(&dString);
+ /* Parent id */
if (containerPtr->parent == None) {
Tcl_DStringAppendElement(&dString, "");
} else if (all) {
@@ -632,21 +599,21 @@ TkpTestembedCmd(
} else {
Tcl_DStringAppendElement(&dString, "XXX");
}
- if (containerPtr->parentPtr == NULL) {
+ /* Parent pathName */
+ if (containerPtr->parentPtr == NULL ||
+ parentInterp != interp) {
Tcl_DStringAppendElement(&dString, "");
} else {
Tcl_DStringAppendElement(&dString,
containerPtr->parentPtr->pathName);
}
- if (containerPtr->embedded == None) {
- Tcl_DStringAppendElement(&dString, "");
- } else if (all) {
- sprintf(buffer, "0x%" TCL_Z_MODIFIER "x", (size_t) containerPtr->embedded);
- Tcl_DStringAppendElement(&dString, buffer);
- } else {
- Tcl_DStringAppendElement(&dString, "XXX");
- }
- if (containerPtr->embeddedPtr == NULL) {
+ /*
+ * On X11 embedded is a wrapper, which does not exist on macOS.
+ */
+ Tcl_DStringAppendElement(&dString, "");
+ /* Embedded window pathName */
+ if (containerPtr->embeddedPtr == NULL ||
+ embeddedInterp != interp) {
Tcl_DStringAppendElement(&dString, "");
} else {
Tcl_DStringAppendElement(&dString,
diff --git a/macosx/tkMacOSXEvent.c b/macosx/tkMacOSXEvent.c
index d866b02..b9c9b6a 100644
--- a/macosx/tkMacOSXEvent.c
+++ b/macosx/tkMacOSXEvent.c
@@ -114,21 +114,16 @@ enum {
*
* This routine is a stub called by XSync, which is called during the Tk
* update command. The language specification does not require that the
- * update command be synchronous but many of the tests assume that is the
- * case. It is not naturally the case on macOS since many idle tasks are
- * run inside of the drawRect method of a window's contentView, and that
- * method will not be called until after this function returns. To make
- * the tests work, we attempt to force this to be synchronous by waiting
- * until drawRect has been called for each window. The mechanism we use
- * for this is to have drawRect post an ApplicationDefined NSEvent on the
- * AppKit event queue when it finishes drawing, and wait for it here.
+ * update command be synchronous but many of the tests implicitly assume
+ * that it is. It is definitely asynchronous on macOS since many idle
+ * tasks are run inside of the drawRect method of a window's contentView,
+ * which will not be called until after this function returns.
*
* Results:
* None.
*
- * Side effects:
- * Calls the drawRect method of the contentView of each visible
- * window.
+ * Side effects: Processes all pending idle events then calls the display
+ * method of each visible window.
*
*----------------------------------------------------------------------
*/
@@ -136,23 +131,12 @@ enum {
MODULE_SCOPE void
TkMacOSXFlushWindows(void)
{
- NSArray *macWindows = [NSApp orderedWindows];
-
- if ([macWindows count] > 0) {
- while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)){}
+ if (Tk_GetNumMainWindows() == 0) {
+ return;
}
- if ([NSApp isDrawing]) {
- for (NSWindow *w in macWindows) {
- if (TkMacOSXGetXWindow(w)) {
- [w setViewsNeedDisplay:YES];
- }
- }
- } else {
- for (NSWindow *w in macWindows) {
- if (TkMacOSXGetXWindow(w)) {
- [w display];
- }
- }
+ while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)){}
+ for (NSWindow *w in [NSApp orderedWindows]) {
+ [w display];
}
}