From f79ac60ef10788b761ef42fd0051273cc9fe67ef Mon Sep 17 00:00:00 2001 From: das Date: Tue, 16 May 2006 06:55:05 +0000 Subject: * macosx/tkMacOSXWindowEvent.c (TkMacOSXGenerateFocusEvent): don't send focus events to windows of class help or to overrideredirect windows. [Bug 1472624] * macosx/tkMacOSXWm.c: set overrideredirect windows to not become activated by the window manager and to not receive OS activate events (should make them behave more like on other platforms); use modern window class API for overrideredirect and transient windows; set the default class of overrideredirect windows to 'simple' rather than 'plain' (i.e. no window frame); add missing Panther and Tiger window attributes to [::tk::unsupported::MacWindowStyle]. --- ChangeLog | 14 +++++++++ macosx/tkMacOSXWindowEvent.c | 11 ++++++- macosx/tkMacOSXWm.c | 69 +++++++++++++++++++++++++++++++++++--------- 3 files changed, 79 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 575b017..c3c112e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-05-16 Daniel Steffen + + * macosx/tkMacOSXWindowEvent.c (TkMacOSXGenerateFocusEvent): don't send + focus events to windows of class help or to overrideredirect windows. + [Bug 1472624] + + * macosx/tkMacOSXWm.c: set overrideredirect windows to not become + activated by the window manager and to not receive OS activate events + (should make them behave more like on other platforms); use modern + window class API for overrideredirect and transient windows; set the + default class of overrideredirect windows to 'simple' rather than + 'plain' (i.e. no window frame); add missing Panther and Tiger window + attributes to [::tk::unsupported::MacWindowStyle]. + 2006-05-12 Jeff Hobbs * generic/tkImgPhoto.c (Tk_PhotoPutBlock, Tk_PhotoPutZoomedBlock): diff --git a/macosx/tkMacOSXWindowEvent.c b/macosx/tkMacOSXWindowEvent.c index 3719703..7560416 100644 --- a/macosx/tkMacOSXWindowEvent.c +++ b/macosx/tkMacOSXWindowEvent.c @@ -54,7 +54,7 @@ * software in accordance with the terms specified in this * license. * - * RCS: @(#) $Id: tkMacOSXWindowEvent.c,v 1.13 2006/04/11 10:21:28 das Exp $ + * RCS: @(#) $Id: tkMacOSXWindowEvent.c,v 1.14 2006/05/16 06:55:05 das Exp $ */ #include "tkMacOSXInt.h" @@ -466,6 +466,15 @@ TkMacOSXGenerateFocusEvent( } /* + * Don't send focus events to windows of class help or to + * overrideredirect windows. + */ + if (((TkWindow *)tkwin)->wmInfoPtr->macClass == kHelpWindowClass || + Tk_Attributes(tkwin)->override_redirect) { + return false; + } + + /* * Generate FocusIn and FocusOut events. This event * is only sent to the toplevel window. */ diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c index 5f6a057..4236540 100644 --- a/macosx/tkMacOSXWm.c +++ b/macosx/tkMacOSXWm.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacOSXWm.c,v 1.33 2006/04/28 06:02:49 das Exp $ + * RCS: @(#) $Id: tkMacOSXWm.c,v 1.34 2006/05/16 06:55:06 das Exp $ */ #include "tkMacOSXInt.h" @@ -2250,12 +2250,22 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */ * FIX: We need an UpdateWrapper equivalent to make this 100% correct */ if (boolean) { - wmPtr->style = plainDBox; + if (wmPtr->macClass == kDocumentWindowClass || (wmPtr->master != None && + wmPtr->macClass == kFloatingWindowClass)) { + wmPtr->macClass = kSimpleWindowClass; + wmPtr->attributes = kWindowNoAttributes; + } + wmPtr->attributes |= kWindowNoActivatesAttribute; } else { - if (wmPtr->master != None) { - wmPtr->style = floatZoomGrowProc; // override && transient - } else { - wmPtr->style = documentProc; + wmPtr->attributes &= ~kWindowNoActivatesAttribute; + if (wmPtr->macClass == kSimpleWindowClass) { + if (wmPtr->master != None) { + wmPtr->macClass = kFloatingWindowClass; // override && transient + wmPtr->attributes = kWindowStandardFloatingAttributes; + } else { + wmPtr->macClass = kDocumentWindowClass; + wmPtr->attributes = kWindowStandardDocumentAttributes; + } } } return TCL_OK; @@ -2892,9 +2902,11 @@ WmTransientCmd(tkwin, winPtr, interp, objc, objv) wmPtr->masterWindowName = NULL; /* XXX UpdateWrapper */ if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { - wmPtr->style = plainDBox; + wmPtr->macClass = kSimpleWindowClass; + wmPtr->attributes = kWindowNoActivatesAttribute; } else { - wmPtr->style = documentProc; + wmPtr->macClass = kDocumentWindowClass; + wmPtr->attributes = kWindowStandardDocumentAttributes; } } else { if (TkGetWindowFromObj(interp, tkwin, objv[3], &master) != TCL_OK) { @@ -2935,9 +2947,11 @@ WmTransientCmd(tkwin, winPtr, interp, objc, objv) strcpy(wmPtr->masterWindowName, argv3); /* XXX UpdateWrapper */ if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) { - wmPtr->style = plainDBox; + wmPtr->macClass = kSimpleWindowClass; + wmPtr->attributes = kWindowNoActivatesAttribute; } else { - wmPtr->style = floatZoomGrowProc; + wmPtr->macClass = kFloatingWindowClass; + wmPtr->attributes = kWindowStandardFloatingAttributes; } } return TCL_OK; @@ -4923,6 +4937,16 @@ TkMacOSXWinStyle( char *strValue; int intValue; }; +#if !defined(MAC_OS_X_VERSION_10_3) || \ + (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3) + #define kSimpleWindowClass 18 + #define kWindowDoesNotCycleAttribute (1L << 15) +#endif +#if !defined(MAC_OS_X_VERSION_10_4) || \ + (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4) + #define kWindowNoTitleBarAttribute (1L << 9) + #define kWindowMetalNoContentSeparatorAttribute (1L << 11) +#endif static CONST struct StrIntMap styleMap[] = { { "documentProc", documentProc }, { "noGrowDocProc", documentProc }, @@ -4957,6 +4981,7 @@ TkMacOSXWinStyle( { "overlay", kOverlayWindowClass }, { "sheetAlert", kSheetAlertWindowClass }, { "altPlain", kAltPlainWindowClass }, + { "simple", kSimpleWindowClass }, { "drawer", kDrawerWindowClass }, { NULL, 0 } }; @@ -4968,16 +4993,20 @@ TkMacOSXWinStyle( }; static CONST struct StrIntMap attrMap[] = { { "closeBox", kWindowCloseBoxAttribute }, - { "fullZoom", kWindowHorizontalZoomAttribute | kWindowVerticalZoomAttribute }, { "horizontalZoom", kWindowHorizontalZoomAttribute }, { "verticalZoom", kWindowVerticalZoomAttribute }, + { "fullZoom", kWindowFullZoomAttribute }, { "collapseBox", kWindowCollapseBoxAttribute }, { "resizable", kWindowResizableAttribute }, { "sideTitlebar", kWindowSideTitlebarAttribute }, { "toolbarButton", kWindowToolbarButtonAttribute }, { "metal", kWindowMetalAttribute }, - { "noActivates", kWindowNoActivatesAttribute }, + { "noTitleBar", kWindowNoTitleBarAttribute }, + { "metalNoContentSeparator", kWindowMetalNoContentSeparatorAttribute }, + { "doesNotCycle", kWindowDoesNotCycleAttribute }, { "noUpdates", kWindowNoUpdatesAttribute }, + { "noActivates", kWindowNoActivatesAttribute }, + { "opaqueForEvents", kWindowOpaqueForEventsAttribute }, { "compositing", kWindowCompositingAttribute }, { "noShadow", kWindowNoShadowAttribute }, { "hideOnSuspend", kWindowHideOnSuspendAttribute }, @@ -4985,6 +5014,7 @@ TkMacOSXWinStyle( { "hideOnFullScreen", kWindowHideOnFullScreenAttribute }, { "inWindowMenu", kWindowInWindowMenuAttribute }, { "ignoreClicks", kWindowIgnoreClicksAttribute }, + { "noConstrain", kWindowNoConstrainAttribute }, { "standardDocument", kWindowStandardDocumentAttributes }, { "standardFloating", kWindowStandardFloatingAttributes }, { NULL, 0 } @@ -5108,9 +5138,11 @@ TkpMakeMenuWindow( * floating menu. */ { if (transient) { - ((TkWindow *) tkwin)->wmInfoPtr->style = plainDBox; + ((TkWindow *) tkwin)->wmInfoPtr->macClass = kSimpleWindowClass; + ((TkWindow *) tkwin)->wmInfoPtr->attributes = kWindowNoActivatesAttribute; } else { - ((TkWindow *) tkwin)->wmInfoPtr->style = floatProc; + ((TkWindow *) tkwin)->wmInfoPtr->macClass = kFloatingWindowClass; + ((TkWindow *) tkwin)->wmInfoPtr->attributes = kWindowStandardFloatingAttributes; ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_WIDTH_NOT_RESIZABLE; ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_HEIGHT_NOT_RESIZABLE; } @@ -5228,6 +5260,15 @@ TkMacOSXMakeRealWindowExist( MoveWindowStructure(newWindow, geometry.left, geometry.top); SetPort(GetWindowPort(newWindow)); + /* + * overrideredirect windows are not activated by the window server and + * don't receive activate events. + */ + if (winPtr->atts.override_redirect) { + SetWindowActivationScope(newWindow, kWindowActivationScopeNone); + ChangeWindowAttributes(newWindow, kWindowNoActivatesAttribute, 0); + } + if ((wmPtr->master != None) && winPtr->atts.override_redirect) { /* * If we are transient and overrideredirect, use the utility class -- cgit v0.12