|
|
1.1 root 1: # tk.tcl --
2: #
3: # Initialization script normally executed in the interpreter for each
4: # Tk-based application. Arranges class bindings for widgets.
5: #
6: # $Header: /user6/ouster/wish/scripts/RCS/tk.tcl,v 1.19 92/08/08 14:50:08 ouster Exp $ SPRITE (Berkeley)
7: #
8: # Copyright 1992 Regents of the University of California
9: # Permission to use, copy, modify, and distribute this
10: # software and its documentation for any purpose and without
11: # fee is hereby granted, provided that this copyright
12: # notice appears in all copies. The University of California
13: # makes no representations about the suitability of this
14: # software for any purpose. It is provided "as is" without
15: # express or implied warranty.
16:
17: # Insist on running with a compatible version of Tcl.
18:
19: if "[info tclversion] != {6.4}" {
20: error "wrong version of Tcl loaded ([info tclversion]): need 6.4"
21: }
22:
23: # Initialize the auto-load path to include Tk's directory as well as
24: # Tcl's directory:
25:
26: set auto_path "$tk_library [info library]"
27:
28: # Turn off strict Motif look and feel as a default.
29:
30: set tk_strictMotif 0
31:
32: # ----------------------------------------------------------------------
33: # Class bindings for various flavors of button widgets. $tk_priv(window)
34: # keeps track of the button containing the mouse, and $tk_priv(relief)
35: # saves the original relief of the button so it can be restored when
36: # the mouse button is released.
37: # ----------------------------------------------------------------------
38:
39: bind Button <Any-Enter> {tk_butEnter %W}
40: bind Button <Any-Leave> {tk_butLeave %W}
41: bind Button <1> {tk_butDown %W}
42: bind Button <ButtonRelease-1> {tk_butUp %W}
43:
44: bind CheckButton <Any-Enter> {tk_butEnter %W}
45: bind CheckButton <Any-Leave> {tk_butLeave %W}
46: bind CheckButton <1> {tk_butDown %W}
47: bind CheckButton <ButtonRelease-1> {tk_butUp %W}
48:
49: bind RadioButton <Any-Enter> {tk_butEnter %W}
50: bind RadioButton <Any-Leave> {tk_butLeave %W}
51: bind RadioButton <1> {tk_butDown %W}
52: bind RadioButton <ButtonRelease-1> {tk_butUp %W}
53:
54: # ----------------------------------------------------------------------
55: # Class bindings for entry widgets.
56: # ----------------------------------------------------------------------
57:
58: bind Entry <1> {
59: %W cursor @%x
60: %W select from @%x
61: if {[lindex [%W config -state] 4] == "normal"} {focus %W}
62: }
63: bind Entry <B1-Motion> {%W select to @%x}
64: bind Entry <Shift-1> {%W select adjust @%x}
65: bind Entry <Shift-B1-Motion> {%W select to @%x}
66: bind Entry <2> {%W scan mark %x}
67: bind Entry <B2-Motion> {%W scan dragto %x}
68: bind Entry <Any-KeyPress> {
69: if {"%A" != ""} {
70: %W insert cursor %A
71: tk_entrySeeCaret %W
72: }
73: }
74: bind Entry <Delete> {tk_entryBackspace %W; tk_entrySeeCaret %W}
75: bind Entry <BackSpace> {tk_entryBackspace %W; tk_entrySeeCaret %W}
76: bind Entry <Control-h> {tk_entryBackspace %W; tk_entrySeeCaret %W}
77: bind Entry <Control-d> {%W delete sel.first sel.last; tk_entrySeeCaret %W}
78: bind Entry <Control-u> {%W delete 0 end}
79: bind Entry <Control-v> {%W insert cursor [selection get]; tk_entrySeeCaret %W}
80: bind Entry <Control-w> {tk_entryBackword %W; tk_entrySeeCaret %W}
81: tk_bindForTraversal Entry
82:
83: # ----------------------------------------------------------------------
84: # Class bindings for listbox widgets.
85: # ----------------------------------------------------------------------
86:
87: bind Listbox <1> {%W select from [%W nearest %y]}
88: bind Listbox <B1-Motion> {%W select to [%W nearest %y]}
89: bind Listbox <Shift-1> {%W select adjust [%W nearest %y]}
90: bind Listbox <Shift-B1-Motion> {%W select to [%W nearest %y]}
91: bind Listbox <2> {%W scan mark %x %y}
92: bind Listbox <B2-Motion> {%W scan dragto %x %y}
93:
94: # ----------------------------------------------------------------------
95: # Class bindings for scrollbar widgets. When strict Motif is requested,
96: # the bindings use $tk_priv(buttons) and $tk_priv(activeFg) to set the
97: # -activeforeground color to -foreground when the mouse is in the window
98: # and restore it when the mouse leaves.
99: # ----------------------------------------------------------------------
100:
101: bind Scrollbar <Any-Enter> {
102: if $tk_strictMotif {
103: set tk_priv(activeFg) [lindex [%W config -activeforeground] 4]
104: %W config -activeforeground [lindex [%W config -foreground] 4]
105: }
106: }
107: bind Scrollbar <Any-Leave> {
108: if {$tk_strictMotif && ($tk_priv(buttons) == 0)} {
109: %W config -activeforeground $tk_priv(activeFg)
110: }
111: }
112: bind Scrollbar <Any-ButtonPress> {incr tk_priv(buttons)}
113: bind Scrollbar <Any-ButtonRelease> {incr tk_priv(buttons) -1}
114:
115: # ----------------------------------------------------------------------
116: # Class bindings for scale widgets. When strict Motif is requested,
117: # the bindings use $tk_priv(buttons) and $tk_priv(activeFg) to set the
118: # -activeforeground color to -foreground when the mouse is in the window
119: # and restore it when the mouse leaves.
120: # ----------------------------------------------------------------------
121:
122: bind Scale <Any-Enter> {
123: if $tk_strictMotif {
124: set tk_priv(activeFg) [lindex [%W config -activeforeground] 4]
125: %W config -activeforeground [lindex [%W config -sliderforeground] 4]
126: }
127: }
128: bind Scale <Any-Leave> {
129: if {$tk_strictMotif && ($tk_priv(buttons) == 0)} {
130: %W config -activeforeground $tk_priv(activeFg)
131: }
132: }
133: bind Scale <Any-ButtonPress> {incr tk_priv(buttons)}
134: bind Scale <Any-ButtonRelease> {incr tk_priv(buttons) -1}
135:
136: # ----------------------------------------------------------------------
137: # Class bindings for menubutton widgets. Variables used:
138: # $tk_priv(posted) - keeps track of the menubutton whose menu is
139: # currently posted (or empty string, if none).
140: # $tk_priv(inMenuButton)- if non-null, identifies menu button
141: # containing mouse pointer.
142: # $tk_priv(relief) - keeps track of original relief of posted
143: # menu button, so it can be restored later.
144: # $tk_priv(dragging) - if non-null, identifies menu button whose
145: # menu is currently being dragged in a tear-off
146: # operation.
147: # $tk_priv(focus) - records old focus window so focus can be
148: # returned there after keyboard traversal
149: # to menu.
150: # ----------------------------------------------------------------------
151:
152: bind Menubutton <Enter> {
153: set tk_priv(inMenuButton) %W
154: if {[lindex [%W config -state] 4] != "disabled"} {
155: if {!$tk_strictMotif} {
156: %W config -state active
157: }
158: }
159: }
160: bind Menubutton <Any-Leave> {
161: set tk_priv(inMenuButton) {}
162: if {[lindex [%W config -state] 4] != "disabled"} {
163: if {!$tk_strictMotif} {
164: %W config -state normal
165: }
166: }
167: }
168: bind Menubutton <1> {tk_mbButtonDown %W}
169: bind Menubutton <Any-ButtonRelease-1> {
170: if {($tk_priv(inMenuButton) != "") && ($tk_priv(posted) != "")} {
171: [lindex [$tk_priv(posted) config -menu] 4] activate 0
172: } else {
173: tk_mbUnpost
174: }
175: }
176:
177: # In the binding below, it's important to ignore grab-related entries
178: # and exits because they lag reality and can cause menus to chase
179: # their own tail, repeatedly posting and unposting.
180:
181: bind Menubutton <B1-Enter> {
182: set tk_priv(inMenuButton) %W
183: if {([lindex [%W config -state] 4] != "disabled")
184: && ("%m" != "NotifyGrab") && ("%m" != "NotifyUngrab")} {
185: if {!$tk_strictMotif} {
186: %W config -state active
187: }
188: tk_mbPost %W
189: }
190: }
191: bind Menubutton <2> {
192: if {($tk_priv(posted) == "")
193: && ([lindex [%W config -state] 4] != "disabled")} {
194: set tk_priv(dragging) %W
195: [lindex [$tk_priv(dragging) config -menu] 4] post %X %Y
196: }
197: }
198: bind Menubutton <B2-Motion> {
199: if {$tk_priv(dragging) != ""} {
200: [lindex [$tk_priv(dragging) config -menu] 4] post %X %Y
201: }
202: }
203: bind Menubutton <ButtonRelease-2> {set tk_priv(dragging) ""}
204:
205: # ----------------------------------------------------------------------
206: # Class bindings for menu widgets. $tk_priv(x) and $tk_priv(y) are used
207: # to keep track of the position of the mouse cursor in the menu window
208: # during dragging of tear-off menus. $tk_priv(window) keeps track of
209: # the menu containing the mouse, if any.
210: # ----------------------------------------------------------------------
211:
212: bind Menu <Any-Enter> {set tk_priv(window) %W; %W activate @%y}
213: bind Menu <Any-Leave> {set tk_priv(window) {}; %W activate none}
214: bind Menu <Any-Motion> {
215: if {$tk_priv(window) != ""} {
216: %W activate @%y
217: }
218: }
219: bind Menu <ButtonRelease-1> {tk_invokeMenu %W}
220: bind Menu <2> {set tk_priv(x) %x; set tk_priv(y) %y}
221: bind Menu <B2-Motion> {
222: if {$tk_priv(posted) == ""} {
223: %W post [expr %X-$tk_priv(x)] [expr %Y-$tk_priv(y)]
224: }
225: }
226: bind Menu <B2-Leave> { }
227: bind Menu <B2-Enter> { }
228: bind Menu <Escape> {tk_mbUnpost}
229: bind Menu <Any-KeyPress> {tk_traverseWithinMenu %W %A}
230: bind Menu <Left> {tk_nextMenu -1}
231: bind Menu <Right> {tk_nextMenu 1}
232: bind Menu <Up> {tk_nextMenuEntry -1}
233: bind Menu <Down> {tk_nextMenuEntry 1}
234: bind Menu <Return> {tk_invokeMenu %W}
235:
236: # ----------------------------------------------------------------------
237: # Class bindings for text widgets. $tk_priv(selectMode) holds one of
238: # "char", "word", or "line" to indicate which selection mode is active.
239: # ----------------------------------------------------------------------
240:
241: bind Text <1> {
242: set tk_priv(selectMode) char
243: %W mark set insert @%x,%y
244: %W mark set anchor insert
245: if {[lindex [%W config -state] 4] == "normal"} {focus %W}
246: }
247: bind Text <Double-1> {
248: set tk_priv(selectMode) word
249: %W mark set insert "@%x,%y wordstart"
250: tk_textSelectTo %W insert
251: }
252: bind Text <Triple-1> {
253: set tk_priv(selectMode) line
254: %W mark set insert "@%x,%y linestart"
255: tk_textSelectTo %W insert
256: }
257: bind Text <B1-Motion> {tk_textSelectTo %W @%x,%y}
258: bind Text <Shift-1> {
259: tk_textResetAnchor %W @%x,%y
260: tk_textSelectTo %W @%x,%y
261: }
262: bind Text <Shift-B1-Motion> {tk_textSelectTo %W @%x,%y}
263: bind Text <2> {%W scan mark %y}
264: bind Text <B2-Motion> {%W scan dragto %y}
265: bind Text <Any-KeyPress> {
266: if {"%A" != ""} {
267: %W insert insert %A
268: %W yview -pickplace insert
269: }
270: }
271: bind Text <Return> {%W insert insert \n; %W yview -pickplace insert}
272: bind Text <BackSpace> {tk_textBackspace %W; %W yview -pickplace insert}
273: bind Text <Delete> {tk_textBackspace %W; %W yview -pickplace insert}
274: bind Text <Control-h> {tk_textBackspace %W; %W yview -pickplace insert}
275: bind Text <Control-d> {%W delete sel.first sel.last}
276: bind Text <Control-v> {
277: %W insert insert [selection get]
278: %W yview -pickplace insert
279: }
280: tk_bindForTraversal Text
281:
282: # Initialize the elements of tk_priv that require initialization.
283:
284: set tk_priv(buttons) 0
285: set tk_priv(dragging) {}
286: set tk_priv(focus) {}
287: set tk_priv(inMenuButton) {}
288: set tk_priv(posted) {}
289: set tk_priv(selectMode) char
290: set tk_priv(window) {}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.