Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch 655 Excluding Merge-Ins
This is equivalent to a diff from 126d79c5 to a8e78f00
2023-04-07
| ||
07:20 | TIP #655 implementation: Support the styleMask property for NSWindow and NSPanel in Aqua check-in: a527ef99 user: jan.nijtmans tags: trunk, main | |
2023-04-02
| ||
22:26 | Complete fix for [85cea56c27]: The -underline option does not show an underline on ttk::label 1000 x thanks to François, for pinpointing the exact problem! check-in: 71f4c24a user: jan.nijtmans tags: trunk, main | |
22:01 | Make sure not to change the fullscreen bit in the styleMask. (Thanks Francois!) Closed-Leaf check-in: a8e78f00 user: culler tags: 655 | |
2023-04-01
| ||
18:25 | Merge 8.7 check-in: 2a92fb6c user: jan.nijtmans tags: tip-626 | |
13:54 | Merge trunk (since previous commit on trunk was moved to tip-660) Closed-Leaf check-in: b52d9d1f user: jan.nijtmans tags: bug-85cea56c27 | |
08:58 | Build Tk with TIP #660 check-in: 91dfbe10 user: jan.nijtmans tags: tip-660 | |
2023-03-31
| ||
22:19 | Merge 8.7 check-in: dc190a36 user: jan.nijtmans tags: tip-647 | |
13:57 | merge trunk check-in: b789024f user: dgp tags: core-8-7-b1-rc | |
2023-03-30
| ||
10:02 | Merge 8.7 check-in: 0932892a user: jan.nijtmans tags: revised_text, tip-466 | |
09:58 | Merge 8.7 check-in: a289e0eb user: jan.nijtmans tags: tip-658 | |
09:51 | Merge 8.7 check-in: a3a73c9e user: jan.nijtmans tags: 655 | |
09:36 | Fix [15c685a976]: Issues with menu cloning. check-in: 126d79c5 user: sbron tags: trunk, main | |
09:33 | Fix [15c685a976]: Issues with menu cloning. check-in: af772820 user: sbron tags: core-8-6-branch | |
03:45 | Fix [ee0847f633]: Aqua: compiler warning in debug builds. And Fix [2ed289cae0]: Aqua: more format specifiers than arguments in tkToolbarButton check-in: 42cbe254 user: fvogel tags: trunk, main | |
Changes to doc/wm.n.
︙ | ︙ | |||
90 91 92 93 94 95 96 | . Specifies the transparent color index of the toplevel. It takes any color value accepted by \fBTk_GetColor\fR. If the empty string is specified (default), no transparent color is used. This is supported on Windows 2000/XP+. Where not supported, the \fB\-transparentcolor\fR value remains at \fB{}\fR. .PP | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | . Specifies the transparent color index of the toplevel. It takes any color value accepted by \fBTk_GetColor\fR. If the empty string is specified (default), no transparent color is used. This is supported on Windows 2000/XP+. Where not supported, the \fB\-transparentcolor\fR value remains at \fB{}\fR. .PP On MacOS, the following attributes may be set. .TP \fB\-appearance\fR . Specifies whether the window is rendered in "dark mode". Allowed values are \fBauto\fR, \fBaqua\fR and \fBdarkaqua\fR. If the setting is auto then the appearance of the window is controlled by the System Settings. .TP \fB\-class\fR . Specifies whether the underlying Aqua window for a toplevel is an object of the NSWindow class or the NSPanel class. The two allowed values for this option are \fBnswindow\fR and \fBnspanel\fR. It is not possible to change the class of the underlying Aqua window once that window has been instantiated, and attempting to do that is an error. However it is allowed to set this option for a pathname that does not correspond to an existing window. Doing that causes the class name to be cached for later use. When a toplevel with that pathname is eventually created, the cached class name will determine which class is used for the underlying Aqua window. .TP \fB\-isdark\fR . Returns a boolean value which is true if the window is currently in dark mode. .TP \fB\-modified\fR . Specifies the modification state of the window (determines whether the window close widget contains the modification indicator and whether the proxy icon is draggable). .TP \fB\-notify\fR . Specifies process notification state (bouncing of the application dock icon). .TP \fB\-stylemask\fR . Specifies an integer to be assigned as the styleMask of the underlying Aqua window. (See the Apple documentation for styleMask property of the NSWindow class.) The value of this option should be a list of bitnames. Each bit named in the list will be set to 1, and all other bits will be set to 0. The allowed bitnames are: \fBtitled\fR, \fBclosable\fR, \fBminiaturizable\fR, \fBresizable\fR, \fBfullsizecontentview\fR, \fBdocmodal\fR, \fButility\fR, \fBnonactivatingpanel\fR, and \fBHUDwindow\fR. Note that a side effect of setting the fullsizecontentview bit is that the window title bar becomes transparent. .TP \fB\-tabbingid\fR . Controls how tabbed toplevel windows are grouped together. Two tabs in the same group must correspond to toplevels with the same tabbingid, which can be an arbitrary UTF8 string. In the Tk implementation, changing the tabbingid of a toplevel in a tab group will cause it to be moved into a different group, in which all tabs have the new tabbingid or, if the new tabbingid is unique, to become a normal non-tabbed toplevel. It is allowed to set the tabbingid before the toplevel is created. If the pathname provided in the command does not correspond to a toplevel, the value will be cached and used later when the toplevel is actually created. .TP \fB\-tabbingmode\fR . Controls whether a toplevel can be opened as a tab within a tab group. The allowed values are \fBauto\fR, \fBpreferred\fR or \fBdisallowed\fR. A toplevel can be opened as a tab in exactly two situations: if its tabbingmode is \fBpreferred\fR; or if its tabbingmode is \fBauto\fR and the user has selected "prefer tabs when opening documents" in the Desktop and Dock panel of the System Settings application. It is allowed to set the tabbingmode before the toplevel is created. If the pathname provided in the command does not correspond to a toplevel, the value will be cached and used later when the toplevel is actually created. .TP \fB\-titlepath\fR . Specifies the path of the file referenced as the window proxy icon (which can be dragged and dropped in lieu of the file's finder icon). .TP \fB\-transparent\fR . Makes the window content area transparent and turns off the window shadow. For the transparency to be effective, the toplevel background needs to be set to a color with some alpha, e.g. .QW systemTransparent . |
︙ | ︙ |
Changes to generic/tkConfig.c.
︙ | ︙ | |||
2025 2026 2027 2028 2029 2030 2031 | } case TK_OPTION_INT: if (!(optionPtr->specPtr->flags & (TK_OPTION_NULL_OK|TCL_NULL_OK)) || *((int *) internalPtr) != INT_MIN) { objPtr = Tcl_NewWideIntObj(*((int *)internalPtr)); } break; case TK_OPTION_INDEX: | > | | | | | | | | | | | | > | 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 | } case TK_OPTION_INT: if (!(optionPtr->specPtr->flags & (TK_OPTION_NULL_OK|TCL_NULL_OK)) || *((int *) internalPtr) != INT_MIN) { objPtr = Tcl_NewWideIntObj(*((int *)internalPtr)); } break; case TK_OPTION_INDEX: if (!(optionPtr->specPtr->flags & (TK_OPTION_NULL_OK|TCL_NULL_OK)) || *((int *) internalPtr) != INT_MIN) { if (*((int *) internalPtr) == INT_MIN) { objPtr = TkNewIndexObj(TCL_INDEX_NONE); } else if (*((int *) internalPtr) == INT_MAX) { objPtr = Tcl_NewStringObj("end+1", TCL_INDEX_NONE); } else if (*((int *) internalPtr) == -1) { objPtr = Tcl_NewStringObj("end", TCL_INDEX_NONE); } else if (*((int *) internalPtr) < 0) { char buf[32]; snprintf(buf, 32, "end%d", 1 + *((int *) internalPtr)); objPtr = Tcl_NewStringObj(buf, TCL_INDEX_NONE); } else { objPtr = Tcl_NewWideIntObj(*((int *) internalPtr)); } } break; case TK_OPTION_DOUBLE: if (!(optionPtr->specPtr->flags & (TK_OPTION_NULL_OK|TCL_NULL_OK)) || !isnan(*((double *) internalPtr))) { objPtr = Tcl_NewDoubleObj(*((double *) internalPtr)); } break; |
︙ | ︙ |
Changes to library/demos/mac_styles.tcl.
︙ | ︙ | |||
30 31 32 33 34 35 36 | image create nsimage tkfeather1 -source $featherImg -as file -width 48 -height 48 -pressed 1 image create nsimage starry -source $starryImg -as file -width 96 -radius 10 image create nsimage starry1 -source $starryImg -as file -width 96 -radius 10 -pressed 1 image create nsimage starry2 -source $starryImg -as file -width 96 -radius 10 -ring 3 image create nsimage field -source $fieldImg -as file -width 96 -radius 10 image create nsimage field1 -source $fieldImg -as file -width 96 -radius 10 -pressed 1 image create nsimage field2 -source $fieldImg -as file -width 96 -radius 10 -ring 3 | | | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | image create nsimage tkfeather1 -source $featherImg -as file -width 48 -height 48 -pressed 1 image create nsimage starry -source $starryImg -as file -width 96 -radius 10 image create nsimage starry1 -source $starryImg -as file -width 96 -radius 10 -pressed 1 image create nsimage starry2 -source $starryImg -as file -width 96 -radius 10 -ring 3 image create nsimage field -source $fieldImg -as file -width 96 -radius 10 image create nsimage field1 -source $fieldImg -as file -width 96 -radius 10 -pressed 1 image create nsimage field2 -source $fieldImg -as file -width 96 -radius 10 -ring 3 image create nsimage add -source NSAddTemplate -width 20 -height 20 image create nsimage remove -source NSRemoveTemplate -width 18 -height 4 # Off state and variables for checkbuttons and radio buttons set off {!selected !alternate} variable $w.checkVar variable $w.radioVar variable $w.triangleVar variable $w.popupVar |
︙ | ︙ | |||
126 127 128 129 130 131 132 | bind $triangle <Button-1> {toggleTriangle %W} set bonjour [ttk::button $buttonFrame.bonjour -style ImageButton -text Bonjour \ -image {bonjour pressed bonjour1}] set feather [ttk::button $buttonFrame.feather -style ImageButton -text Tk \ -image {tkfeather pressed tkfeather1}] set gradient [ttk::frame $buttonFrame.gradient] pack [ttk::button $buttonFrame.gradient.add -style GradientButton \ | | | | 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | bind $triangle <Button-1> {toggleTriangle %W} set bonjour [ttk::button $buttonFrame.bonjour -style ImageButton -text Bonjour \ -image {bonjour pressed bonjour1}] set feather [ttk::button $buttonFrame.feather -style ImageButton -text Tk \ -image {tkfeather pressed tkfeather1}] set gradient [ttk::frame $buttonFrame.gradient] pack [ttk::button $buttonFrame.gradient.add -style GradientButton \ -image add -padding {2 0}] -side left pack [ttk::button $buttonFrame.gradient.remove -style GradientButton \ -image remove -padding {2 8}] -side left set disclosure [ttk::checkbutton $buttonFrame.disclosure -style DisclosureButton] set help [ttk::button $buttonFrame.help -style HelpButton]; $check state $off $radio.r1 state $off $radio.r2 state $off |
︙ | ︙ | |||
236 237 238 239 240 241 242 | -command "beLight $appearanceFrame $w"] grid columnconfigure $appearanceFrame 1 -minsize 10 grid $light -row 1 -column 0 -sticky e set dark [ttk::button $appearanceFrame.dark -style ImageButton -text Dark \ -image {starry pressed starry1 selected starry2} \ -command "beDark $appearanceFrame $w"] grid $dark -row 1 -column 2 -sticky w | | | | | 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 | -command "beLight $appearanceFrame $w"] grid columnconfigure $appearanceFrame 1 -minsize 10 grid $light -row 1 -column 0 -sticky e set dark [ttk::button $appearanceFrame.dark -style ImageButton -text Dark \ -image {starry pressed starry1 selected starry2} \ -command "beDark $appearanceFrame $w"] grid $dark -row 1 -column 2 -sticky w if { [wm attributes $w -isdark] } { $dark state selected } else { $light state selected } proc beLight {f w} { wm attributes $w -appearance aqua $f.dark state !selected $f.light state selected after 10 $f.light state !hover } proc beDark {f w} { wm attributes $w -appearance darkaqua $f.light state !selected $f.dark state selected after 10 $f.dark state !hover } $w.notebook add $appearanceFrame -text "Appearance" ## See Code / Dismiss pack [addSeeDismiss $w.buttons $w] -side bottom -fill x ## Notebook pack $w.notebook -side bottom -fill both -expand 1 -padx 16 -pady 16 |
Added library/demos/mac_tabs.tcl.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | # mac_tabs.tcl -- # # This demonstration script creates three tabbable windows and allows the # wm attributes tabbingid and tabbingmode to be manipulated for the third # window, to demonstrate the effects of those attributes. if {![info exists widgetDemo]} { error "This script should be run from the \"widget\" demo." } package require Tk catch {font create giant -family {Times New Roman} -size 64} set w .mac_tabs catch {destroy $w} toplevel $w package require Tk wm title $w "Tabbed Windows in Aqua" wm iconname $w "mac_tabs" positionWindow $w set suffix 0 set winlist {} ## ## See Code / Dismiss pack [addSeeDismiss $w.buttons $w] -side bottom -fill x ## set info "\ This demo shows 3 toplevels, A, B, and C. \ Each of these has tabbingmode set to preferred. \ The tabbingid of Window A is groupA, the \ tabbingid of Window B is groupB and the tabbingid \ of Window C is groupC. Use the menubuttons below \ to see the effect of changing the tabbingid and \ tabbingmode attributes for Window C. \ " pack [message $w.info -text $info -width 300] wm geometry $w +450+350 ttk::frame $w.f menu $w.idmenu -tearoff 0 foreach id {groupA groupB groupC} { $w.idmenu add command -label $id \ -command [list wm attributes $w.c -tabbingid $id] } menu $w.modemenu -tearoff 0 foreach mode {auto preferred disallowed} { $w.modemenu add command -label $mode \ -command [list wm attributes $w.c -tabbingmode $mode] } ttk::menubutton $w.f.idbutton -menu $w.idmenu -text "tabbingid"\ -direction below grid $w.f.idbutton -row 0 -column 0 ttk::menubutton $w.f.modebutton -menu $w.modemenu -text "tabbingmode"\ -direction below grid $w.f.modebutton -row 1 -column 0 pack $w.f wm attributes $w.a -tabbingid groupA wm attributes $w.a -tabbingmode preferred toplevel $w.a wm geometry $w.a +50+100 wm title $w.a "Window A" pack [ttk::label $w.a.l -text A -font giant] -padx 100 -pady 30 wm attributes $w.b -tabbingid groupB wm attributes $w.b -tabbingmode preferred toplevel $w.b wm geometry $w.b +400+100 wm title $w.b "Window B" pack [ttk::label $w.b.l -text B -font giant] -padx 100 -pady 30 wm attributes $w.c -tabbingid groupC wm attributes $w.c -tabbingmode preferred toplevel $w.c wm geometry $w.c +750+100 wm title $w.c "Window C" pack [ttk::label $w.c.l -text C -font giant] -padx 100 -pady 30 |
Added library/demos/mac_wm.tcl.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | # mac_window_styles.tcl -- # # This demonstration script creates a toplevel window containing a notebook # whose pages provide examples of the various mac-specific widgets that are # provided via special values for the -style option. if {![info exists widgetDemo]} { error "This script should be run from the \"widget\" demo." } package require Tk set w .mac_wm catch {destroy $w} toplevel $w package require Tk wm title $w "Tk Aqua Window Styles" wm iconname $w "mac_wm" positionWindow $w set suffix 0 set winlist {} ## ## See Code / Dismiss pack [addSeeDismiss $w.buttons $w] -side bottom -fill x proc launch {name windowInfo class} { if {[winfo exists $name]} { wm deiconify $name focus -force $name return } wm attributes $name -class $class; toplevel $name wm title $name $class set f $name.f ttk::frame $f set t $f.t text $t -background systemWindowBackgroundColor \ -highlightcolor systemWindowBackgroundColor \ -font systemDefaultFont\ -wrap word -width 50 -height 6 $t insert insert $windowInfo $t configure -state disabled grid columnconfigure $f 0 -weight 1 grid $t -row 0 -column 0 -columnspan 2 -sticky NSEW ttk::labelframe $f.stylemask -text "styleMask bits" # titled if {$class == "nswindow"} { ttk::checkbutton $f.stylemask.titled -text titled -variable $name.titled \ -command [list setbit $name $f.stylemask.titled titled] $f.stylemask.titled state selected grid $f.stylemask.titled -row 0 -column 0 -sticky w } # closable ttk::checkbutton $f.stylemask.closable -text closable -variable $name.closable \ -command [list setbit $name $f.stylemask.closable closable] $f.stylemask.closable state selected grid $f.stylemask.closable -row 1 -column 0 -sticky w # miniaturizableable ttk::checkbutton $f.stylemask.miniaturizable -text miniaturizable \ -variable $name.miniaturizable \ -command [list setbit $name $f.stylemask.miniaturizable miniaturizable] if {$class == "nswindow"} { $f.stylemask.miniaturizable state selected } else { $f.stylemask.miniaturizable state !alternate } grid $f.stylemask.miniaturizable -row 2 -column 0 -sticky w # resizable ttk::checkbutton $f.stylemask.resizable -text resizable -variable $name.resizable \ -command [list setbit $name $f.stylemask.resizable resizable] $f.stylemask.resizable state selected grid $f.stylemask.resizable -row 3 -column 0 -sticky w # docmodal ttk::checkbutton $f.stylemask.docmodal -text docmodal -variable $name.docmodal \ -command [list setbit $name $f.stylemask.docmodal docmodal] $f.stylemask.docmodal state !alternate grid $f.stylemask.docmodal -row 4 -column 0 -sticky w grid $f.stylemask -row 1 -column 0 pack $name.f -side bottom -fill both -expand 1 -padx 16 -pady 16 } set info "The command wm attributes window -stylemask ?bitnames? can \ be used to modify bits in the stylemask property of the NSWindow or \ NSPanel underlying a Tk Window. Changing these bits causes the \ style of the window to change. This demo allows you to see the \ effects of changing the bits. (Note that buttons in the title bar \ can also be enabled or disabled with the ::tk::unsupported::MacWindowStyle \ command.)" set panelInfo "A toplevel based on an NSPanel has a narrower title bar\ than one based on an NSWindow. In addition the panel remains above all\ windows on the screen, regardless of which app is active. These are\ intended to be used as modal windows." set windowInfo "This is a standard Apple document window, based on an\ NSWindow. It has a larger title bar and behaves normally with respect\ to other windows from the same or another app." ## background frame set f $w.f ttk::frame $f set t $f.t text $t -background systemWindowBackgroundColor \ -highlightcolor systemWindowBackgroundColor \ -font systemDefaultFont\ -wrap word -width 50 -height 8 $t insert insert $info $t configure -state disabled grid columnconfigure $f 0 -weight 1 grid $t -row 0 -column 0 -columnspan 2 -sticky NSEW ttk::labelframe $f.stylemask -text "styleMask" grid $f.stylemask -row 1 -column 0 grid [ttk::button $f.wbw -text "Open an NSWindow" -width 20 \ -command [list launch .nswindow $windowInfo nswindow]] -row 2 -column 0 grid [ttk::button $f.wbp -text "Open an NSPanel" -width 20 \ -command [list launch .nspanel $panelInfo nspanel]] -row 3 -column 0 grid [ttk::button $f.wbm -text "Open a modern window" -width 20 \ -command launchModernWindow] -row 4 -column 0 pack $w.f -side bottom -fill both -expand 1 -padx 16 -pady 16 proc setbit {win cb bitname} { set state [$cb instate selected] set bits [wm attributes $win -stylemask] set index [lsearch $bits $bitname] if {$index >= 0 && !$state} { set bits [lreplace $bits $index $index] } if {$index < 0 && $state} { lappend bits $bitname } wm attributes $win -stylemask $bits } set aboutText \ "Most of the apps which ship with a contemporary version of macOS \ feature a window similar to this one, with a left sidebar that \ allows selecting the content to be shown on the right hand side of \ the window. These windows do not have a (visible) titlebar.\ \n\nApps that use such windows include the Finder and the App Store as \ well as Notes, Messages, Books, Maps and many others.\ \n\nTo create a window like this one in Tk simply set the fullsizecontent bit \ in the stylemask. For example:\n\n" set aboutCode \ "wm attributes .t -stylemask {titled \\\ \nfullsizecontent closable miniaturizable \\\ \nresizable}\n\n" set detailsText \ "(1) In the Apple API, setting the fullsizecontent bit in the stylemask \ only allows content to be drawn in the part of the window covered by \ the titlebar. In order for that content to be visible the title bar \ must be transparent. Since it would be pointless to draw content under \ an opaque title bar, Tk makes the title bar transparent whenever the \ fullsizecontent bit is set.\ \n\n\(2) Each radio button in the sidebar is a standard ttk::radiobutton \ but created with a special value for its -style option. The value of the \ -style option used to create these buttons is SidebarButton.\n" set whichPage 1 trace add variable whichPage write "flipPage whichPage" proc flipPage {varname args} { global whichPage set newpage [set $varname] grid remove [grid content .mod.right -row 0 -column 0] switch $newpage\ 1 {grid .mod.right.about -padx 30 -pady 30 -row 0 -column 0 -sticky nsew}\ 2 {grid .mod.right.details -padx 30 -pady 30 -row 0 -column 0 -sticky nsew} update idletasks } proc launchModernWindow {} { global whichPage global aboutText global aboutCode global detailsText if {[winfo exists .mod]} { wm deiconify .mod focus -force .mod return } toplevel .mod wm title .mod {} wm attributes .mod -stylemask {titled fullsizecontent closable \ miniaturizable resizable} .mod configure -background white grid columnconfigure .mod 0 -weight 0 grid columnconfigure .mod 1 -weight 1 grid rowconfigure .mod 0 -weight 1 frame .mod.left -width 220 -height 400 -background systemWindowBackgroundColor catch { font create leftFont -family .AppleSystemUIFont -size 11 font create rightFont -family .AppleSystemUIFont -size 16 font create codeFont -family Courier -size 16 } grid [ttk::label .mod.left.spacer -padding {220 30 0 0}] -row 0 -column 0 grid [ttk::radiobutton .mod.left.about -text About -style SidebarButton \ -variable whichPage -value 1] \ -row 1 -column 0 -sticky nsew -padx 14 grid [ttk::radiobutton .mod.left.details -text Details -style SidebarButton \ -variable whichPage -value 2] \ -row 2 -column 0 -sticky nsew -padx 14 grid .mod.left -row 0 -column 0 -sticky nsew frame .mod.right -width 500 -background systemTextBackgroundColor grid rowconfigure .mod.right 0 -weight 0 text .mod.right.about -highlightcolor systemTextBackgroundColor \ -background systemTextBackgroundColor -font rightFont \ -highlightthickness 0 -wrap word -width 40 .mod.right.about tag configure code -font codeFont .mod.right.about insert end $aboutText .mod.right.about insert end $aboutCode code .mod.right.about configure -state disabled text .mod.right.details -highlightcolor systemTextBackgroundColor \ -background systemTextBackgroundColor -font rightFont\ -highlightthickness 0 -wrap word -width 40 .mod.right.details insert end $detailsText .mod.right.details configure -state disabled grid .mod.right.about -padx 30 -pady 30 -row 0 -column 0 -sticky nsew grid .mod.right -row 0 -column 1 -sticky nsew wm geometry .mod 800x500 update idletasks } |
Changes to library/demos/widget.
︙ | ︙ | |||
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | @@demo puzzle A 15-puzzle game made out of buttons @@demo icon Iconic buttons that use bitmaps @@demo image1 Two labels displaying images @@demo image2 A simple user interface for viewing images @@demo labelframe Labelled frames @@demo ttkbut The simple Themed Tk widgets } if {[tk windowingsystem] eq "aqua"} { addFormattedText { @@new @@demo mac_styles Special widgets for macOS } } addFormattedText { @@subtitle Listboxes and Trees @@demo states The 50 states @@demo colors Colors: change the color scheme for the application @@demo sayings A collection of famous and infamous sayings @@demo mclist A multi-column list of countries @@demo tree A directory browser tree | > > > > > > > | 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 | @@demo puzzle A 15-puzzle game made out of buttons @@demo icon Iconic buttons that use bitmaps @@demo image1 Two labels displaying images @@demo image2 A simple user interface for viewing images @@demo labelframe Labelled frames @@demo ttkbut The simple Themed Tk widgets } if {[tk windowingsystem] eq "aqua"} { addFormattedText { @@subtitle Mac-Specific Widgets and Window Styles @@new @@demo mac_styles Special widgets for macOS @@new @@demo mac_wm Window styles for macOS @@new @@demo mac_tabs Tabbed Windows on macOS } } addFormattedText { @@subtitle Listboxes and Trees @@demo states The 50 states @@demo colors Colors: change the color scheme for the application @@demo sayings A collection of famous and infamous sayings @@demo mclist A multi-column list of countries @@demo tree A directory browser tree |
︙ | ︙ |
Changes to library/ttk/aquaTheme.tcl.
︙ | ︙ | |||
70 71 72 73 74 75 76 77 78 79 80 81 82 83 | pressed white } \ -font { selected RecessedFont active RecessedFont pressed RecessedFont } # For Entry, Combobox and Spinbox widgets the selected text background # is the "Highlight color" selected in preferences when the widget # has focus. It is a gray color when the widget does not have focus or # the window does not have focus. (The background state implies !focus # so we only need to specify !focus.) | > > > > > > > > > > > > > > | 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | pressed white } \ -font { selected RecessedFont active RecessedFont pressed RecessedFont } # Sidebar (radio) button font create SidebarFont -family .AppleSystemUIFont -size 11 -weight normal ttk::style configure SidebarButton \ -foreground systemControlTextColor \ -font SidebarFont ttk::style map SidebarButton \ -foreground { {disabled selected} systemWindowBackgroundColor3 {disabled !selected} systemDisabledControlTextColor selected systemTextColor active systemTextColor pressed systemTextColor } # For Entry, Combobox and Spinbox widgets the selected text background # is the "Highlight color" selected in preferences when the widget # has focus. It is a gray color when the widget does not have focus or # the window does not have focus. (The background state implies !focus # so we only need to specify !focus.) |
︙ | ︙ |
Changes to macosx/tkMacOSXMouseEvent.c.
︙ | ︙ | |||
84 85 86 87 88 89 90 | - (NSEvent *) tkProcessMouseEvent: (NSEvent *) theEvent { NSWindow *eventWindow = [theEvent window]; NSEventType eventType = [theEvent type]; TKContentView *contentView = [eventWindow contentView]; NSPoint location = [theEvent locationInWindow]; | | | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | - (NSEvent *) tkProcessMouseEvent: (NSEvent *) theEvent { NSWindow *eventWindow = [theEvent window]; NSEventType eventType = [theEvent type]; TKContentView *contentView = [eventWindow contentView]; NSPoint location = [theEvent locationInWindow]; //NSPoint viewLocation = [contentView convertPoint:location fromView:nil]; TkWindow *winPtr = NULL, *grabWinPtr, *scrollTarget = NULL; Tk_Window tkwin = NULL, capture, target; NSPoint local, global; NSInteger button; TkWindow *newFocus = NULL; int win_x, win_y; unsigned int buttonState = 0; |
︙ | ︙ | |||
113 114 115 116 117 118 119 | * passed up the responder chain. However, there is are two exceptions. * One is for synthesized events, which are used in testing. Those events * are recognized by having their timestamp set to 0. The other is for * motion events sent by the local event monitor, which will have their * window attribute set to nil. */ | | > | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | * passed up the responder chain. However, there is are two exceptions. * One is for synthesized events, which are used in testing. Those events * are recognized by having their timestamp set to 0. The other is for * motion events sent by the local event monitor, which will have their * window attribute set to nil. */ if (![eventWindow isMemberOfClass:[TKWindow class]] && ![eventWindow isMemberOfClass:[TKPanel class]]) { if ([theEvent timestamp] == 0) { isTestingEvent = YES; eventWindow = [NSApp keyWindow]; } if (eventType == NSLeftMouseDragged || eventType == NSMouseMoved) { eventWindow = [NSApp keyWindow]; isMotionEvent = YES; } if (!isTestingEvent && !isMotionEvent) { return theEvent; } } else if (!NSPointInRect(location, [contentView bounds])) { isOutside = YES; } button = [theEvent buttonNumber] + Button1; if ((button & -2) == Button2) { button ^= 1; /* Swap buttons 2/3 */ } switch (eventType) { |
︙ | ︙ | |||
242 243 244 245 246 247 248 | ignoreUpDown = YES; } } if (!isTestingEvent) { NSRect bounds = [contentView bounds]; NSRect grip = NSMakeRect(bounds.size.width - 10, 0, 10, 10); bounds = NSInsetRect(bounds, 2.0, 2.0); | | | | 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | ignoreUpDown = YES; } } if (!isTestingEvent) { NSRect bounds = [contentView bounds]; NSRect grip = NSMakeRect(bounds.size.width - 10, 0, 10, 10); bounds = NSInsetRect(bounds, 2.0, 2.0); if (!NSPointInRect(location, bounds)) { return theEvent; } if (NSPointInRect(location, grip)) { return theEvent; } if ([NSApp tkLiveResizeEnded]) { [NSApp setTkLiveResizeEnded:NO]; return theEvent; } } |
︙ | ︙ |
Changes to macosx/tkMacOSXPrivate.h.
︙ | ︙ | |||
461 462 463 464 465 466 467 468 469 470 471 472 473 474 | @interface TKPanel : NSPanel { } @property Window tkWindow; @end #pragma mark NSMenu & NSMenuItem Utilities @interface NSMenu(TKUtils) + (id)menuWithTitle:(NSString *)title; + (id)menuWithTitle:(NSString *)title menuItems:(NSArray *)items; + (id)menuWithTitle:(NSString *)title submenus:(NSArray *)submenus; - (NSMenuItem *)itemWithSubmenu:(NSMenu *)submenu; | > > > | 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 | @interface TKPanel : NSPanel { } @property Window tkWindow; @end @interface TKPanel(TKWm) - (void) tkLayoutChanged; @end #pragma mark NSMenu & NSMenuItem Utilities @interface NSMenu(TKUtils) + (id)menuWithTitle:(NSString *)title; + (id)menuWithTitle:(NSString *)title menuItems:(NSArray *)items; + (id)menuWithTitle:(NSString *)title submenus:(NSArray *)submenus; - (NSMenuItem *)itemWithSubmenu:(NSMenu *)submenu; |
︙ | ︙ |
Changes to macosx/tkMacOSXSubwindows.c.
︙ | ︙ | |||
399 400 401 402 403 404 405 | LastKnownRequestProcessed(display)++; if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { TKWindow *w = (TKWindow *)macWin->winPtr->wmInfoPtr->window; if (w) { if ([w styleMask] & NSFullScreenWindowMask) { | | | 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 | LastKnownRequestProcessed(display)++; if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { TKWindow *w = (TKWindow *)macWin->winPtr->wmInfoPtr->window; if (w) { if ([w styleMask] & NSFullScreenWindowMask) { [(TKWindow *)w tkLayoutChanged]; } else { NSRect r = [w contentRectForFrameRect:[w frame]]; r.origin.y += r.size.height - height; r.size.width = width; r.size.height = height; [w setFrame:[w frameRectForContentRect:r] display:NO]; |
︙ | ︙ |
Changes to macosx/tkMacOSXWm.c.
︙ | ︙ | |||
33 34 35 36 37 38 39 | /* #ifdef TK_MAC_DEBUG #define TK_MAC_DEBUG_WINDOWS #endif */ /* | | | 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /* #ifdef TK_MAC_DEBUG #define TK_MAC_DEBUG_WINDOWS #endif */ /* * Carbon window attributes and classes. */ #define WM_NSMASK_SHIFT 36 #define tkWindowDoesNotHideAttribute \ ((UInt64) 1 << kHIWindowBitDoesNotHide) #define tkCanJoinAllSpacesAttribute \ ((UInt64) NSWindowCollectionBehaviorCanJoinAllSpaces << 34) |
︙ | ︙ | |||
107 108 109 110 111 112 113 | .forceOffAttrs = kWindowCollapseBoxAttribute, .flags = WM_TOPMOST, .styleMask = NSUtilityWindowMask, }, [kHelpWindowClass] = { .defaultAttrs = kWindowHideOnSuspendAttribute, .forceOnAttrs = kWindowNoTitleBarAttribute | kWindowDoesNotCycleAttribute, | | > | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | .forceOffAttrs = kWindowCollapseBoxAttribute, .flags = WM_TOPMOST, .styleMask = NSUtilityWindowMask, }, [kHelpWindowClass] = { .defaultAttrs = kWindowHideOnSuspendAttribute, .forceOnAttrs = kWindowNoTitleBarAttribute | kWindowDoesNotCycleAttribute, .flags = WM_TOPMOST, .styleMask = 0}, [kSheetWindowClass] = { .validAttrs = kWindowResizableAttribute, .forceOnAttrs = kWindowNoTitleBarAttribute | kWindowDoesNotCycleAttribute, .styleMask = NSDocModalWindowMask, }, [kToolbarWindowClass] = { .defaultAttrs = kWindowHideOnSuspendAttribute, |
︙ | ︙ | |||
146 147 148 149 150 151 152 | }; #define ForceAttributes(attributes, class) \ ((attributes) & (~macClassAttrs[(class)].forceOffAttrs | \ (macClassAttrs[(class)].forceOnAttrs & ~kWindowResizableAttribute))) /* | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > | | | | | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 | }; #define ForceAttributes(attributes, class) \ ((attributes) & (~macClassAttrs[(class)].forceOffAttrs | \ (macClassAttrs[(class)].forceOnAttrs & ~kWindowResizableAttribute))) /* * Structures and data for the wm attributes command (macOS 10.13 and later): */ /* Hash tables for attributes which can be set before a window exists */ static Tcl_HashTable pathnameToSubclass; static Tcl_HashTable pathnameToTabbingId; static Tcl_HashTable pathnameToTabbingMode; enum NSWindowSubclass { subclassNSWindow = 0, subclassNSPanel = 1 }; /* This array must be indexed by the enum above.*/ static const char *subclassNames[] = {"nswindow", "nspanel", NULL}; typedef struct buttonField_t { unsigned zoom: 1; unsigned miniaturize: 1; unsigned close: 1; } buttonField; /* The order of these names must match the order of the bits above! */ static const char *buttonNames[] = {"zoom", "miniaturize", "close", NULL}; typedef union windowButtonState_t { int intvalue; buttonField bits; } windowButtonState; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 enum NSWindowClass { NSWindowClass_any = 0, NSWindowClass_window = 1, NSWindowClass_panel = 2 }; typedef struct styleMaskBit_t { const char *bitname; unsigned long bitvalue; enum NSWindowClass allowed; } styleMaskBit; static const styleMaskBit styleMaskBits[] = { /* Make the titlebar visible and use round corners. */ {"titled", NSWindowStyleMaskTitled, NSWindowClass_window}, /* Enable the close button. */ {"closable", NSWindowStyleMaskClosable, NSWindowClass_window}, /* Enable the miniaturize button. */ {"miniaturizable", NSWindowStyleMaskMiniaturizable, NSWindowClass_window}, /* Allow the user to resize the window. */ {"resizable", NSWindowStyleMaskResizable, NSWindowClass_window}, /* * Make the content view extend under the titlebar. We force * titlebarAppearsTransparent when this bit is set. Otherwise it is * pretty useless. */ {"fullsizecontentview", NSWindowStyleMaskFullSizeContentView, NSWindowClass_window}, /* Rounded corners, cannot have a titlebar (overrides titled bit). */ {"docmodal", NSWindowStyleMaskDocModalWindow, NSWindowClass_any}, /* ============================================ * The following bits are only valid for panels. */ /* Make the title bar thinner. */ {"utility", NSWindowStyleMaskUtilityWindow, NSWindowClass_panel}, /* Do not activate the app when the window is activated. */ {"nonactivatingpanel", NSWindowStyleMaskNonactivatingPanel, NSWindowClass_panel}, /* * Requires utility. Cannot be resizable. Close button is an X; no other buttons. * Cannot be a docmodal. */ {"HUDwindow", NSWindowStyleMaskHUDWindow, NSWindowClass_panel}, {NULL, 0, 0} }; typedef struct tabbingMode_t { const char *modeName; long modeValue; } tabbingMode; static const tabbingMode tabbingModes[] = { {"auto", NSWindowTabbingModeAutomatic}, {"disallowed", NSWindowTabbingModeDisallowed}, {"preferred", NSWindowTabbingModePreferred}, {NULL, -1} }; static const char *const appearanceStrings[] = { "aqua", "auto", "darkaqua", NULL }; enum appearances { APPEARANCE_AQUA, APPEARANCE_AUTO, APPEARANCE_DARKAQUA }; static Bool wantsToBeTab(NSWindow *macWindow) { Bool result; switch ([macWindow tabbingMode]) { case NSWindowTabbingModeDisallowed: result = False; break; case NSWindowTabbingModePreferred: result = True; break; case NSWindowTabbingModeAutomatic: result = ([NSWindow userTabbingPreference] == NSWindowUserTabbingPreferenceAlways); break; default: result = False; break; } return result; } /* * Helper for the tkLayoutChanged methods. Synchronizes Tk's understanding of * the bounds of a contentView with the window's. It is needed because there * are situations when the window manager can change the layout of an NSWindow * without having been requested to do so by Tk. Examples are when a window * goes FullScreen or shows a tab bar. NSWindow methods which involve such * layout changes should be overridden or protected by methods which call this. */ static void syncLayout(NSWindow *macWindow) { TkWindow *winPtr = TkMacOSXGetTkWindow(macWindow); if (winPtr) { // Using screen coordinates with origin at bottom left. NSRect frameRect = [macWindow frame]; // This accounts for the tab bar, if there is one. NSRect contentRect = [macWindow contentRectForFrameRect: frameRect]; WmInfo *wmPtr = winPtr->wmInfoPtr; // The parent includes the title bar, tab bar and window frame. wmPtr->xInParent = frameRect.origin.x - contentRect.origin.x; wmPtr->yInParent = (frameRect.origin.y + frameRect.size.height - contentRect.origin.y - contentRect.size.height); wmPtr->parentWidth = winPtr->changes.width + frameRect.size.width - contentRect.size.width; wmPtr->parentHeight = winPtr->changes.height + frameRect.size.height - contentRect.size.height; } } #endif typedef enum { WMATT_ALPHA, WMATT_APPEARANCE, WMATT_BUTTONS, WMATT_FULLSCREEN, WMATT_ISDARK, WMATT_MODIFIED, WMATT_NOTIFY, WMATT_TITLEPATH, WMATT_TOPMOST, WMATT_TRANSPARENT, WMATT_STYLEMASK, WMATT_CLASS, WMATT_TABBINGID, WMATT_TABBINGMODE, WMATT_TYPE, _WMATT_LAST_ATTRIBUTE } WmAttribute; static const char *const WmAttributeNames[] = { "-alpha", "-appearance", "-buttons", "-fullscreen", "-isdark", "-modified", "-notify", "-titlepath", "-topmost", "-transparent", "-stylemask", "-class", "-tabbingid", "-tabbingmode", "-type", NULL }; /* * The variable below is used to enable or disable tracing in this module. If * tracing is enabled, then information is printed on standard output about * interesting interactions with the window manager. */ |
︙ | ︙ | |||
189 190 191 192 193 194 195 | /* * The following keeps state for Aqua dock icon bounce notification. */ static int tkMacOSXWmAttrNotifyVal = 0; /* | | | 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 | /* * The following keeps state for Aqua dock icon bounce notification. */ static int tkMacOSXWmAttrNotifyVal = 0; /* * Declarations of static functions defined in this file: */ static NSRect InitialWindowBounds(TkWindow *winPtr, NSWindow *macWindow); static int ParseGeometry(Tcl_Interp *interp, char *string, TkWindow *winPtr); static void TopLevelEventProc(void *clientData, |
︙ | ︙ | |||
305 306 307 308 309 310 311 | Tcl_Obj *const objv[]); static int WmWithdrawCmd(Tk_Window tkwin, TkWindow *winPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); static void WmUpdateGeom(WmInfo *wmPtr, TkWindow *winPtr); static int WmWinStyle(Tcl_Interp *interp, TkWindow *winPtr, int objc, Tcl_Obj *const objv[]); | < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > < < < < < < < < < < | < < | < < < < < < < < < < < < < < < < < < < < | | 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 | Tcl_Obj *const objv[]); static int WmWithdrawCmd(Tk_Window tkwin, TkWindow *winPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); static void WmUpdateGeom(WmInfo *wmPtr, TkWindow *winPtr); static int WmWinStyle(Tcl_Interp *interp, TkWindow *winPtr, int objc, Tcl_Obj *const objv[]); static int WmWinAppearance(Tcl_Interp *interp, TkWindow *winPtr, int objc, Tcl_Obj *const objv[]); static void ApplyWindowAttributeFlagChanges(TkWindow *winPtr, NSWindow *macWindow, UInt64 oldAttributes, int oldFlags, int create, int initial); static void ApplyContainerOverrideChanges(TkWindow *winPtr, NSWindow *macWindow); static void GetMinSize(TkWindow *winPtr, int *minWidthPtr, int *minHeightPtr); static void GetMaxSize(TkWindow *winPtr, int *maxWidthPtr, int *maxHeightPtr); static void RemapWindows(TkWindow *winPtr, MacDrawable *parentWin); static void RemoveTransient(TkWindow *winPtr); #if MAC_OS_X_VERSION_MAX_ALLOWED > 101300 /* * Add a window as a tab in the group specified by its tabbingid, or * make it a standalone window if it is the only window with that * tabbingid. Adjust the window size if a tab bar appeared or * disappeared. */ static void placeAsTab(TKWindow *macWindow) { TkWindow *winPtr = NULL, *winPtr2 = NULL; TKWindow *target = NULL, *sibling = NULL; NSString *identifier = [macWindow tabbingIdentifier]; if (!wantsToBeTab(macWindow)) { [macWindow moveTabToNewWindow:NSApp]; [(TKWindow *)target tkLayoutChanged]; return; } for (NSWindow *window in [NSApp windows]) { if (window == macWindow) { continue; } if ([identifier isEqualTo: [window tabbingIdentifier]] && wantsToBeTab(window)) { target = (TKWindow*) window; syncLayout(target); break; } } syncLayout(macWindow); NSArray<NSWindow *> *tabs = [macWindow tabbedWindows]; if ([tabs count] == 2) { sibling = tabs[0] == macWindow ? (TKWindow *)tabs[1] : (TKWindow *)tabs[0]; syncLayout(sibling); winPtr2 = TkMacOSXGetTkWindow(sibling); } if (target) { CGFloat winHeight = [macWindow contentRectForFrameRect: [macWindow frame]].size.height; CGFloat winDelta = 0, targetHeight, targetDelta = 0; targetHeight = [target contentRectForFrameRect: [target frame]].size.height; [target addTabbedWindow:macWindow ordered:NSWindowAbove]; targetDelta = targetHeight - [target contentRectForFrameRect: [target frame]].size.height; winDelta = winHeight - [target contentRectForFrameRect: [target frame]].size.height; if (winDelta) { winPtr = TkMacOSXGetTkWindow(macWindow); XMoveResizeWindow(winPtr->display, winPtr->window, winPtr->changes.x, winPtr->changes.y, winPtr->changes.width, winPtr->changes.height + winDelta ); if (sibling) { winPtr = TkMacOSXGetTkWindow(sibling); XMoveResizeWindow(winPtr->display, winPtr->window, winPtr->changes.x, winPtr->changes.y, winPtr->changes.width, winPtr->changes.height - winDelta ); } } if (targetDelta) { winPtr = TkMacOSXGetTkWindow(target); XMoveResizeWindow(winPtr->display, winPtr->window, winPtr->changes.x, winPtr->changes.y, winPtr->changes.width, winPtr->changes.height + targetDelta ); } } else { CGFloat height = [macWindow contentRectForFrameRect: [macWindow frame]].size.height; [macWindow moveTabToNewWindow:NSApp]; CGFloat delta = height - [macWindow contentRectForFrameRect: [macWindow frame]].size.height; winPtr = TkMacOSXGetTkWindow(macWindow); XMoveResizeWindow(winPtr->display, winPtr->window, winPtr->changes.x, winPtr->changes.y, winPtr->changes.width, winPtr->changes.height + delta); if (winPtr2) { XMoveResizeWindow(winPtr2->display, winPtr2->window, winPtr2->changes.x, winPtr2->changes.y, winPtr2->changes.width, winPtr2->changes.height + delta ); } } } #endif #pragma mark NSWindow(TKWm) @implementation NSWindow(TKWm) #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 - (NSPoint) tkConvertPointToScreen: (NSPoint) point { return [self convertBaseToScreen:point]; } - (NSPoint) tkConvertPointFromScreen: (NSPoint)point { return [self convertScreenToBase:point]; } #else - (NSPoint) tkConvertPointToScreen: (NSPoint) point { NSRect pointrect = {point, {0,0}}; return [self convertRectToScreen:pointrect].origin; } - (NSPoint) tkConvertPointFromScreen: (NSPoint)point { NSRect pointrect = {point, {0,0}}; return [self convertRectFromScreen:pointrect].origin; } #endif @end #pragma mark - @implementation TKPanel: NSPanel @synthesize tkWindow = _tkWindow; - (void) tkLayoutChanged { syncLayout(self); } @end @implementation TKDrawerWindow: NSWindow @synthesize tkWindow = _tkWindow; @end @implementation TKWindow: NSWindow @synthesize tkWindow = _tkWindow; @end #pragma mark TKWindow(TKWm) @implementation TKWindow(TKWm) - (void) tkLayoutChanged { syncLayout(self); } #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 - (void)toggleTabBar:(id)sender { TkWindow *winPtr = TkMacOSXGetTkWindow(self); if (!winPtr) { return; } [super toggleTabBar:sender]; |
︙ | ︙ | |||
722 723 724 725 726 727 728 729 730 731 732 733 734 735 | wmPtr->flags = WM_NEVER_MAPPED; wmPtr->macClass = kDocumentWindowClass; wmPtr->attributes = macClassAttrs[kDocumentWindowClass].defaultAttrs; wmPtr->scrollWinPtr = NULL; wmPtr->menuPtr = NULL; wmPtr->window = nil; winPtr->wmInfoPtr = wmPtr; UpdateVRootGeometry(wmPtr); /* * Tk must monitor structure events for top-level windows, in order to * detect size and position changes caused by window managers. */ | > > | 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 | wmPtr->flags = WM_NEVER_MAPPED; wmPtr->macClass = kDocumentWindowClass; wmPtr->attributes = macClassAttrs[kDocumentWindowClass].defaultAttrs; wmPtr->scrollWinPtr = NULL; wmPtr->menuPtr = NULL; wmPtr->window = nil; winPtr->wmInfoPtr = wmPtr; // initialize wmPtr->NSWindowSubclass here UpdateVRootGeometry(wmPtr); /* * Tk must monitor structure events for top-level windows, in order to * detect size and position changes caused by window managers. */ |
︙ | ︙ | |||
1205 1206 1207 1208 1209 1210 1211 | return Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing); } if (Tcl_GetIndexFromObjStruct(interp, objv[1], optionStrings, sizeof(char *), "option", 0, &index) != TCL_OK) { return TCL_ERROR; } | < > > > > > > > > > | > > > > > > > > > > > > > > > | | | | 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 | return Tcl_GetBooleanFromObj(interp, objv[2], &wmTracing); } if (Tcl_GetIndexFromObjStruct(interp, objv[1], optionStrings, sizeof(char *), "option", 0, &index) != TCL_OK) { return TCL_ERROR; } if (objc < 3) { goto wrongNumArgs; } if (index == WMOPT_ATTRIBUTES && objc == 5 && strcmp(Tcl_GetString(objv[3]), "-class") == 0) { if (TkGetWindowFromObj(NULL, tkwin, objv[2], (Tk_Window *) &winPtr) == TCL_OK) { if (winPtr->wmInfoPtr->window != NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cannot change the class after the mac window is created.",-1)); Tcl_SetErrorCode(interp, "TK", "CLASS_CHANGE", NULL); return TCL_ERROR; } } else { winPtr = NULL; } } else if (index == WMOPT_ATTRIBUTES && objc == 5 && strcmp(Tcl_GetString(objv[3]), "-tabbingid") == 0) { if (TkGetWindowFromObj(NULL, tkwin, objv[2], (Tk_Window *) &winPtr) != TCL_OK) { winPtr = NULL; } } else if (index == WMOPT_ATTRIBUTES && objc == 5 && strcmp(Tcl_GetString(objv[3]), "-tabbingmode") == 0) { if (TkGetWindowFromObj(NULL, tkwin, objv[2], (Tk_Window *) &winPtr) != TCL_OK) { winPtr = NULL; } } else if (TkGetWindowFromObj(interp, tkwin, objv[2], (Tk_Window *) &winPtr) != TCL_OK) { return TCL_ERROR; } if (winPtr && !Tk_IsTopLevel(winPtr) && (index != WMOPT_MANAGE) && (index != WMOPT_FORGET)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "window \"%s\" isn't a top-level window", winPtr->pathName)); Tcl_SetErrorCode(interp, "TK", "LOOKUP", "TOPLEVEL", winPtr->pathName, NULL); return TCL_ERROR; } |
︙ | ︙ | |||
1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 | NSWindow *macWindow, Tcl_Interp *interp, /* Current interpreter */ WmAttribute attribute, /* Code of attribute to set */ Tcl_Obj *value) /* New value */ { WmInfo *wmPtr = winPtr->wmInfoPtr; int boolean; switch (attribute) { case WMATT_ALPHA: { double dval; if (Tcl_GetDoubleFromObj(interp, value, &dval) != TCL_OK) { return TCL_ERROR; } /* * The user should give (transparent) 0 .. 1.0 (opaque) */ if (dval < 0.0) { dval = 0.0; } else if (dval > 1.0) { dval = 1.0; } [macWindow setAlphaValue:dval]; break; } case WMATT_FULLSCREEN: if (Tcl_GetBooleanFromObj(interp, value, &boolean) != TCL_OK) { return TCL_ERROR; } if (boolean != (([macWindow styleMask] & NSFullScreenWindowMask) != 0)) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 | NSWindow *macWindow, Tcl_Interp *interp, /* Current interpreter */ WmAttribute attribute, /* Code of attribute to set */ Tcl_Obj *value) /* New value */ { WmInfo *wmPtr = winPtr->wmInfoPtr; int boolean; NSString *identifier; switch (attribute) { case WMATT_ALPHA: { double dval; if (Tcl_GetDoubleFromObj(interp, value, &dval) != TCL_OK) { return TCL_ERROR; } /* * The user should give (transparent) 0 .. 1.0 (opaque) */ if (dval < 0.0) { dval = 0.0; } else if (dval > 1.0) { dval = 1.0; } [macWindow setAlphaValue:dval]; break; } case WMATT_APPEARANCE: { int index; if (Tcl_GetIndexFromObjStruct(interp, value, appearanceStrings, sizeof(char *), "appearancename", 0, &index) != TCL_OK) { return TCL_ERROR; } switch ((enum appearances) index) { case APPEARANCE_AQUA: macWindow.appearance = [NSAppearance appearanceNamed: NSAppearanceNameAqua]; break; case APPEARANCE_DARKAQUA: #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 if (@available(macOS 10.14, *)) { macWindow.appearance = [NSAppearance appearanceNamed: NSAppearanceNameDarkAqua]; } #endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 break; default: macWindow.appearance = nil; } break; } case WMATT_BUTTONS: { windowButtonState state = {0}; Tcl_Obj **elements; Tcl_Size nElements, i; if (Tcl_ListObjGetElements(interp, value, &nElements, &elements) == TCL_OK) { int index = 0; for (i = 0; i < nElements; i++) { if (Tcl_GetIndexFromObjStruct(interp, elements[i], buttonNames, sizeof(char *), "window button name", 0, &index) != TCL_OK) { return TCL_ERROR; } else { state.intvalue |= (1 << index); } } } else if (Tcl_GetIntFromObj(interp, value, &state.intvalue) != TCL_OK) { return TCL_ERROR; } NSButton *closer = [macWindow standardWindowButton: NSWindowCloseButton]; NSButton *miniaturizer = [macWindow standardWindowButton: NSWindowMiniaturizeButton]; NSButton *zoomer = [macWindow standardWindowButton: NSWindowZoomButton]; closer.enabled = (state.bits.close != 0); miniaturizer.enabled = (state.bits.miniaturize != 0); zoomer.enabled = (state.bits.zoom != 0); break; } case WMATT_FULLSCREEN: if (Tcl_GetBooleanFromObj(interp, value, &boolean) != TCL_OK) { return TCL_ERROR; } if (boolean != (([macWindow styleMask] & NSFullScreenWindowMask) != 0)) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 |
︙ | ︙ | |||
1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 | } if (boolean) { request = [NSApp requestUserAttention:NSCriticalRequest]; } tkMacOSXWmAttrNotifyVal = boolean; } break; case WMATT_TITLEPATH: { const char *path = (const char *)Tcl_FSGetNativePath(value); NSString *filename = @""; if (path && *path) { filename = [NSString stringWithUTF8String:path]; } | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 | } if (boolean) { request = [NSApp requestUserAttention:NSCriticalRequest]; } tkMacOSXWmAttrNotifyVal = boolean; } break; case WMATT_STYLEMASK: { unsigned long styleMaskValue = 0; Tcl_Obj **elements; Tcl_Size nElements, i; if (Tcl_ListObjGetElements(interp, value, &nElements, &elements) == TCL_OK) { int index; for (i = 0; i < nElements; i++) { if (Tcl_GetIndexFromObjStruct(interp, elements[i], styleMaskBits, sizeof(styleMaskBit), "styleMask bit", 0, &index) != TCL_OK) { return TCL_ERROR; } else if (![macWindow isKindOfClass: [NSPanel class]] && styleMaskBits[index].allowed == NSWindowClass_panel) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "styleMask bit \"%s\" can only be used with an NSPanel", styleMaskBits[index].bitname)); Tcl_SetErrorCode(interp, "TK", "INVALID_STYLEMASK_BIT", NULL); return TCL_ERROR; } else { styleMaskValue |= styleMaskBits[index].bitvalue; } /* * Be sure not to change the fullscreen bit. */ styleMaskValue |= (NSWindowStyleMaskFullScreen & macWindow.styleMask); } /* * A resizable docmodal NSWindow or NSPanel does not work * correctly. It cannot be resized from the top edge. Other bits, * such as titled are ignored for docmodals. To be safe, we clear * all other bits when the docmodal bit is set. */ if (styleMaskValue & NSDocModalWindowMask) { styleMaskValue &= ~NSWindowStyleMaskResizable; } if ([macWindow isKindOfClass: [NSPanel class]]) { /* * We always make NSPanels titled, nonactivating utility windows, * even if these bits are not requested in the command. */ if (!(styleMaskValue & NSWindowStyleMaskTitled) ) { styleMaskValue |= NSWindowStyleMaskTitled; styleMaskValue |= NSWindowStyleMaskUtilityWindow; styleMaskValue |= NSWindowStyleMaskNonactivatingPanel; } } if (styleMaskValue & NSWindowStyleMaskFullSizeContentView) { macWindow.titlebarAppearsTransparent = YES; } else { macWindow.titlebarAppearsTransparent = NO; } } else { return TCL_ERROR; } NSRect oldFrame = [macWindow frame]; #ifdef DEBUG fprintf(stderr, "Current styleMask: %lx\n", [macWindow styleMask]); fprintf(stderr, "Setting styleMask to %lx\n", styleMaskValue); #endif macWindow.styleMask = (unsigned long) styleMaskValue; NSRect newFrame = [macWindow frame]; int heightDiff = newFrame.size.height - oldFrame.size.height; int newHeight = heightDiff < 0 ? newFrame.size.height : newFrame.size.height - heightDiff; [(TKWindow *)macWindow tkLayoutChanged]; if (heightDiff) { //Calling XMoveResizeWindow twice is a hack to force a relayout //of the window. XMoveResizeWindow(winPtr->display, winPtr->window, winPtr->changes.x, winPtr->changes.y, newFrame.size.width, newHeight - 1); XMoveResizeWindow(winPtr->display, winPtr->window, winPtr->changes.x, winPtr->changes.y, newFrame.size.width, newHeight); } break; } case WMATT_TABBINGID: { NSString *oldId = [macWindow tabbingIdentifier]; char *valueString; int length; if ([NSApp macOSVersion] < 101300) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Tabbing identifiers require macOS 10.13", TCL_INDEX_NONE)); Tcl_SetErrorCode(interp, "TK", "WM", "TABBINGID", NULL); return TCL_ERROR; } valueString = Tcl_GetStringFromObj(value, &length); identifier = [NSString stringWithUTF8String:valueString]; [macWindow setTabbingIdentifier: identifier]; /* * If the tabbingIdentifier of a tab is changed we move it into * the tab group with that identifier. */ if ([oldId compare:identifier] != NSOrderedSame) { placeAsTab((TKWindow *)macWindow); } break; } case WMATT_TABBINGMODE: { int index; tabbingMode mode; if (Tcl_GetIndexFromObjStruct(interp, value, tabbingModes, sizeof(tabbingMode), "NSWindow Tabbing Mode", 0, &index) != TCL_OK) { return TCL_ERROR; } mode = tabbingModes[index]; [macWindow setTabbingMode: mode.modeValue]; placeAsTab((TKWindow *)macWindow); break; } case WMATT_ISDARK: { break; } case WMATT_TITLEPATH: { const char *path = (const char *)Tcl_FSGetNativePath(value); NSString *filename = @""; if (path && *path) { filename = [NSString stringWithUTF8String:path]; } |
︙ | ︙ | |||
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 | oldFlags, 1, 0); [macWindow setBackgroundColor:boolean ? [NSColor clearColor] : nil]; [macWindow setOpaque:!boolean]; TkMacOSXInvalidateWindow((MacDrawable *)winPtr->window, TK_PARENT_WINDOW); } break; case WMATT_TYPE: TKLog(@"The type attribute is ignored on macOS."); break; case _WMATT_LAST_ATTRIBUTE: default: return TCL_ERROR; } | > > | 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 | oldFlags, 1, 0); [macWindow setBackgroundColor:boolean ? [NSColor clearColor] : nil]; [macWindow setOpaque:!boolean]; TkMacOSXInvalidateWindow((MacDrawable *)winPtr->window, TK_PARENT_WINDOW); } break; case WMATT_CLASS: break; case WMATT_TYPE: TKLog(@"The type attribute is ignored on macOS."); break; case _WMATT_LAST_ATTRIBUTE: default: return TCL_ERROR; } |
︙ | ︙ | |||
1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 | { Tcl_Obj *result = NULL; WmInfo *wmPtr = winPtr->wmInfoPtr; switch (attribute) { case WMATT_ALPHA: result = Tcl_NewDoubleObj([macWindow alphaValue]); break; case WMATT_FULLSCREEN: result = Tcl_NewBooleanObj([macWindow styleMask] & NSFullScreenWindowMask); break; case WMATT_MODIFIED: result = Tcl_NewBooleanObj([macWindow isDocumentEdited]); break; case WMATT_NOTIFY: result = Tcl_NewBooleanObj(tkMacOSXWmAttrNotifyVal); break; case WMATT_TITLEPATH: result = Tcl_NewStringObj([[macWindow representedFilename] UTF8String], TCL_INDEX_NONE); break; case WMATT_TOPMOST: result = Tcl_NewBooleanObj(wmPtr->flags & WM_TOPMOST); break; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 | { Tcl_Obj *result = NULL; WmInfo *wmPtr = winPtr->wmInfoPtr; switch (attribute) { case WMATT_ALPHA: result = Tcl_NewDoubleObj([macWindow alphaValue]); break; case WMATT_APPEARANCE: { #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 NSAppearanceName appearance; #else NSString *appearance; #endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 const char *resultString = "unrecognized"; appearance = macWindow.appearance.name; if (appearance == nil) { resultString = appearanceStrings[APPEARANCE_AUTO]; } else if (appearance == NSAppearanceNameAqua) { resultString = appearanceStrings[APPEARANCE_AQUA]; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 } else if (@available(macOS 10.14, *)) { if (appearance == NSAppearanceNameDarkAqua) { resultString = appearanceStrings[APPEARANCE_DARKAQUA]; } #endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 101400 } result = Tcl_NewStringObj(resultString, TCL_INDEX_NONE); break; } case WMATT_BUTTONS: { result = Tcl_NewListObj(3, NULL); if ([macWindow standardWindowButton:NSWindowCloseButton].enabled) { Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj("close", TCL_INDEX_NONE)); } if ([macWindow standardWindowButton:NSWindowMiniaturizeButton].enabled) { Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj("miniaturize", TCL_INDEX_NONE)); } if ([macWindow standardWindowButton:NSWindowZoomButton].enabled) { Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj("zoom", TCL_INDEX_NONE)); } break; } case WMATT_CLASS: if ([macWindow isKindOfClass:[NSPanel class]]) { result = Tcl_NewStringObj(subclassNames[subclassNSPanel], TCL_INDEX_NONE); } else { result = Tcl_NewStringObj(subclassNames[subclassNSWindow], TCL_INDEX_NONE); } break; case WMATT_FULLSCREEN: result = Tcl_NewBooleanObj([macWindow styleMask] & NSFullScreenWindowMask); break; case WMATT_ISDARK: result = Tcl_NewBooleanObj(TkMacOSXInDarkMode((Tk_Window)winPtr)); break; case WMATT_MODIFIED: result = Tcl_NewBooleanObj([macWindow isDocumentEdited]); break; case WMATT_NOTIFY: result = Tcl_NewBooleanObj(tkMacOSXWmAttrNotifyVal); break; case WMATT_STYLEMASK: { unsigned long styleMaskValue = [macWindow styleMask]; const styleMaskBit *bit; result = Tcl_NewListObj(9, NULL); for (bit = styleMaskBits; bit->bitname != NULL; bit++) { if (styleMaskValue & bit->bitvalue) { Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj(bit->bitname, TCL_INDEX_NONE)); } } break; } case WMATT_TABBINGID: result = Tcl_NewStringObj([[macWindow tabbingIdentifier] UTF8String], -1); break; case WMATT_TABBINGMODE: { long mode = [macWindow tabbingMode]; const char *name = "unrecognized"; for (const tabbingMode *m = tabbingModes; m->modeName != NULL; m++) { if (m->modeValue == mode) { name = m->modeName; break; } } result = Tcl_NewStringObj(name, TCL_INDEX_NONE); break; } case WMATT_TITLEPATH: result = Tcl_NewStringObj([[macWindow representedFilename] UTF8String], TCL_INDEX_NONE); break; case WMATT_TOPMOST: result = Tcl_NewBooleanObj(wmPtr->flags & WM_TOPMOST); break; |
︙ | ︙ | |||
1583 1584 1585 1586 1587 1588 1589 | * See the user documentation. * *---------------------------------------------------------------------- */ static int WmAttributesCmd( | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 | * See the user documentation. * *---------------------------------------------------------------------- */ static int WmAttributesCmd( TCL_UNUSED(Tk_Window), /* Main window of the application. */ TkWindow *winPtr, /* Toplevel to work with */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { int attribute = 0; NSWindow *macWindow; if (winPtr == NULL && objc == 5) { int index, isNew = 0, length; /* * If we are setting an atttribute of a future window, save the value * in a hash table so we can look it up when the window is actually * created. */ if (strcmp(Tcl_GetString(objv[3]), "-class") == 0) { if (Tcl_GetIndexFromObjStruct(interp, objv[4], subclassNames, sizeof(char *), "NSWindow subclass", 0, &index) != TCL_OK) { return TCL_ERROR; } Tcl_HashEntry *hPtr = Tcl_CreateHashEntry(&pathnameToSubclass, Tcl_GetString(objv[2]), &isNew); if (hPtr) { Tcl_SetHashValue(hPtr, INT2PTR(index)); return TCL_OK; } } else if (strcmp(Tcl_GetString(objv[3]), "-tabbingid") == 0) { char *identifier = Tcl_GetStringFromObj(objv[4], &length); char *value = ckalloc(length + 1); strncpy(value, identifier, length + 1); Tcl_HashEntry *hPtr = Tcl_CreateHashEntry(&pathnameToTabbingId, Tcl_GetString(objv[2]), &isNew); if (hPtr) { Tcl_SetHashValue(hPtr, value); return TCL_OK; } } else if (strcmp(Tcl_GetString(objv[3]), "-tabbingmode") == 0) { long value = NSWindowTabbingModeAutomatic; int modeIndex; if (Tcl_GetIndexFromObjStruct(interp, objv[4], tabbingModes, sizeof(tabbingMode), "NSWindow Tabbing Mode", 0, &modeIndex) == TCL_OK) { value = tabbingModes[modeIndex].modeValue; } Tcl_HashEntry *hPtr = Tcl_CreateHashEntry(&pathnameToTabbingMode, Tcl_GetString(objv[2]), &isNew); if (hPtr) { Tcl_SetHashValue(hPtr, value); return TCL_OK; } } } if (!winPtr) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Only -class, -tabbingid, or -tabbingmode can be set before the window exists.")); Tcl_SetErrorCode(interp, "TK", "NO_WINDOW", NULL); return TCL_ERROR; } if (winPtr && winPtr->window == None) { Tk_MakeWindowExist((Tk_Window)winPtr); } if (!TkMacOSXHostToplevelExists(winPtr)) { TkMacOSXMakeRealWindowExist(winPtr); } macWindow = TkMacOSXGetNSWindowForDrawable(winPtr->window); |
︙ | ︙ | |||
3093 3094 3095 3096 3097 3098 3099 | * See the user documentation. * *---------------------------------------------------------------------- */ static int WmOverrideredirectCmd( | | | 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 | * See the user documentation. * *---------------------------------------------------------------------- */ static int WmOverrideredirectCmd( TCL_UNUSED(Tk_Window), /* Main window of the application. */ TkWindow *winPtr, /* Toplevel to work with */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { int flag; XSetWindowAttributes atts; |
︙ | ︙ | |||
3119 3120 3121 3122 3123 3124 3125 | } if (Tcl_GetBooleanFromObj(interp, objv[3], &flag) != TCL_OK) { return TCL_ERROR; } atts.override_redirect = flag ? True : False; Tk_ChangeWindowAttributes((Tk_Window)winPtr, CWOverrideRedirect, &atts); | > > > > > > > | > | 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 | } if (Tcl_GetBooleanFromObj(interp, objv[3], &flag) != TCL_OK) { return TCL_ERROR; } atts.override_redirect = flag ? True : False; Tk_ChangeWindowAttributes((Tk_Window)winPtr, CWOverrideRedirect, &atts); if ([NSApp macOSVersion] >= 101300) { if (flag) { win.styleMask |= NSWindowStyleMaskDocModalWindow; } else { win.styleMask &= ~NSWindowStyleMaskDocModalWindow; } } else { ApplyContainerOverrideChanges(winPtr, win); } return TCL_OK; } /* *---------------------------------------------------------------------- * * WmPositionfromCmd -- |
︙ | ︙ | |||
5668 5669 5670 5671 5672 5673 5674 | TkUnsupported1ObjCmd( void *clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { static const char *const subcmds[] = { | | | | 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 | TkUnsupported1ObjCmd( void *clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { static const char *const subcmds[] = { "appearance", "isdark", "style", NULL }; enum SubCmds { TKMWS_APPEARANCE, TKMWS_ISDARK, TKMWS_STYLE }; Tk_Window tkwin = (Tk_Window)clientData; TkWindow *winPtr; int index; if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, "option window ?arg ...?"); |
︙ | ︙ | |||
5705 5706 5707 5708 5709 5710 5711 | switch((enum SubCmds) index) { case TKMWS_STYLE: if ((objc < 3) || (objc > 5)) { Tcl_WrongNumArgs(interp, 2, objv, "window ?class attributes?"); return TCL_ERROR; } return WmWinStyle(interp, winPtr, objc, objv); | < < < < < < < < < < < < | 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 | switch((enum SubCmds) index) { case TKMWS_STYLE: if ((objc < 3) || (objc > 5)) { Tcl_WrongNumArgs(interp, 2, objv, "window ?class attributes?"); return TCL_ERROR; } return WmWinStyle(interp, winPtr, objc, objv); case TKMWS_APPEARANCE: if ([NSApp macOSVersion] < 100900) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Window appearances did not exist until OSX 10.9.", TCL_INDEX_NONE)); Tcl_SetErrorCode(interp, "TK", "WINDOWSTYLE", "APPEARANCE", NULL); return TCL_ERROR; } |
︙ | ︙ | |||
5936 5937 5938 5939 5940 5941 5942 | return TCL_OK; } /* *---------------------------------------------------------------------- * | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 | return TCL_OK; } /* *---------------------------------------------------------------------- * * WmWinAppearance -- * * This procedure is invoked to process the * "::tk::unsupported::MacWindowStyle appearance" subcommand. The command * allows you to get or set the appearance for the NSWindow associated * with a Tk Window. The syntax is: * |
︙ | ︙ | |||
6059 6060 6061 6062 6063 6064 6065 | #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1090 (void) interp; (void) winPtr; (void) objc; (void) objv; return TCL_OK; #else | < < < < < < | 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 | #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1090 (void) interp; (void) winPtr; (void) objc; (void) objv; return TCL_OK; #else Tcl_Obj *result = NULL; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 NSAppearanceName appearance; #else NSString *appearance; #endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 101300 |
︙ | ︙ | |||
6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 | void TkMacOSXMakeRealWindowExist( TkWindow *winPtr) /* Tk window. */ { WmInfo *wmPtr = winPtr->wmInfoPtr; MacDrawable *macWin; WindowClass macClass; Bool overrideRedirect = Tk_Attributes((Tk_Window)winPtr)->override_redirect; if (TkMacOSXHostToplevelExists(winPtr)) { return; } macWin = (MacDrawable *)winPtr->window; | > > > > > > > | 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 | void TkMacOSXMakeRealWindowExist( TkWindow *winPtr) /* Tk window. */ { WmInfo *wmPtr = winPtr->wmInfoPtr; MacDrawable *macWin; WindowClass macClass; Class winClass = nil; Bool overrideRedirect = Tk_Attributes((Tk_Window)winPtr)->override_redirect; Tcl_HashEntry *hPtr = NULL; NSUInteger styleMask; NSString *identifier; char *tabbingId = NULL; long tabbingMode = NSWindowTabbingModeAutomatic; static int initialized = 0; if (TkMacOSXHostToplevelExists(winPtr)) { return; } macWin = (MacDrawable *)winPtr->window; |
︙ | ︙ | |||
6214 6215 6216 6217 6218 6219 6220 | return; /* * TODO: Here we should handle out of process embedding. */ } | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | | | | | | | | | | | | | | | | | | | > > > > > > > > > > > | 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 | return; /* * TODO: Here we should handle out of process embedding. */ } if ([NSApp macOSVersion] >= 101300) { /* * Prior to macOS 10.12 the styleMask was readonly. From macOS 10.12 * onward, the styleMask can replace the Carbon window classes and * attributes. */ int index; if (!initialized) { Tcl_InitHashTable(&pathnameToSubclass, TCL_STRING_KEYS); Tcl_InitHashTable(&pathnameToTabbingId, TCL_STRING_KEYS); Tcl_InitHashTable(&pathnameToTabbingMode, TCL_STRING_KEYS); initialized = 1; } hPtr = Tcl_FindHashEntry(&pathnameToSubclass, Tk_PathName(winPtr)); index = hPtr ? PTR2INT(Tcl_GetHashValue(hPtr)) : subclassNSWindow; switch(index) { case subclassNSPanel: winClass = [TKPanel class]; styleMask = (NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskUtilityWindow | NSWindowStyleMaskNonactivatingPanel ); break; default: winClass = [TKWindow class]; styleMask = (NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable ); break; } if (overrideRedirect) { styleMask |= NSWindowStyleMaskDocModalWindow; } /* Help windows (used for tooltips) should have stylemask 0. */ if (wmPtr->macClass == kHelpWindowClass) { styleMask = 0; } if (hPtr) { Tcl_DeleteHashEntry(hPtr); } hPtr = Tcl_FindHashEntry(&pathnameToTabbingId, Tk_PathName(winPtr)); if (hPtr) { tabbingId = Tcl_GetHashValue(hPtr); Tcl_DeleteHashEntry(hPtr); ckfree(tabbingId); } hPtr = Tcl_FindHashEntry(&pathnameToTabbingMode, Tk_PathName(winPtr)); if (hPtr) { tabbingMode = PTR2INT(Tcl_GetHashValue(hPtr)); Tcl_DeleteHashEntry(hPtr); } } else { /* * If this is an override-redirect window, the NSWindow is created first as * a document window then converted to a simple window. */ if (overrideRedirect) { wmPtr->macClass = kDocumentWindowClass; } macClass = wmPtr->macClass; wmPtr->attributes &= (tkAlwaysValidAttributes | macClassAttrs[macClass].validAttrs); wmPtr->flags |= macClassAttrs[macClass].flags | ((wmPtr->attributes & kWindowResizableAttribute) ? 0 : WM_WIDTH_NOT_RESIZABLE|WM_HEIGHT_NOT_RESIZABLE); UInt64 attributes = (wmPtr->attributes & ~macClassAttrs[macClass].forceOffAttrs) | macClassAttrs[macClass].forceOnAttrs; styleMask = macClassAttrs[macClass].styleMask | ((attributes & kWindowNoTitleBarAttribute) ? 0 : NSTitledWindowMask) | ((attributes & kWindowCloseBoxAttribute) ? NSClosableWindowMask : 0) | ((attributes & kWindowCollapseBoxAttribute) ? NSMiniaturizableWindowMask : 0) | ((attributes & kWindowResizableAttribute) ? NSResizableWindowMask : 0) | ((attributes & kWindowMetalAttribute) ? NSTexturedBackgroundWindowMask : 0) | ((attributes & kWindowUnifiedTitleAndToolbarAttribute) ? NSUnifiedTitleAndToolbarWindowMask : 0) | ((attributes & kWindowSideTitlebarAttribute) ? 1 << 9 : 0) | (attributes >> WM_NSMASK_SHIFT); winClass = (macClass == kDrawerWindowClass ? [TKDrawerWindow class] : (styleMask & (NSUtilityWindowMask|NSDocModalWindowMask| NSNonactivatingPanelMask|NSHUDWindowMask)) ? [TKPanel class] : [TKWindow class]); } NSRect structureRect = [winClass frameRectForContentRect:NSZeroRect styleMask:styleMask]; NSRect contentRect = NSMakeRect(5 - structureRect.origin.x, TkMacOSXZeroScreenHeight() - (TkMacOSXZeroScreenTop() + 5 + structureRect.origin.y + structureRect.size.height + 200), 200, 200); if (wmPtr->hints.initial_state == WithdrawnState) { //// ??????? } TKWindow *window = [[winClass alloc] initWithContentRect:contentRect styleMask:styleMask backing:NSBackingStoreBuffered defer:YES]; if (!window) { Tcl_Panic("couldn't allocate new Mac window"); } #if MAC_OS_X_VERSION_MAX_ALLOWED > 101200 if (tabbingId) { identifier = [NSString stringWithUTF8String:tabbingId]; } else { identifier = [NSString stringWithUTF8String:Tk_PathName(winPtr)]; } [window setTabbingIdentifier: identifier]; [window setTabbingMode: tabbingMode]; #endif TKContentView *contentView = [[TKContentView alloc] initWithFrame:NSZeroRect]; [window setContentView:contentView]; [contentView release]; [window setDelegate:NSApp]; [window setAcceptsMouseMovedEvents:NO]; [window setReleasedWhenClosed:NO]; |
︙ | ︙ | |||
6295 6296 6297 6298 6299 6300 6301 | macWin->flags |= TK_HOST_EXISTS; if (overrideRedirect) { XSetWindowAttributes atts; atts.override_redirect = True; Tk_ChangeWindowAttributes((Tk_Window)winPtr, CWOverrideRedirect, &atts); | > > > | > | 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 | macWin->flags |= TK_HOST_EXISTS; if (overrideRedirect) { XSetWindowAttributes atts; atts.override_redirect = True; Tk_ChangeWindowAttributes((Tk_Window)winPtr, CWOverrideRedirect, &atts); if ([NSApp macOSVersion] >= 101300) { window.styleMask |= NSWindowStyleMaskDocModalWindow; } else { ApplyContainerOverrideChanges(winPtr, NULL); } } [window display]; } /* *---------------------------------------------------------------------- * |
︙ | ︙ |
Changes to macosx/ttkMacOSXTheme.c.
︙ | ︙ | |||
258 259 260 261 262 263 264 265 266 267 268 269 270 271 | break; case TkInlineButton: bounds.size.height -= 4; bounds.origin.y += 1; break; case TkRecessedButton: bounds.size.height -= 2; break; case kThemeRoundButtonHelp: if (isDark) { bounds.size.height = bounds.size.width = 22; } else { bounds.size.height = bounds.size.width = 22; } | > > > | 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 | break; case TkInlineButton: bounds.size.height -= 4; bounds.origin.y += 1; break; case TkRecessedButton: bounds.size.height -= 2; break; case TkSidebarButton: bounds.size.height += 8; break; case kThemeRoundButtonHelp: if (isDark) { bounds.size.height = bounds.size.width = 22; } else { bounds.size.height = bounds.size.width = 22; } |
︙ | ︙ | |||
1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 | break; case TkInlineButton: DrawGrayButton(context, bounds, &inlineDesign, state, tkwin); break; case TkRecessedButton: DrawGrayButton(context, bounds, &recessedDesign, state, tkwin); break; case kThemeRoundedBevelButton: DrawGrayButton(context, bounds, &bevelDesign, state, tkwin); break; case kThemePushButton: /* * The TTK_STATE_ALTERNATE bit means -default active. Apple only | > > > | 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 | break; case TkInlineButton: DrawGrayButton(context, bounds, &inlineDesign, state, tkwin); break; case TkRecessedButton: DrawGrayButton(context, bounds, &recessedDesign, state, tkwin); break; case TkSidebarButton: DrawGrayButton(context, bounds, &sidebarDesign, state, tkwin); break; case kThemeRoundedBevelButton: DrawGrayButton(context, bounds, &bevelDesign, state, tkwin); break; case kThemePushButton: /* * The TTK_STATE_ALTERNATE bit means -default active. Apple only |
︙ | ︙ | |||
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 | ComputeButtonDrawInfo(params, 0, tkwin); static const CGRect scratchBounds = {{0, 0}, {100, 100}}; CGRect contentBounds, backgroundBounds; int verticalPad; ButtonElementMinSize(clientData, minWidth, minHeight); switch (info.kind) { case TkGradientButton: *paddingPtr = Ttk_MakePadding(1, 1, 1, 1); /* Fall through. */ case kThemeArrowButton: case kThemeRoundButtonHelp: return; /* Buttons which are sized like PushButtons but unknown to HITheme. */ | > > > | 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 | ComputeButtonDrawInfo(params, 0, tkwin); static const CGRect scratchBounds = {{0, 0}, {100, 100}}; CGRect contentBounds, backgroundBounds; int verticalPad; ButtonElementMinSize(clientData, minWidth, minHeight); switch (info.kind) { case TkSidebarButton: *paddingPtr = Ttk_MakePadding(30, 10, 30, 10); return; case TkGradientButton: *paddingPtr = Ttk_MakePadding(1, 1, 1, 1); /* Fall through. */ case kThemeArrowButton: case kThemeRoundButtonHelp: return; /* Buttons which are sized like PushButtons but unknown to HITheme. */ |
︙ | ︙ | |||
1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 | /* * Buttons with no height restrictions are ready to draw. */ case kThemeArrowButton: case kThemeCheckBox: case kThemeRadioButton: break; /* * Other buttons have a maximum height. We have to deal with that. */ default: | > | 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 | /* * Buttons with no height restrictions are ready to draw. */ case kThemeArrowButton: case kThemeCheckBox: case kThemeRadioButton: case TkSidebarButton: break; /* * Other buttons have a maximum height. We have to deal with that. */ default: |
︙ | ︙ | |||
3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 | /* Recessed Button - text only radio button */ TTK_LAYOUT("RecessedButton", TTK_GROUP("RecessedButton.button", TTK_FILL_BOTH, TTK_GROUP("Button.padding", TTK_FILL_BOTH, TTK_NODE("Button.label", TTK_FILL_BOTH)))) /* DisclosureButton (not a triangle) -- No label, no border*/ TTK_LAYOUT("DisclosureButton", TTK_NODE("DisclosureButton.button", TTK_FILL_BOTH)) /* HelpButton -- No label, no border*/ TTK_LAYOUT("HelpButton", | > > > > > > > | 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 | /* Recessed Button - text only radio button */ TTK_LAYOUT("RecessedButton", TTK_GROUP("RecessedButton.button", TTK_FILL_BOTH, TTK_GROUP("Button.padding", TTK_FILL_BOTH, TTK_NODE("Button.label", TTK_FILL_BOTH)))) /* Sidebar Button - text only radio button for sidebars */ TTK_LAYOUT("SidebarButton", TTK_GROUP("SidebarButton.button", TTK_FILL_BOTH, TTK_GROUP("Button.padding", TTK_FILL_BOTH, TTK_NODE("Button.label", TTK_FILL_BOTH)))) /* DisclosureButton (not a triangle) -- No label, no border*/ TTK_LAYOUT("DisclosureButton", TTK_NODE("DisclosureButton.button", TTK_FILL_BOTH)) /* HelpButton -- No label, no border*/ TTK_LAYOUT("HelpButton", |
︙ | ︙ | |||
3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 | &ButtonElementSpec, &RoundedRectButtonParams); Ttk_RegisterElementSpec(themePtr, "Checkbutton.button", &ButtonElementSpec, &CheckBoxParams); Ttk_RegisterElementSpec(themePtr, "Radiobutton.button", &ButtonElementSpec, &RadioButtonParams); Ttk_RegisterElementSpec(themePtr, "RecessedButton.button", &ButtonElementSpec, &RecessedButtonParams); Ttk_RegisterElementSpec(themePtr, "Toolbutton.border", &ButtonElementSpec, &BevelButtonParams); Ttk_RegisterElementSpec(themePtr, "Menubutton.button", &ButtonElementSpec, &PopupButtonParams); Ttk_RegisterElementSpec(themePtr, "DisclosureButton.button", &ButtonElementSpec, &DisclosureButtonParams); Ttk_RegisterElementSpec(themePtr, "HelpButton.button", | > > | 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 | &ButtonElementSpec, &RoundedRectButtonParams); Ttk_RegisterElementSpec(themePtr, "Checkbutton.button", &ButtonElementSpec, &CheckBoxParams); Ttk_RegisterElementSpec(themePtr, "Radiobutton.button", &ButtonElementSpec, &RadioButtonParams); Ttk_RegisterElementSpec(themePtr, "RecessedButton.button", &ButtonElementSpec, &RecessedButtonParams); Ttk_RegisterElementSpec(themePtr, "SidebarButton.button", &ButtonElementSpec, &SidebarButtonParams); Ttk_RegisterElementSpec(themePtr, "Toolbutton.border", &ButtonElementSpec, &BevelButtonParams); Ttk_RegisterElementSpec(themePtr, "Menubutton.button", &ButtonElementSpec, &PopupButtonParams); Ttk_RegisterElementSpec(themePtr, "DisclosureButton.button", &ButtonElementSpec, &DisclosureButtonParams); Ttk_RegisterElementSpec(themePtr, "HelpButton.button", |
︙ | ︙ |
Changes to macosx/ttkMacOSXTheme.h.
︙ | ︙ | |||
297 298 299 300 301 302 303 304 305 306 307 308 309 310 | { .light = {.face = 256.0, .top = 256.0, .side = 256.0, .bottom = 256.0}, .dark = {.face = 256.0, .top = 256.0, .side = 256.0, .bottom = 256.0}, .onBits = 0, .offBits = 0 } } }; static const ButtonDesign incdecDesign = { .radius = 5.0, .palettes = { { .light = {.face = 246.0, .top = 236.0, .side = 227.0, .bottom = 213.0}, .dark = {.face = 80.0, .top = 90.0, .side = 80.0, .bottom = 49.0}, | > > > > > > > > > > > > > > > > > > > > > | 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 | { .light = {.face = 256.0, .top = 256.0, .side = 256.0, .bottom = 256.0}, .dark = {.face = 256.0, .top = 256.0, .side = 256.0, .bottom = 256.0}, .onBits = 0, .offBits = 0 } } }; static const ButtonDesign sidebarDesign = { .radius = 8.0, .palettes = { { .light = {.face = 210.0, .top = 210.0, .side = 210.0, .bottom = 210.0}, .dark = {.face = 129.0, .top = 129.0, .side = 129.0, .bottom = 129.0}, .onBits = TTK_STATE_SELECTED, .offBits = 0 }, { .light = {.face = 210.0, .top = 210.0, .side = 210.0, .bottom = 210.0}, .dark = {.face = 129.0, .top = 129.0, .side = 129.0, .bottom = 129.0}, .onBits = TTK_STATE_PRESSED, .offBits = 0 }, { .light = {.face = 256.0, .top = 256.0, .side = 256.0, .bottom = 256.0}, .dark = {.face = 256.0, .top = 256.0, .side = 256.0, .bottom = 256.0}, .onBits = 0, .offBits = 0 } } }; static const ButtonDesign incdecDesign = { .radius = 5.0, .palettes = { { .light = {.face = 246.0, .top = 236.0, .side = 227.0, .bottom = 213.0}, .dark = {.face = 80.0, .top = 90.0, .side = 80.0, .bottom = 49.0}, |
︙ | ︙ | |||
470 471 472 473 474 475 476 477 478 479 480 481 482 483 | * Our enums for button styles not known to HIToolbox. */ #define TkGradientButton 0x8001 #define TkRoundedRectButton 0x8002 #define TkRecessedButton 0x8003 #define TkInlineButton 0x8004 /* * The struct passed as clientData when drawing Ttk buttons. */ typedef struct { ThemeButtonKind kind; ThemeMetric heightMetric; | > | 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 | * Our enums for button styles not known to HIToolbox. */ #define TkGradientButton 0x8001 #define TkRoundedRectButton 0x8002 #define TkRecessedButton 0x8003 #define TkInlineButton 0x8004 #define TkSidebarButton 0x8005 /* * The struct passed as clientData when drawing Ttk buttons. */ typedef struct { ThemeButtonKind kind; ThemeMetric heightMetric; |
︙ | ︙ | |||
505 506 507 508 509 510 511 | ListHeaderParams = {kThemeListHeaderButton, kThemeMetricListHeaderHeight, NoThemeMetric}, GradientButtonParams = {TkGradientButton, NoThemeMetric, NoThemeMetric}, RoundedRectButtonParams = {TkRoundedRectButton, kThemeMetricPushButtonHeight, NoThemeMetric}, RecessedButtonParams = {TkRecessedButton, kThemeMetricPushButtonHeight, NoThemeMetric}, | > | < | 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 | ListHeaderParams = {kThemeListHeaderButton, kThemeMetricListHeaderHeight, NoThemeMetric}, GradientButtonParams = {TkGradientButton, NoThemeMetric, NoThemeMetric}, RoundedRectButtonParams = {TkRoundedRectButton, kThemeMetricPushButtonHeight, NoThemeMetric}, RecessedButtonParams = {TkRecessedButton, kThemeMetricPushButtonHeight, NoThemeMetric}, SidebarButtonParams = {TkSidebarButton, NoThemeMetric, NoThemeMetric}, InlineButtonParams = {TkInlineButton, kThemeMetricPushButtonHeight, NoThemeMetric}; /* * Others: kThemeDisclosureRight, kThemeDisclosureDown, * kThemeDisclosureLeft */ /* |
︙ | ︙ |
Changes to tests/event.test.
︙ | ︙ | |||
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 | set EnterBind [bind . <Enter>] } -body { wm geometry . 200x200+300+300 wm deiconify . _pause 200 toplevel .top2 -width 200 -height 200 wm geometry .top2 +[expr {[winfo rootx .]+50}]+[expr {[winfo rooty .]+50}] wm deiconify .top2 raise .top2 _pause 400 event generate .top2 <Motion> -warp 1 -x 50 -y 50 _pause 100 bind . <Enter> {lappend res %W} set res [list ] destroy .top2 _pause 200 set res } -cleanup { deleteWindows bind . <Enter> $EnterBind } -result {.} test event-9.2 {enter toplevel window by destroying a toplevel - bug b1d115fa60} -setup { set iconified false if {[winfo ismapped .]} { wm iconify . update set iconified true } } -body { toplevel .top1 wm geometry .top1 200x200+300+300 wm deiconify .top1 _pause 200 toplevel .top2 -width 200 -height 200 wm geometry .top2 +[expr {[winfo rootx .top1]+50}]+[expr {[winfo rooty .top1]+50}] wm deiconify .top2 raise .top2 _pause 400 event generate .top2 <Motion> -warp 1 -x 50 -y 50 _pause 100 bind .top1 <Enter> {lappend res %W} set res [list ] destroy .top2 | > > > > > | 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 | set EnterBind [bind . <Enter>] } -body { wm geometry . 200x200+300+300 wm deiconify . _pause 200 toplevel .top2 -width 200 -height 200 wm geometry .top2 +[expr {[winfo rootx .]+50}]+[expr {[winfo rooty .]+50}] update idletasks wm deiconify .top2 update idletasks raise .top2 _pause 400 event generate .top2 <Motion> -warp 1 -x 50 -y 50 _pause 100 bind . <Enter> {lappend res %W} set res [list ] destroy .top2 update idletasks _pause 200 set res } -cleanup { deleteWindows bind . <Enter> $EnterBind } -result {.} test event-9.2 {enter toplevel window by destroying a toplevel - bug b1d115fa60} -setup { set iconified false if {[winfo ismapped .]} { wm iconify . update set iconified true } } -body { toplevel .top1 wm geometry .top1 200x200+300+300 wm deiconify .top1 _pause 200 toplevel .top2 -width 200 -height 200 wm geometry .top2 +[expr {[winfo rootx .top1]+50}]+[expr {[winfo rooty .top1]+50}] update idletasks wm deiconify .top2 update idletasks raise .top2 _pause 400 event generate .top2 <Motion> -warp 1 -x 50 -y 50 _pause 100 bind .top1 <Enter> {lappend res %W} set res [list ] destroy .top2 |
︙ | ︙ |
Changes to tests/unixWm.test.
︙ | ︙ | |||
2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 | [winfo rooty .raise1]] destroy .raise1 list $result [winfo containing [winfo rootx .raise2] \ [winfo rooty .raise2]] } {.raise1 .raise3} deleteWindows test unixWm-51.6 {TkWmRestackToplevel procedure, window to be stacked isn't mapped} unix { destroy .t toplevel .t -width 200 -height 200 -bg green tkwait visibility .t wm geometry .t +0+0 update restackDelay destroy .t2 toplevel .t2 -width 200 -height 200 -bg red | > > | 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 | [winfo rooty .raise1]] destroy .raise1 list $result [winfo containing [winfo rootx .raise2] \ [winfo rooty .raise2]] } {.raise1 .raise3} deleteWindows test unixWm-51.6 {TkWmRestackToplevel procedure, window to be stacked isn't mapped} unix { wm geometry . +300+300 destroy .t update idletasks toplevel .t -width 200 -height 200 -bg green tkwait visibility .t wm geometry .t +0+0 update restackDelay destroy .t2 toplevel .t2 -width 200 -height 200 -bg red |
︙ | ︙ | |||
2526 2527 2528 2529 2530 2531 2532 | # # wm attributes tests: # # NOTE: since [wm attributes] is not guaranteed to have any effect, # the only thing we can really test here is the syntax. # if {[tk windowingsystem] eq "aqua"} { | < | < | 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 | # # wm attributes tests: # # NOTE: since [wm attributes] is not guaranteed to have any effect, # the only thing we can really test here is the syntax. # if {[tk windowingsystem] eq "aqua"} { set result_60_1 {-alpha 1.0 -appearance auto -buttons {close miniaturize zoom} -fullscreen 0 -isdark 0 -modified 0 -notify 0 -titlepath {} -topmost 0 -transparent 0 -stylemask {titled closable miniaturizable resizable} -class nswindow -tabbingid .t -tabbingmode auto -type unsupported} } else { set result_60_1 {-alpha 1.0 -fullscreen 0 -topmost 0 -type {} -zoomed 0} } test unixWm-60.1 {wm attributes - test} -constraints unix -body { destroy .t toplevel .t wm attributes .t |
︙ | ︙ |
Changes to tests/wm.test.
︙ | ︙ | |||
200 201 202 203 204 205 206 207 208 | } -result {wrong # args: should be "wm attributes window ?-alpha ?double?? ?-transparentcolor ?color?? ?-disabled ?bool?? ?-fullscreen ?bool?? ?-toolwindow ?bool?? ?-topmost ?bool??"} test wm-attributes-1.2.3 {usage} -constraints win -returnCodes error -body { wm attributes . -to } -result {bad attribute "-to": must be -alpha, -disabled, -fullscreen, -toolwindow, -topmost, or -transparentcolor} test wm-attributes-1.2.4 {usage} -constraints {unix notAqua} -returnCodes error -body { wm attributes . _ } -result {bad attribute "_": must be -alpha, -fullscreen, -topmost, -type, or -zoomed} test wm-attributes-1.2.5 {usage} -constraints aqua -returnCodes error -body { wm attributes . _ | > > > < | | 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | } -result {wrong # args: should be "wm attributes window ?-alpha ?double?? ?-transparentcolor ?color?? ?-disabled ?bool?? ?-fullscreen ?bool?? ?-toolwindow ?bool?? ?-topmost ?bool??"} test wm-attributes-1.2.3 {usage} -constraints win -returnCodes error -body { wm attributes . -to } -result {bad attribute "-to": must be -alpha, -disabled, -fullscreen, -toolwindow, -topmost, or -transparentcolor} test wm-attributes-1.2.4 {usage} -constraints {unix notAqua} -returnCodes error -body { wm attributes . _ } -result {bad attribute "_": must be -alpha, -fullscreen, -topmost, -type, or -zoomed} if {[tk windowingsystem] eq "aqua"} { set result_1_2_5 {bad attribute "_": must be -alpha, -appearance, -buttons, -fullscreen, -isdark, -modified, -notify, -titlepath, -topmost, -transparent, -stylemask, -class, -tabbingid, -tabbingmode, or -type} } else {set result_1_2_5 {bad attribute "_": must be -alpha, -fullscreen, -modified, -notify, -titlepath, -topmost, -transparent, or -type}} test wm-attributes-1.2.5 {usage} -constraints aqua -returnCodes error -body { wm attributes . _ } -result $result_1_2_5 ### wm client ### test wm-client-1.1 {usage} -returnCodes error -body { wm client } -result {wrong # args: should be "wm option window ?arg ...?"} test wm-client-1.2 {usage} -returnCodes error -body { wm client . _ _ |
︙ | ︙ |