windows.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. ######################################################################
  2. #
  3. # windows.tcl       Code for managing scanalyze's window menu
  4. # 10/29/98          magi
  5. #
  6. ######################################################################
  7. #
  8. # Exports:
  9. #   window_Register
  10. #   window_Activate
  11. #   window_Minimize
  12. #
  13. # globals:
  14. #   menuWindow
  15. #   window_visible
  16. #
  17. ######################################################################
  18. proc window_Register {window {status normal}} {
  19.     global menuWindow
  20.     global window_visible
  21.     set title [wm title $window]
  22.     set window_visible($window) 1
  23.     $menuWindow add checkbutton -label $title 
  24. -variable window_visible($window) 
  25. -command "setWindowVisible $window"
  26.     
  27.     if {$status == "undeletable"} {
  28. window_MarkUndeletable $window
  29.     } else {
  30. bind $window <Destroy> 
  31.     "+if {"%W"=="$window"} {window_Unregister $window}"
  32.     }
  33. }
  34. proc window_Activate {window} {
  35.     if {[winfo exists $window]} {
  36. # bring it to foreground
  37. # don't move the window around 
  38. # (at least not by more than required by grid)
  39. set geom [wm geometry $window]
  40. #puts $geom
  41. wm withdraw $window
  42. wm deiconify $window
  43. wm geometry $window $geom
  44. return 1
  45.     } else {
  46. return 0
  47.     }
  48. }
  49. proc window_ActivateFromY {y} {
  50.     global menuWindow
  51.     for {set i 0} {$i < [$menuWindow index end]} {incr i} {
  52. if {[$menuWindow yposition $i] > $y} {
  53.     break
  54. }
  55.     }
  56.     #puts "found index $i"
  57.     #puts "found item [$menuWindow entryconfig $i -command]"
  58.     set cmd [$menuWindow entryconfig $i -command]
  59.     set cmd [lindex $cmd 4]
  60.     if {[lindex $cmd 0] == "setWindowVisible"} {
  61. set window [lindex $cmd 1]
  62. setWindowVisible $window 0
  63. window_Activate $window
  64.     }
  65. }
  66. proc window_Minimize {state} {
  67.     global window_visible
  68.     global window_visible_restore
  69.     global window_visible_geometry
  70.     if {$state == "save"} {
  71. # minimize all registered windows, and remember what we minimized
  72. if {[info exists window_visible_restore]} {
  73.     unset window_visible_restore
  74. }
  75. foreach win [array names window_visible] {
  76.     set window_visible_restore($win) [wm state $win]
  77.     set window_visible_geometry($win) [wm geometry $win]
  78.     wm withdraw $win
  79. }
  80.     } else {
  81. # restore everything that we minimized
  82. if {[info exists window_visible_restore]} {
  83.     foreach win [array names window_visible_restore] {
  84. if {$window_visible_restore($win) == "iconic"} {
  85.     wm iconify $win
  86. } elseif {$window_visible_restore($win) == "normal"} {
  87.     set geom $window_visible_geometry($win)
  88.     
  89.     # need to extract position from geometry string
  90.     # (which has size and position)
  91.     # position could be signalled by either + or -
  92.     set leftp [string first + $geom]
  93.     set leftm [string first - $geom]
  94.     if {$leftp > $leftm && $leftm >= 0} {set leftp $leftm}
  95.     set geom [string range $geom $leftp end]
  96.     wm deiconify $win
  97.     wm geometry $win $geom
  98. }
  99.     }
  100.     unset window_visible_restore
  101.     unset window_visible_geometry
  102. }
  103.     }
  104. }
  105. proc window_Unregister {window} {
  106.     global menuWindow
  107.     global window_visible
  108.     unset window_visible($window)
  109.     set title [wm title $window]
  110.     $menuWindow delete $title
  111. }
  112. proc setWindowVisible { window {show ""}} {
  113.     global window_visible
  114.     if {$show != ""} {
  115. set window_visible($window) $show
  116.     }
  117.     if {$window_visible($window)} {
  118. wm deiconify $window
  119.     } else {
  120. wm withdraw $window
  121.     }
  122. }
  123. #
  124. # Mark that this window can't be deleted -- any attempt to close it
  125. # just hides it
  126. #
  127. proc window_MarkUndeletable {window} {
  128.     wm protocol $window WM_DELETE_WINDOW 
  129. "setWindowVisible $window 0"
  130. }
  131. # Force the window manager to resize so that the rendering frame
  132. # is the desired size 
  133. proc setMainWindowSize {width height} {
  134.     global toglPane
  135.     set renderingwidth [lindex [$toglPane config -width] 4]
  136.     set renderingheight [lindex [$toglPane config -height] 4]
  137.     scan [wm geometry .] "%dx%d" winwidth winheight
  138.     set finalwidth [ expr " $winwidth - $renderingwidth + $width " ]
  139.     set finalheight [ expr " $winheight - $renderingheight + $height " ]
  140.     # scanalyze typically uses a somewhat conservative minimum size for
  141.     # the root window; if you ask for a small rendering, we might bump
  142.     # into this, so make sure we're allowed to do the final
  143.     # wm geometry command.
  144.     scan [wm minsize .] "%d %d" minw minh
  145.     if {$minw > $finalwidth}  { set minw $finalwidth }
  146.     if {$minh > $finalheight} { set minh $finalheight }
  147.     wm minsize . $minw $minh
  148.     wm geometry . [format "%sx%s" $finalwidth $finalheight ]
  149. }
  150. # Trys to match the desired aspect ratio
  151. # returns a multiplier from the actual window set size to the
  152. # requested size
  153. proc setMainWindowAspect {width height} {
  154.     global toglPane
  155.     set renderingwidth [lindex [$toglPane config -width] 4]
  156.     set renderingheight [lindex [$toglPane config -height] 4]
  157.     set desiredAspect [expr 1.0 *  $width / $height]
  158.     set currentAspect [expr 1.0 * $renderingwidth / $renderingheight]
  159.  
  160.     # Check if we are already the right size
  161.     if {$desiredAspect == $currentAspect} {
  162. return [expr 1.0 * $renderingwidth / $width];
  163.     }
  164.    
  165.     if {$desiredAspect > $currentAspect} {
  166. # Too tall right now
  167. set newWidth $renderingwidth
  168. set newHeight [expr $newWidth / $desiredAspect]
  169.     } else {
  170. # Too wide right now
  171. set newHeight $renderingheight
  172. set newWidth [expr $newHeight * $desiredAspect]
  173.     }
  174.     set newWidth [expr int ($newWidth)]
  175.     set newHeight [expr int( $newHeight)]
  176.     setMainWindowSize $newWidth $newHeight
  177.     return [expr 1.0 * $newWidth / $width]
  178. }
  179. proc sendImageTo {remoteDisplay} {
  180. puts $remoteDisplay:0
  181. plv_writeiris [globalset toglPane] /tmp/tmp.rgb
  182. exec xv -display $remoteDisplay:0 /tmp/tmp.rgb &
  183. }
  184. proc remoteDisplayUI {} {
  185.     if [window_Activate .remoteDisplay] return
  186.     
  187.     set rd [toplevel .remoteDisplay]
  188.     wm title $rd "Remote Display"
  189.     window_Register $rd
  190.     global G_remoteDisplay
  191.     set G_remoteDisplay ""
  192.     frame $rd.name -relief groove -borderwidth 4
  193.     label $rd.name.lab -text "Remote Display:"
  194.     entry $rd.name.display -relief sunken -textvariable G_remoteDisplay
  195.     pack $rd.name.lab $rd.name.display
  196.     frame $rd.buttons -relief groove -borderwidth 4
  197.     button $rd.buttons.addtomenu -text "Add to Menu" 
  198. -command {if {$G_remoteDisplay != ""} 
  199.       {addRemoteDisplayToMenu $G_remoteDisplay}}
  200.     button $rd.buttons.addtomain -text "Add to Main Window" 
  201. -command {if {$G_remoteDisplay != ""} 
  202.       {addRemoteDisplayToMain $G_remoteDisplay}}
  203.     button $rd.buttons.send -text  "Send Now" 
  204. -command {if {$G_remoteDisplay != ""} 
  205.        {sendImageTo $G_remoteDisplay}}
  206.     pack $rd.buttons.addtomenu $rd.buttons.addtomain $rd.buttons.send -fill x
  207.     pack $rd.name $rd.buttons 
  208. }
  209. proc addRemoteDisplayToMain {display} {
  210.     regsub -all {.} "$display" "x" shortdisplay
  211.     eval button .tools.ro.to$shortdisplay -text To$display -padx 0 -pady 0 
  212. -command "sendImageTo $display"
  213.     packchildren  .tools.ro -side top -expand 1 -fill x -padx 0
  214. }
  215. proc addRemoteDisplayToMenu {display } {
  216.     .menubar.menuFile.remoteDisplay add command -label $display 
  217. -command "sendImageTo $display"
  218. }