focus.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # focus.tcl --
  2. #
  3. # This file defines several procedures for managing the input
  4. # focus.
  5. #
  6. # RCS: @(#) $Id: focus.tcl,v 1.9.4.1 2006/01/25 18:21:41 dgp Exp $
  7. #
  8. # Copyright (c) 1994-1995 Sun Microsystems, Inc.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # ::tk_focusNext --
  14. # This procedure returns the name of the next window after "w" in
  15. # "focus order" (the window that should receive the focus next if
  16. # Tab is typed in w).  "Next" is defined by a pre-order search
  17. # of a top-level and its non-top-level descendants, with the stacking
  18. # order determining the order of siblings.  The "-takefocus" options
  19. # on windows determine whether or not they should be skipped.
  20. #
  21. # Arguments:
  22. # w - Name of a window.
  23. proc ::tk_focusNext w {
  24.     set cur $w
  25.     while {1} {
  26. # Descend to just before the first child of the current widget.
  27. set parent $cur
  28. set children [winfo children $cur]
  29. set i -1
  30. # Look for the next sibling that isn't a top-level.
  31. while {1} {
  32.     incr i
  33.     if {$i < [llength $children]} {
  34. set cur [lindex $children $i]
  35.               if {[winfo toplevel $cur] eq $cur} {
  36.     continue
  37. } else {
  38.     break
  39. }
  40.     }
  41.     # No more siblings, so go to the current widget's parent.
  42.     # If it's a top-level, break out of the loop, otherwise
  43.     # look for its next sibling.
  44.     set cur $parent
  45.     if {[winfo toplevel $cur] eq $cur} {
  46. break
  47.     }
  48.     set parent [winfo parent $parent]
  49.     set children [winfo children $parent]
  50.     set i [lsearch -exact $children $cur]
  51. }
  52. if {$w eq $cur || [tk::FocusOK $cur]} {
  53.     return $cur
  54. }
  55.     }
  56. }
  57. # ::tk_focusPrev --
  58. # This procedure returns the name of the previous window before "w" in
  59. # "focus order" (the window that should receive the focus next if
  60. # Shift-Tab is typed in w).  "Next" is defined by a pre-order search
  61. # of a top-level and its non-top-level descendants, with the stacking
  62. # order determining the order of siblings.  The "-takefocus" options
  63. # on windows determine whether or not they should be skipped.
  64. #
  65. # Arguments:
  66. # w - Name of a window.
  67. proc ::tk_focusPrev w {
  68.     set cur $w
  69.     while {1} {
  70. # Collect information about the current window's position
  71. # among its siblings.  Also, if the window is a top-level,
  72. # then reposition to just after the last child of the window.
  73. if {[winfo toplevel $cur] eq $cur}  {
  74.     set parent $cur
  75.     set children [winfo children $cur]
  76.     set i [llength $children]
  77. } else {
  78.     set parent [winfo parent $cur]
  79.     set children [winfo children $parent]
  80.     set i [lsearch -exact $children $cur]
  81. }
  82. # Go to the previous sibling, then descend to its last descendant
  83. # (highest in stacking order.  While doing this, ignore top-levels
  84. # and their descendants.  When we run out of descendants, go up
  85. # one level to the parent.
  86. while {$i > 0} {
  87.     incr i -1
  88.     set cur [lindex $children $i]
  89.     if {[winfo toplevel $cur] eq $cur} {
  90. continue
  91.     }
  92.     set parent $cur
  93.     set children [winfo children $parent]
  94.     set i [llength $children]
  95. }
  96. set cur $parent
  97. if {$w eq $cur || [tk::FocusOK $cur]} {
  98.     return $cur
  99. }
  100.     }
  101. }
  102. # ::tk::FocusOK --
  103. #
  104. # This procedure is invoked to decide whether or not to focus on
  105. # a given window.  It returns 1 if it's OK to focus on the window,
  106. # 0 if it's not OK.  The code first checks whether the window is
  107. # viewable.  If not, then it never focuses on the window.  Then it
  108. # checks the -takefocus option for the window and uses it if it's
  109. # set.  If there's no -takefocus option, the procedure checks to
  110. # see if (a) the widget isn't disabled, and (b) it has some key
  111. # bindings.  If all of these are true, then 1 is returned.
  112. #
  113. # Arguments:
  114. # w - Name of a window.
  115. proc ::tk::FocusOK w {
  116.     set code [catch {$w cget -takefocus} value]
  117.     if {($code == 0) && ($value ne "")} {
  118. if {$value == 0} {
  119.     return 0
  120. } elseif {$value == 1} {
  121.     return [winfo viewable $w]
  122. } else {
  123.     set value [uplevel #0 $value [list $w]]
  124.     if {$value ne ""} {
  125. return $value
  126.     }
  127. }
  128.     }
  129.     if {![winfo viewable $w]} {
  130. return 0
  131.     }
  132.     set code [catch {$w cget -state} value]
  133.     if {($code == 0) && $value eq "disabled"} {
  134. return 0
  135.     }
  136.     regexp Key|Focus "[bind $w] [bind [winfo class $w]]"
  137. }
  138. # ::tk_focusFollowsMouse --
  139. #
  140. # If this procedure is invoked, Tk will enter "focus-follows-mouse"
  141. # mode, where the focus is always on whatever window contains the
  142. # mouse.  If this procedure isn't invoked, then the user typically
  143. # has to click on a window to give it the focus.
  144. #
  145. # Arguments:
  146. # None.
  147. proc ::tk_focusFollowsMouse {} {
  148.     set old [bind all <Enter>]
  149.     set script {
  150. if {"%d" eq "NotifyAncestor" 
  151. || "%d" eq "NotifyNonlinear" 
  152. || "%d" eq "NotifyInferior"} {
  153.     if {[tk::FocusOK %W]} {
  154. focus %W
  155.     }
  156. }
  157.     }
  158.     if {$old ne ""} {
  159. bind all <Enter> "$old; $script"
  160.     } else {
  161. bind all <Enter> $script
  162.     }
  163. }