summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--generic/tkWindow.c123
-rw-r--r--library/menu.tcl158
-rwxr-xr-xxlib/xcolors.c132
4 files changed, 227 insertions, 192 deletions
diff --git a/ChangeLog b/ChangeLog
index d04cb05..2823b44 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-05-05 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * library/menu.tcl: [Bug 2768586]: Only do menu correction on Windows < Win7
+ * xlib/xcolors.c: Single "const" addition
+ * generic/tkWindow.c: If tk.dll loaded in cygwin, don't use the win32 file dialogs
+
2012-05-04 Jan Nijtmans <nijtmans@users.sf.net>
* library/menu.tcl: [Bug 2768586]: Menu posting problem on dual monitors
diff --git a/generic/tkWindow.c b/generic/tkWindow.c
index d3de72d..98b89db 100644
--- a/generic/tkWindow.c
+++ b/generic/tkWindow.c
@@ -101,11 +101,12 @@ static CONST XSetWindowAttributes defAtts= {
#define ISSAFE 1
#define PASSMAINWINDOW 2
+#define NOOBJPROC 4
+#define WINMACONLY 8
typedef struct {
CONST char *name; /* Name of command. */
- Tcl_CmdProc *cmdProc; /* Command's string-based procedure. */
- Tcl_ObjCmdProc *objProc; /* Command's object-based procedure. */
+ Tcl_ObjCmdProc *objProc; /* Command's object- (or string-) based procedure. */
int flags;
} TkCmd;
@@ -114,59 +115,59 @@ static CONST TkCmd commands[] = {
* Commands that are part of the intrinsics:
*/
- {"bell", NULL, Tk_BellObjCmd, PASSMAINWINDOW},
- {"bind", NULL, Tk_BindObjCmd, PASSMAINWINDOW|ISSAFE},
- {"bindtags", NULL, Tk_BindtagsObjCmd, PASSMAINWINDOW|ISSAFE},
- {"clipboard", NULL, Tk_ClipboardObjCmd, PASSMAINWINDOW},
- {"destroy", NULL, Tk_DestroyObjCmd, PASSMAINWINDOW|ISSAFE},
- {"event", NULL, Tk_EventObjCmd, PASSMAINWINDOW|ISSAFE},
- {"focus", NULL, Tk_FocusObjCmd, PASSMAINWINDOW|ISSAFE},
- {"font", NULL, Tk_FontObjCmd, PASSMAINWINDOW|ISSAFE},
- {"grab", NULL, Tk_GrabObjCmd, PASSMAINWINDOW},
- {"grid", NULL, Tk_GridObjCmd, PASSMAINWINDOW|ISSAFE},
- {"image", NULL, Tk_ImageObjCmd, PASSMAINWINDOW|ISSAFE},
- {"lower", NULL, Tk_LowerObjCmd, PASSMAINWINDOW|ISSAFE},
- {"option", NULL, Tk_OptionObjCmd, PASSMAINWINDOW|ISSAFE},
- {"pack", NULL, Tk_PackObjCmd, PASSMAINWINDOW|ISSAFE},
- {"place", NULL, Tk_PlaceObjCmd, ISSAFE},
- {"raise", NULL, Tk_RaiseObjCmd, PASSMAINWINDOW|ISSAFE},
- {"selection", NULL, Tk_SelectionObjCmd, PASSMAINWINDOW},
- {"tk", NULL, Tk_TkObjCmd, PASSMAINWINDOW|ISSAFE},
- {"tkwait", NULL, Tk_TkwaitObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"bell", Tk_BellObjCmd, PASSMAINWINDOW},
+ {"bind", Tk_BindObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"bindtags", Tk_BindtagsObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"clipboard", Tk_ClipboardObjCmd, PASSMAINWINDOW},
+ {"destroy", Tk_DestroyObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"event", Tk_EventObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"focus", Tk_FocusObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"font", Tk_FontObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"grab", Tk_GrabObjCmd, PASSMAINWINDOW},
+ {"grid", Tk_GridObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"image", Tk_ImageObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"lower", Tk_LowerObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"option", Tk_OptionObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"pack", Tk_PackObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"place", Tk_PlaceObjCmd, ISSAFE},
+ {"raise", Tk_RaiseObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"selection", Tk_SelectionObjCmd, PASSMAINWINDOW},
+ {"tk", Tk_TkObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"tkwait", Tk_TkwaitObjCmd, PASSMAINWINDOW|ISSAFE},
#if defined(__WIN32__) || defined(MAC_TCL) || defined(MAC_OSX_TK)
- {"tk_chooseColor", NULL, Tk_ChooseColorObjCmd, PASSMAINWINDOW},
- {"tk_chooseDirectory", NULL, Tk_ChooseDirectoryObjCmd, PASSMAINWINDOW},
- {"tk_getOpenFile", NULL, Tk_GetOpenFileObjCmd, PASSMAINWINDOW},
- {"tk_getSaveFile", NULL, Tk_GetSaveFileObjCmd, PASSMAINWINDOW},
+ {"tk_chooseColor", Tk_ChooseColorObjCmd, PASSMAINWINDOW},
+ {"tk_chooseDirectory", Tk_ChooseDirectoryObjCmd, WINMACONLY|PASSMAINWINDOW},
+ {"tk_getOpenFile", Tk_GetOpenFileObjCmd, WINMACONLY|PASSMAINWINDOW},
+ {"tk_getSaveFile", Tk_GetSaveFileObjCmd, WINMACONLY|PASSMAINWINDOW},
#endif
#if defined(__WIN32__) || defined(MAC_OSX_TK)
- {"tk_messageBox", NULL, Tk_MessageBoxObjCmd, PASSMAINWINDOW},
+ {"tk_messageBox", Tk_MessageBoxObjCmd, PASSMAINWINDOW},
#endif
- {"update", NULL, Tk_UpdateObjCmd, PASSMAINWINDOW|ISSAFE},
- {"winfo", NULL, Tk_WinfoObjCmd, PASSMAINWINDOW|ISSAFE},
- {"wm", NULL, Tk_WmObjCmd, PASSMAINWINDOW},
+ {"update", Tk_UpdateObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"winfo", Tk_WinfoObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"wm", Tk_WmObjCmd, PASSMAINWINDOW},
/*
* Widget class commands.
*/
- {"button", NULL, Tk_ButtonObjCmd, ISSAFE},
- {"canvas", NULL, Tk_CanvasObjCmd, PASSMAINWINDOW|ISSAFE},
- {"checkbutton", NULL, Tk_CheckbuttonObjCmd, ISSAFE},
- {"entry", NULL, Tk_EntryObjCmd, ISSAFE},
- {"frame", NULL, Tk_FrameObjCmd, ISSAFE},
- {"label", NULL, Tk_LabelObjCmd, ISSAFE},
- {"labelframe", NULL, Tk_LabelframeObjCmd, ISSAFE},
- {"listbox", NULL, Tk_ListboxObjCmd, ISSAFE},
- {"menubutton", NULL, Tk_MenubuttonObjCmd, ISSAFE},
- {"message", NULL, Tk_MessageObjCmd, ISSAFE},
- {"panedwindow", NULL, Tk_PanedWindowObjCmd, ISSAFE},
- {"radiobutton", NULL, Tk_RadiobuttonObjCmd, ISSAFE},
- {"scale", NULL, Tk_ScaleObjCmd, ISSAFE},
- {"scrollbar", Tk_ScrollbarCmd, NULL, PASSMAINWINDOW|ISSAFE},
- {"spinbox", NULL, Tk_SpinboxObjCmd, ISSAFE},
- {"text", Tk_TextCmd, NULL, PASSMAINWINDOW|ISSAFE},
- {"toplevel", NULL, Tk_ToplevelObjCmd, 0},
+ {"button", Tk_ButtonObjCmd, ISSAFE},
+ {"canvas", Tk_CanvasObjCmd, PASSMAINWINDOW|ISSAFE},
+ {"checkbutton", Tk_CheckbuttonObjCmd, ISSAFE},
+ {"entry", Tk_EntryObjCmd, ISSAFE},
+ {"frame", Tk_FrameObjCmd, ISSAFE},
+ {"label", Tk_LabelObjCmd, ISSAFE},
+ {"labelframe", Tk_LabelframeObjCmd, ISSAFE},
+ {"listbox", Tk_ListboxObjCmd, ISSAFE},
+ {"menubutton", Tk_MenubuttonObjCmd, ISSAFE},
+ {"message", Tk_MessageObjCmd, ISSAFE},
+ {"panedwindow", Tk_PanedWindowObjCmd, ISSAFE},
+ {"radiobutton", Tk_RadiobuttonObjCmd, ISSAFE},
+ {"scale", Tk_ScaleObjCmd, ISSAFE},
+ {"scrollbar", (Tcl_ObjCmdProc *) Tk_ScrollbarCmd, NOOBJPROC|PASSMAINWINDOW|ISSAFE},
+ {"spinbox", Tk_SpinboxObjCmd, ISSAFE},
+ {"text", (Tcl_ObjCmdProc *) Tk_TextCmd, NOOBJPROC|PASSMAINWINDOW|ISSAFE},
+ {"toplevel", Tk_ToplevelObjCmd, 0},
/*
* Misc.
@@ -174,9 +175,9 @@ static CONST TkCmd commands[] = {
#if defined(MAC_TCL) || defined(MAC_OSX_TK)
{"::tk::unsupported::MacWindowStyle",
- NULL, TkUnsupported1ObjCmd, PASSMAINWINDOW|ISSAFE},
+ TkUnsupported1ObjCmd, PASSMAINWINDOW|ISSAFE},
#endif
- {(char *) NULL, (int (*) _ANSI_ARGS_((ClientData, Tcl_Interp *, int, CONST char **))) NULL, NULL, 0}
+ {NULL, NULL, 0}
};
/*
@@ -851,6 +852,9 @@ TkCreateMainWindow(interp, screenName, baseName)
Tk_Window tkwin;
int dummy;
int isSafe;
+#ifdef __WIN32__
+ int isWin32 = 0;
+#endif
Tcl_HashEntry *hPtr;
register TkMainInfo *mainPtr;
register TkWindow *winPtr;
@@ -858,7 +862,15 @@ TkCreateMainWindow(interp, screenName, baseName)
ClientData clientData;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
-
+#ifdef __WIN32__
+ Tcl_Obj *stringObjPtr = Tcl_GetVar2Ex(interp, "::tcl_platform", "platform", 0);
+
+ if (stringObjPtr
+ && !strcmp(Tcl_GetString(stringObjPtr), "windows")) {
+ isWin32 = 1;
+ }
+#endif
+
/*
* Panic if someone updated the TkWindow structure without
* also updating the Tk_FakeWin structure (or vice versa).
@@ -938,17 +950,22 @@ TkCreateMainWindow(interp, screenName, baseName)
isSafe = Tcl_IsSafe(interp);
for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {
- if ((cmdPtr->cmdProc == NULL) && (cmdPtr->objProc == NULL)) {
+ if (cmdPtr->objProc == NULL) {
Tcl_Panic("TkCreateMainWindow: builtin command with NULL string and object procs");
}
+#ifdef __WIN32__
+ if (!isWin32 && (cmdPtr->flags & WINMACONLY)) {
+ continue;
+ }
+#endif
if (cmdPtr->flags & PASSMAINWINDOW) {
clientData = (ClientData) tkwin;
} else {
clientData = (ClientData) NULL;
}
- if (cmdPtr->cmdProc != NULL) {
- Tcl_CreateCommand(interp, cmdPtr->name, cmdPtr->cmdProc,
- clientData, (void (*) _ANSI_ARGS_((ClientData))) NULL);
+ if (cmdPtr->flags & NOOBJPROC) {
+ Tcl_CreateCommand(interp, cmdPtr->name,
+ (Tcl_CmdProc *) cmdPtr->objProc, clientData, NULL);
} else {
Tcl_CreateObjCommand(interp, cmdPtr->name, cmdPtr->objProc,
clientData, NULL);
diff --git a/library/menu.tcl b/library/menu.tcl
index ff62484..782a726 100644
--- a/library/menu.tcl
+++ b/library/menu.tcl
@@ -60,7 +60,7 @@
# This file is tricky because there are five different ways that menus
# can be used:
#
-# 1. As a pulldown from a menubutton. In this style, the variable
+# 1. As a pulldown from a menubutton. In this style, the variable
# tk::Priv(postedMb) identifies the posted menubutton.
# 2. As a torn-off menu copied from some other menu. In this style
# tk::Priv(postedMb) is empty, and menu's type is "tearoff".
@@ -280,81 +280,81 @@ proc ::tk::MbPost {w {x {}} {y {}}} {
update idletasks
if {[catch {
switch [$w cget -direction] {
- above {
- set x [winfo rootx $w]
- set y [expr {[winfo rooty $w] - [winfo reqheight $menu]}]
+ above {
+ set x [winfo rootx $w]
+ set y [expr {[winfo rooty $w] - [winfo reqheight $menu]}]
# if we go offscreen to the top, show as 'below'
if {$y < [winfo vrooty $w]} {
set y [expr {[winfo vrooty $w] + [winfo rooty $w] + [winfo reqheight $w]}]
}
PostOverPoint $menu $x $y
- }
- below {
- set x [winfo rootx $w]
- set y [expr {[winfo rooty $w] + [winfo height $w]}]
+ }
+ below {
+ set x [winfo rootx $w]
+ set y [expr {[winfo rooty $w] + [winfo height $w]}]
# if we go offscreen to the bottom, show as 'above'
set mh [winfo reqheight $menu]
if {($y + $mh) > ([winfo vrooty $w] + [winfo vrootheight $w])} {
set y [expr {[winfo vrooty $w] + [winfo vrootheight $w] + [winfo rooty $w] - $mh}]
}
PostOverPoint $menu $x $y
- }
- left {
- set x [expr {[winfo rootx $w] - [winfo reqwidth $menu]}]
- set y [expr {(2 * [winfo rooty $w] + [winfo height $w]) / 2}]
- set entry [MenuFindName $menu [$w cget -text]]
- if {[$w cget -indicatoron]} {
+ }
+ left {
+ set x [expr {[winfo rootx $w] - [winfo reqwidth $menu]}]
+ set y [expr {(2 * [winfo rooty $w] + [winfo height $w]) / 2}]
+ set entry [MenuFindName $menu [$w cget -text]]
+ if {[$w cget -indicatoron]} {
if {$entry == [$menu index last]} {
- incr y [expr {-([$menu yposition $entry] \
- + [winfo reqheight $menu])/2}]
+ incr y [expr {-([$menu yposition $entry] \
+ + [winfo reqheight $menu])/2}]
} else {
- incr y [expr {-([$menu yposition $entry] \
+ incr y [expr {-([$menu yposition $entry] \
+ [$menu yposition [expr {$entry+1}]])/2}]
}
- }
+ }
PostOverPoint $menu $x $y
if {$entry ne "" \
&& [$menu entrycget $entry -state] ne "disabled"} {
- $menu activate $entry
+ $menu activate $entry
GenerateMenuSelect $menu
- }
- }
- right {
- set x [expr {[winfo rootx $w] + [winfo width $w]}]
- set y [expr {(2 * [winfo rooty $w] + [winfo height $w]) / 2}]
- set entry [MenuFindName $menu [$w cget -text]]
- if {[$w cget -indicatoron]} {
+ }
+ }
+ right {
+ set x [expr {[winfo rootx $w] + [winfo width $w]}]
+ set y [expr {(2 * [winfo rooty $w] + [winfo height $w]) / 2}]
+ set entry [MenuFindName $menu [$w cget -text]]
+ if {[$w cget -indicatoron]} {
if {$entry == [$menu index last]} {
- incr y [expr {-([$menu yposition $entry] \
- + [winfo reqheight $menu])/2}]
+ incr y [expr {-([$menu yposition $entry] \
+ + [winfo reqheight $menu])/2}]
} else {
- incr y [expr {-([$menu yposition $entry] \
+ incr y [expr {-([$menu yposition $entry] \
+ [$menu yposition [expr {$entry+1}]])/2}]
}
- }
+ }
PostOverPoint $menu $x $y
if {$entry ne "" \
&& [$menu entrycget $entry -state] ne "disabled"} {
- $menu activate $entry
+ $menu activate $entry
GenerateMenuSelect $menu
- }
- }
- default {
- if {[$w cget -indicatoron]} {
+ }
+ }
+ default {
+ if {[$w cget -indicatoron]} {
if {$y eq ""} {
set x [expr {[winfo rootx $w] + [winfo width $w]/2}]
set y [expr {[winfo rooty $w] + [winfo height $w]/2}]
- }
+ }
PostOverPoint $menu $x $y [MenuFindName $menu [$w cget -text]]
} else {
PostOverPoint $menu [winfo rootx $w] [expr {[winfo rooty $w]+[winfo height $w]}]
- }
- }
+ }
+ }
}
} msg]} {
# Error posting menu (e.g. bogus -postcommand). Unpost it and
# reflect the error.
-
+
set savedInfo $errorInfo
MenuUnpost {}
error $msg $savedInfo
@@ -363,7 +363,7 @@ proc ::tk::MbPost {w {x {}} {y {}}} {
set Priv(tearoff) $tearoff
if {$tearoff != 0} {
- focus $menu
+ focus $menu
if {[winfo viewable $w]} {
SaveGrabInfo $w
grab -global $w
@@ -443,8 +443,8 @@ proc ::tk::MenuUnpost menu {
}
if {($Priv(tearoff) != 0) || $Priv(menuBar) ne ""} {
- # Release grab, if any, and restore the previous grab, if there
- # was one.
+ # Release grab, if any, and restore the previous grab, if there
+ # was one.
if {$menu ne ""} {
set grab [grab current $menu]
if {$grab ne ""} {
@@ -584,7 +584,7 @@ proc ::tk::MenuButtonDown menu {
set menu [winfo parent $menu]
}
- if {$Priv(menuBar) eq ""} {
+ if {$Priv(menuBar) eq {}} {
set Priv(menuBar) $menu
set Priv(cursor) [$menu cget -cursor]
$menu configure -cursor arrow
@@ -625,7 +625,8 @@ proc ::tk::MenuLeave {menu rootx rooty state} {
return
}
if {[$menu type active] eq "cascade" \
- && [winfo containing $rootx $rooty] eq [$menu entrycget active -menu]} {
+ && [winfo containing $rootx $rooty] eq \
+ [$menu entrycget active -menu]} {
return
}
$menu activate none
@@ -669,7 +670,7 @@ proc ::tk::MenuInvoke {w buttonRelease} {
set isCascade [string equal [$w type $active] "cascade"]
# Only de-activate the active item if it's a cascade; this prevents
- # the annoying "activation flicker" you otherwise get with
+ # the annoying "activation flicker" you otherwise get with
# checkbuttons/commands/etc. on menubars
if { $isCascade } {
@@ -779,7 +780,8 @@ proc ::tk::MenuNextMenu {menu direction} {
} else {
set parent [winfo parent $menu]
while {$parent ne "."} {
- if {[winfo class $parent] eq "Menu" && [$parent cget -type] eq "menubar"} {
+ if {[winfo class $parent] eq "Menu" \
+ && [$parent cget -type] eq "menubar"} {
tk_menuSetFocus $parent
MenuNextEntry $parent 1
return
@@ -803,16 +805,14 @@ proc ::tk::MenuNextMenu {menu direction} {
}
}
- # Can't traverse into or out of a cascaded menu. Go to the next
+ # Can't traverse into or out of a cascaded menu. Go to the next
# or previous menubutton, if that makes sense.
set m2 [winfo parent $menu]
- if {[winfo class $m2] eq "Menu"} {
- if {[$m2 cget -type] eq "menubar"} {
- tk_menuSetFocus $m2
- MenuNextEntry $m2 -1
- return
- }
+ if {[winfo class $m2] eq "Menu" && [$m2 cget -type] eq "menubar"} {
+ tk_menuSetFocus $m2
+ MenuNextEntry $m2 -1
+ return
}
set w $Priv(postedMb)
@@ -932,7 +932,8 @@ proc ::tk::MenuFind {w char} {
if {[winfo toplevel $w] ne [winfo toplevel $child]} {
continue
}
- if {[winfo class $child] eq "Menu" && [$child cget -type] eq "menubar"} {
+ if {[winfo class $child] eq "Menu" && \
+ [$child cget -type] eq "menubar"} {
if {$char eq ""} {
return $child
}
@@ -957,7 +958,7 @@ proc ::tk::MenuFind {w char} {
if {[winfo toplevel $w] ne [winfo toplevel $child]} {
continue
}
- switch [winfo class $child] {
+ switch -- [winfo class $child] {
Menubutton {
set char2 [string index [$child cget -text] \
[$child cget -underline]]
@@ -1112,15 +1113,14 @@ proc ::tk::MenuFirstEntry menu {
}
for {set i 0} {$i <= $last} {incr i} {
if {([catch {set state [$menu entrycget $i -state]}] == 0) \
- && $state ne "disabled" \
- && [$menu type $i] ne "tearoff"} {
+ && $state ne "disabled" && [$menu type $i] ne "tearoff"} {
$menu activate $i
GenerateMenuSelect $menu
# Only post the cascade if the current menu is a menubar;
# otherwise, if the first entry of the cascade is a cascade,
# we can get an annoying cascading effect resulting in a bunch of
# menus getting posted (bug 676)
- if {[$menu type $i] eq "cascade" && [$menu cget -type] eq "menubar"} {
+ if {[$menu type $i] eq "cascade" && [$menu cget -type] eq "menubar"} {
set cascade [$menu entrycget $i -menu]
if {$cascade ne ""} {
$menu postcascade $i
@@ -1177,7 +1177,7 @@ proc ::tk::MenuFindName {menu s} {
proc ::tk::PostOverPoint {menu x y {entry {}}} {
global tcl_platform
-
+
if {$entry ne ""} {
if {$entry == [$menu index last]} {
incr y [expr {-([$menu yposition $entry] \
@@ -1188,23 +1188,34 @@ proc ::tk::PostOverPoint {menu x y {entry {}}} {
}
incr x [expr {-[winfo reqwidth $menu]/2}]
}
+
if {$tcl_platform(platform) eq "windows"} {
+ # osVersion is not available in safe interps
+ set ver 5
+ if {[info exists tcl_platform(osVersion)]} {
+ scan $tcl_platform(osVersion) %d ver
+ }
+
# We need to fix some problems with menu posting on Windows,
# where, if the menu would overlap top or bottom of screen,
# Windows puts it in the wrong place for us. We must also
# subtract an extra amount for half the height of the current
# entry. To be safe we subtract an extra 10.
- set yoffset [expr {[winfo screenheight $menu] \
- - $y - [winfo reqheight $menu] - 10}]
- if {$yoffset < [winfo vrooty $menu]} {
- # The bottom of the menu is offscreen, so adjust upwards
- incr y [expr {$yoffset - [winfo vrooty $menu]}]
- }
- # If we're off the top of the screen (either because we were
- # originally or because we just adjusted too far upwards),
- # then make the menu popup on the top edge.
- if {$y < [winfo vrooty $menu]} {
- set y [winfo vrooty $menu]
+ # NOTE: this issue appears to have been resolved in the Window
+ # manager provided with Vista and Windows 7.
+ if {$ver < 6} {
+ set yoffset [expr {[winfo screenheight $menu] \
+ - $y - [winfo reqheight $menu] - 10}]
+ if {$yoffset < [winfo vrooty $menu]} {
+ # The bottom of the menu is offscreen, so adjust upwards
+ incr y [expr {$yoffset - [winfo vrooty $menu]}]
+ }
+ # If we're off the top of the screen (either because we were
+ # originally or because we just adjusted too far upwards),
+ # then make the menu popup on the top edge.
+ if {$y < [winfo vrooty $menu]} {
+ set y [winfo vrooty $menu]
+ }
}
}
$menu post $x $y
@@ -1238,11 +1249,11 @@ proc ::tk::RestoreOldGrab {} {
variable ::tk::Priv
if {$Priv(oldGrab) ne ""} {
- # Be careful restoring the old grab, since it's window may not
+ # Be careful restoring the old grab, since it's window may not
# be visible anymore.
catch {
- if {$Priv(grabStatus) eq "global"} {
+ if {$Priv(grabStatus) eq "global"} {
grab set -global $Priv(oldGrab)
} else {
grab set $Priv(oldGrab)
@@ -1263,7 +1274,8 @@ proc ::tk_menuSetFocus {menu} {
proc ::tk::GenerateMenuSelect {menu} {
variable ::tk::Priv
- if {$Priv(activeMenu) eq $menu && $Priv(activeItem) eq [$menu index active]} {
+ if {$Priv(activeMenu) eq $menu \
+ && $Priv(activeItem) eq [$menu index active]} {
return
}
diff --git a/xlib/xcolors.c b/xlib/xcolors.c
index 87d58f9..497f251 100755
--- a/xlib/xcolors.c
+++ b/xlib/xcolors.c
@@ -17,8 +17,8 @@
* Index array. For each of the characters 'a'-'y', this table gives the first color
* starting with that character in the xColors table.
*/
-static unsigned char az[] = {0, 4, 12, 19, 43, 44, 47, 57, 59, 61, 62, 63, 86, 101,
- 104, 109, 120, 121, 124, 137, 141, 142, 144, 147, 148, 150};
+static const unsigned char az[] = {0, 4, 12, 19, 43, 44, 47, 57, 59, 61,
+ 62, 63, 86, 101, 104, 109, 120, 121, 124, 137, 141, 142, 144, 147, 148, 150};
/*
* Define an array that defines the mapping from color names to RGB values.
@@ -41,17 +41,17 @@ typedef char elem[32];
static const elem xColors[] = {
/* Colors starting with 'a' */
- "liceBlue\0 \360\370\377\0",
+ "liceBlue\0 \360\370\377",
"ntiqueWhite\0 \213\203\170\315\300\260\356\337\314\377\357\333\372\353\327\4",
"quamarine\0 \105\213\164\146\315\252\166\356\306\177\377\324\177\377\324\4",
"zure\0 \203\213\213\301\315\315\340\356\356\360\377\377\360\377\377\4",
/* Colors starting with 'b' */
- "eige\0 \365\365\334\0",
+ "eige\0 \365\365\334",
"isque\0 \213\175\153\315\267\236\356\325\267\377\344\304\377\344\304\4",
- "lack\0 \000\000\000\0",
- "lanchedAlmond\0 \377\353\315\0",
+ "lack\0 \000\000\000",
+ "lanchedAlmond\0 \377\353\315",
"lue\0 \000\000\213\000\000\315\000\000\356\000\000\377\000\000\377\4",
- "lueViolet\0 \212\053\342\0",
+ "lueViolet\0 \212\053\342",
"rown\0 \213\043\043\315\063\063\356\073\073\377\100\100\245\052\052\4",
"urlywood\0 \213\163\125\315\252\175\356\305\221\377\323\233\336\270\207\4",
/* Colors starting with 'c' */
@@ -59,53 +59,53 @@ static const elem xColors[] = {
"hartreuse\0 \105\213\000\146\315\000\166\356\000\177\377\000\177\377\000\4",
"hocolate\0 \213\105\023\315\146\035\356\166\041\377\177\044\322\151\036\4",
"oral\0 \213\076\057\315\133\105\356\152\120\377\162\126\377\177\120\4",
- "ornflowerBlue\0 \144\225\355\0",
+ "ornflowerBlue\0 \144\225\355",
"ornsilk\0 \213\210\170\315\310\261\356\350\315\377\370\334\377\370\334\4",
"yan\0 \000\213\213\000\315\315\000\356\356\000\377\377\000\377\377\4",
/* Colors starting with 'd' */
- "arkBlue\0 \000\000\213\0",
- "arkCyan\0 \000\213\213\0",
+ "arkBlue\0 \000\000\213",
+ "arkCyan\0 \000\213\213",
"arkGoldenrod\0 \213\145\010\315\225\014\356\255\016\377\271\017\270\206\013\4",
- "arkGray\0 \251\251\251\0",
- "arkGreen\0 \000\144\000\0",
- "arkGrey\0 \251\251\251\0",
- "arkKhaki\0 \275\267\153\0",
- "arkMagenta\0 \213\000\213\0",
+ "arkGray\0 \251\251\251",
+ "arkGreen\0 \000\144\000",
+ "arkGrey\0 \251\251\251",
+ "arkKhaki\0 \275\267\153",
+ "arkMagenta\0 \213\000\213",
"arkOliveGreen\0 \156\213\075\242\315\132\274\356\150\312\377\160\125\153\057\4",
"arkOrange\0 \213\105\000\315\146\000\356\166\000\377\177\000\377\214\000\4",
"arkOrchid\0 \150\042\213\232\062\315\262\072\356\277\076\377\231\062\314\4",
- "arkRed\0 \213\000\000\0",
- "arkSalmon\0 \351\226\172\0",
+ "arkRed\0 \213\000\000",
+ "arkSalmon\0 \351\226\172",
"arkSeaGreen\0 \151\213\151\233\315\233\264\356\264\301\377\301\217\274\217\4",
- "arkSlateBlue\0 \110\075\213\0",
+ "arkSlateBlue\0 \110\075\213",
"arkSlateGray\0 \122\213\213\171\315\315\215\356\356\227\377\377\057\117\117\4",
- "arkSlateGrey\0 \057\117\117\0",
- "arkTurquoise\0 \000\316\321\0",
- "arkViolet\0 \224\000\323\0",
+ "arkSlateGrey\0 \057\117\117",
+ "arkTurquoise\0 \000\316\321",
+ "arkViolet\0 \224\000\323",
"eepPink\0 \213\012\120\315\020\166\356\022\211\377\024\223\377\024\223\4",
"eepSkyBlue\0 \000\150\213\000\232\315\000\262\356\000\277\377\000\277\377\4",
- "imGray\0 \151\151\151\0",
- "imGrey\0 \151\151\151\0",
+ "imGray\0 \151\151\151",
+ "imGrey\0 \151\151\151",
"odgerBlue\0 \020\116\213\030\164\315\034\206\356\036\220\377\036\220\377\4",
/* Colors starting with 'e' */
"\377" /* placeholder */,
/* Colors starting with 'f' */
"irebrick\0 \213\032\032\315\046\046\356\054\054\377\060\060\262\042\042\4",
- "loralWhite\0 \377\372\360\0",
- "orestGreen\0 \042\213\042\0",
+ "loralWhite\0 \377\372\360",
+ "orestGreen\0 \042\213\042",
/* Colors starting with 'g' */
- "ainsboro\0 \334\334\334\0",
- "hostWhite\0 \370\370\377\0",
+ "ainsboro\0 \334\334\334",
+ "hostWhite\0 \370\370\377",
"old\0 \213\165\000\315\255\000\356\311\000\377\327\000\377\327\000\4",
"oldenrod\0 \213\151\024\315\233\035\356\264\042\377\301\045\332\245\040\4",
"ray\0\024\024\024\022\022\022\017\017\017\015\015\015\012\012\012"
"\010\010\010\005\005\005\003\003\003\276\276\276\10",
- "ray0\0 \000\000\000\0",
+ "ray0\0 \000\000\000",
"reen\0 \000\213\000\000\315\000\000\356\000\000\377\000\000\377\000\4",
- "reenYellow\0 \255\377\057\0",
+ "reenYellow\0 \255\377\057",
"rey\0\024\024\024\022\022\022\017\017\017\015\015\015\012\012\012"
"\010\010\010\005\005\005\003\003\003\276\276\276\10",
- "rey0\0 \000\000\000\0",
+ "rey0\0 \000\000\000",
/* Colors starting with 'h' */
"oneydew\0 \203\213\203\301\315\301\340\356\340\360\377\360\360\377\360\4",
"otPink\0 \213\072\142\315\140\220\356\152\247\377\156\264\377\151\264\4",
@@ -117,66 +117,66 @@ static const elem xColors[] = {
/* Colors starting with 'k' */
"haki\0 \213\206\116\315\306\163\356\346\205\377\366\217\360\346\214\4",
/* Colors starting with 'l' */
- "avender\0 \346\346\372\0",
+ "avender\0 \346\346\372",
"avenderBlush\0 \213\203\206\315\301\305\356\340\345\377\360\365\377\360\365\4",
- "awnGreen\0 \174\374\000\0",
+ "awnGreen\0 \174\374\000",
"emonChiffon\0 \213\211\160\315\311\245\356\351\277\377\372\315\377\372\315\4",
"ightBlue\0 \150\203\213\232\300\315\262\337\356\277\357\377\255\330\346\4",
- "ightCoral\0 \360\200\200\0",
+ "ightCoral\0 \360\200\200",
"ightCyan\0 \172\213\213\264\315\315\321\356\356\340\377\377\340\377\377\4",
"ightGoldenrod\0 \213\201\114\315\276\160\356\334\202\377\354\213\356\335\202\4",
- "ightGoldenrodYellow\0 \372\372\322\0",
- "ightGray\0 \323\323\323\0",
- "ightGreen\0 \220\356\220\0",
- "ightGrey\0 \323\323\323\0",
+ "ightGoldenrodYellow\0 \372\372\322",
+ "ightGray\0 \323\323\323",
+ "ightGreen\0 \220\356\220",
+ "ightGrey\0 \323\323\323",
"ightPink\0 \213\137\145\315\214\225\356\242\255\377\256\271\377\266\301\4",
"ightSalmon\0 \213\127\102\315\201\142\356\225\162\377\240\172\377\240\172\4",
- "ightSeaGreen\0 \040\262\252\0",
+ "ightSeaGreen\0 \040\262\252",
"ightSkyBlue\0 \140\173\213\215\266\315\244\323\356\260\342\377\207\316\372\4",
- "ightSlateBlue\0 \204\160\377\0",
- "ightSlateGray\0 \167\210\231\0",
- "ightSlateGrey\0 \167\210\231\0",
+ "ightSlateBlue\0 \204\160\377",
+ "ightSlateGray\0 \167\210\231",
+ "ightSlateGrey\0 \167\210\231",
"ightSteelBlue\0 \156\173\213\242\265\315\274\322\356\312\341\377\260\304\336\4",
"ightYellow\0 \213\213\172\315\315\264\356\356\321\377\377\340\377\377\340\4",
- "imeGreen\0 \062\315\062\0",
- "inen\0 \372\360\346\0",
+ "imeGreen\0 \062\315\062",
+ "inen\0 \372\360\346",
/* Colors starting with 'm' */
"agenta\0 \213\000\213\315\000\315\356\000\356\377\000\377\377\000\377\4",
"aroon\0 \213\034\142\315\051\220\356\060\247\377\064\263\260\060\140\4",
- "ediumAquamarine\0 \146\315\252\0",
- "ediumBlue\0 \000\000\315\0",
+ "ediumAquamarine\0 \146\315\252",
+ "ediumBlue\0 \000\000\315",
"ediumOrchid\0 \172\067\213\264\122\315\321\137\356\340\146\377\272\125\323\4",
"ediumPurple\0 \135\107\213\211\150\315\237\171\356\253\202\377\223\160\333\4",
- "ediumSeaGreen\0 \074\263\161\0",
- "ediumSlateBlue\0 \173\150\356\0",
- "ediumSpringGreen\0 \000\372\232\0",
- "ediumTurquoise\0 \110\321\314\0",
- "ediumVioletRed\0 \307\025\205\0",
- "idnightBlue\0 \031\031\160\0",
- "intCream\0 \365\377\372\0",
+ "ediumSeaGreen\0 \074\263\161",
+ "ediumSlateBlue\0 \173\150\356",
+ "ediumSpringGreen\0 \000\372\232",
+ "ediumTurquoise\0 \110\321\314",
+ "ediumVioletRed\0 \307\025\205",
+ "idnightBlue\0 \031\031\160",
+ "intCream\0 \365\377\372",
"istyRose\0 \213\175\173\315\267\265\356\325\322\377\344\341\377\344\341\4",
- "occasin\0 \377\344\265\0",
+ "occasin\0 \377\344\265",
/* Colors starting with 'n' */
"avajoWhite\0 \213\171\136\315\263\213\356\317\241\377\336\255\377\336\255\4",
- "avy\0 \000\000\200\0",
- "avyBlue\0 \000\000\200\0",
+ "avy\0 \000\000\200",
+ "avyBlue\0 \000\000\200",
/* Colors starting with 'o' */
- "ldLace\0 \375\365\346\0",
+ "ldLace\0 \375\365\346",
"liveDrab\0 \151\213\042\232\315\062\263\356\072\300\377\076\153\216\043\4",
"range\0 \213\132\000\315\205\000\356\232\000\377\245\000\377\245\000\4",
"rangeRed\0 \213\045\000\315\067\000\356\100\000\377\105\000\377\105\000\4",
"rchid\0 \213\107\211\315\151\311\356\172\351\377\203\372\332\160\326\4",
/* Colors starting with 'p' */
- "aleGoldenrod\0 \356\350\252\0",
+ "aleGoldenrod\0 \356\350\252",
"aleGreen\0 \124\213\124\174\315\174\220\356\220\232\377\232\230\373\230\4",
"aleTurquoise\0 \146\213\213\226\315\315\256\356\356\273\377\377\257\356\356\4",
"aleVioletRed\0 \213\107\135\315\150\211\356\171\237\377\202\253\333\160\223\4",
- "apayaWhip\0 \377\357\325\0",
+ "apayaWhip\0 \377\357\325",
"eachPuff\0 \213\167\145\315\257\225\356\313\255\377\332\271\377\332\271\4",
- "eru\0 \315\205\077\0",
+ "eru\0 \315\205\077",
"ink\0 \213\143\154\315\221\236\356\251\270\377\265\305\377\300\313\4",
"lum\0 \213\146\213\315\226\315\356\256\356\377\273\377\335\240\335\4",
- "owderBlue\0 \260\340\346\0",
+ "owderBlue\0 \260\340\346",
"urple\0 \125\032\213\175\046\315\221\054\356\233\060\377\240\040\360\4",
/* Colors starting with 'q' */
"\377" /* placeholder */,
@@ -185,16 +185,16 @@ static const elem xColors[] = {
"osyBrown\0 \213\151\151\315\233\233\356\264\264\377\301\301\274\217\217\4",
"oyalBlue\0 \047\100\213\072\137\315\103\156\356\110\166\377\101\151\341\4",
/* Colors starting with 's' */
- "addleBrown\0 \213\105\023\0",
+ "addleBrown\0 \213\105\023",
"almon\0 \213\114\071\315\160\124\356\202\142\377\214\151\372\200\162\4",
- "andyBrown\0 \364\244\140\0",
+ "andyBrown\0 \364\244\140",
"eaGreen\0 \056\213\127\103\315\200\116\356\224\124\377\237\056\213\127\4",
"eashell\0 \213\206\202\315\305\277\356\345\336\377\365\356\377\365\356\4",
"ienna\0 \213\107\046\315\150\071\356\171\102\377\202\107\240\122\055\4",
"kyBlue\0 \112\160\213\154\246\315\176\300\356\207\316\377\207\316\353\4",
"lateBlue\0 \107\074\213\151\131\315\172\147\356\203\157\377\152\132\315\4",
"lateGray\0 \154\173\213\237\266\315\271\323\356\306\342\377\160\200\220\4",
- "lateGrey\0 \160\200\220\0",
+ "lateGrey\0 \160\200\220",
"now\0 \213\211\211\315\311\311\356\351\351\377\372\372\377\372\372\4",
"pringGreen\0 \000\213\105\000\315\146\000\356\166\000\377\177\000\377\177\4",
"teelBlue\0 \066\144\213\117\224\315\134\254\356\143\270\377\106\202\264\4",
@@ -206,12 +206,12 @@ static const elem xColors[] = {
/* Colors starting with 'u' */
"\377" /* placeholder */,
/* Colors starting with 'v' */
- "iolet\0 \356\202\356\0",
+ "iolet\0 \356\202\356",
"ioletRed\0 \213\042\122\315\062\170\356\072\214\377\076\226\320\040\220\4",
/* Colors starting with 'w' */
"heat\0 \213\176\146\315\272\226\356\330\256\377\347\272\365\336\263\4",
- "hite\0 \377\377\377\0",
- "hiteSmoke\0 \365\365\365\0",
+ "hite\0 \377\377\377",
+ "hiteSmoke\0 \365\365\365",
/* Colors starting with 'x' */
"\377" /* placeholder */,
/* Colors starting with 'y' */