80,98d79 < #####bbogart < proc destroy_fullscreen w { < < global win_src < set children [winfo children $w] < foreach child $children { < if {[info exists win_src($child.video)]} { < set src $win_src($child.video) < switcher_unregister "$child.video" < detach_window $src "$child.video" < } < } < < set top [winfo toplevel $w] < destroy $top < } < ##### < < 425,667d405 < #######bbogart < < proc wrap_display_name {src} { < < global win_src < < if {[info exists win_src($src)]} { < display_name $src < } else { < full_deactivate $src < } < < } < < proc display_name {v} { < global switcher_src fname win_src < < set tmp [getid $switcher_src($v)] < if {[string length $tmp] > 26} { < set fname [string range $tmp 0 25] < } else { < set fname $tmp < } < } < < proc fullscreen_setup {} { < < global numScreens numVideos output_screenWidth output_screenHeight output_xoffset output_yoffset < < # Variable Defaults < set numScreens 1 < set numVideos 1 < set screenWidth 640 < set screenHeight 480 < set xoffset 1024 < set yoffset 0 < < # New toplevel < toplevel .fsetup < wm title .fsetup "Fullscreen Setup" < catch {wm resizable .fsetup false false} < < # Top Bar < set w .fsetup < frame $w.top -border 2 -relief groove < label $w.top.l -text "# of Screens:" < label $w.top.l2 -text "Videos/Screen:" < < foreach i {1 2 3 4} { < radiobutton $w.top.ns$i -text "$i" -variable numScreens -value $i < } < $w.top.ns$numScreens select < < set i 1 < foreach vids {1 4 16 64} { < radiobutton $w.top.nv$i -text "$vids" -variable numVideos -value $vids < incr i < } < $w.top.nv$numVideos select < < # Middle Bar < set mid $w.middle < frame $mid -border 0 -relief groove < label $mid.l -text "Screen Parameters:" < label $mid.lw -text "Width:" < label $mid.lh -text "Height:" < label $mid.lx -text "X Offset:" < label $mid.ly -text "Y Offset:" < entry $mid.ew -width 5 < entry $mid.eh -width 5 < entry $mid.ex -width 5 < entry $mid.ey -width 5 < < # Default Entry Values < $mid.ew insert 0 $screenWidth < $mid.eh insert 0 $screenHeight < $mid.ex insert 0 $xoffset < $mid.ey insert 0 $yoffset < < # Bottom Bar < set br $w.bar < frame $br -relief ridge -borderwidth 2 < button $br.dismiss -text Dismiss -relief raised -command {destroy .fsetup} < button $br.launch -text Launch -relief raised \ < -command { < # set variables from entry widgets < set screenWidth [expr abs([.fsetup.middle.ew get])] < set screenHeight [expr abs([.fsetup.middle.eh get])] < set xoffset [expr abs([.fsetup.middle.ex get])] < set yoffset [expr abs([.fsetup.middle.ey get])] < < # launch only if the entries are valid < set ow [catch {expr $screenWidth*1} output_screenWidth] < set oh [catch {expr $screenHeight*1} output_screenHeight] < set ox [catch {expr $xoffset*1} output_xoffset] < set oy [catch {expr $yoffset*1} output_yoffset] < if { $ow==0 && $oh==0 && $ox==0 && $oy==0 } { < fullscreen_gui $numScreens $numVideos\ < $output_screenWidth $output_screenHeight\ < $output_xoffset $output_yoffset < destroy .fsetup < } else { < tk_messageBox -icon error \ < -type ok \ < -message "You entered an invalid screen parameter." \ < -title error < } < } < < # Build GUI < grid $w.top -row 0 -column 0 -sticky news < grid $w.top.l -row 0 -column 0 < grid $w.top.l2 -row 1 -column 0 < for {set i 1} {$i <=4} {incr i} { < grid $w.top.ns$i -row 0 -column $i < grid $w.top.nv$i -row 1 -column $i < } < < grid $mid -row 1 -column 0 -sticky news < grid $mid.l -row 0 -column 0 -columnspan 4 -sticky nws < grid $mid.lw -row 1 -column 0 -sticky news < grid $mid.ew -row 1 -column 1 -sticky news < grid $mid.lh -row 1 -column 2 -sticky news < grid $mid.eh -row 1 -column 3 -sticky news < grid $mid.lx -row 2 -column 0 -sticky news < grid $mid.ex -row 2 -column 1 -sticky news < grid $mid.ly -row 2 -column 2 -sticky news < grid $mid.ey -row 2 -column 3 -sticky news < < grid $br -row 2 -column 0 -sticky news < pack $br.dismiss $br.launch -side right -padx 1 -pady 1 < } < < proc fullscreen_gui {numScreens numVideos output_screenWidth output_screenHeight output_xoffset output_yoffset} { < global fname switcher_src win_src fullscreen_control < < toplevel .fullscreen < wm title .fullscreen "Fullscreen Control" < catch "wm resizable .fullscreen false false" < < set active [session active] < open_fullscreen $numScreens $numVideos $output_screenWidth $output_screenHeight $output_xoffset $output_yoffset < < frame .fullscreen.frames < < set numColumns [expr int(sqrt($numVideos)*$numScreens)] < < for {set i 1} {$i<=[expr $numVideos*$numScreens]} {incr i} { < if {$i <= [llength $active]} { < < set f .fullscreen.frames.frame$i < set v ".wvfull.frame$i.video" < set fname "[display_name $v]" < < # keep track of what video goes with what controller frame < set fullscreen_control($v) $f < < frame $f -relief groove -border 2 < label $f.t -text "Video $i" < button $f.bprev -text "Prev" -command "switcher_prev $v ; display_name $v" < button $f.bnext -text "Next" -command "switcher_next $v ; display_name $v" < < grid $f.t -row 0 -column 0 -columnspan 2 < grid $f.bprev -row 1 -column 0 < grid $f.bnext -row 1 -column 1 < < grid $f -row 0 -column $i -sticky nws < < # window placement on large multiscreen window < set row [expr abs(($i-1)/$numColumns)] < set column [expr (($i-1)%$numColumns)] < grid $f -row $row -column $column < < bind $f "wrap_display_name $v" < } < } < grid .fullscreen.frames -row 0 -column 0 < < #button bar < set b .fullscreen.bar < set n .fullscreen.name < frame $n -border 2 -relief ridge < frame $b -border 0 -relief raise < < button $b.q -text "Dismiss" -command { destroy_fullscreen .wvfull ; destroy .fullscreen } < label $n.l -textvariable fname -font [smallfont] < < pack $b.q -side right < pack $n.l < grid $n -row 1 -column 0 -sticky news < grid $b -row 2 -column 0 -sticky news < < } < < proc open_fullscreen {numScreens numVideos output_screenWidth output_screenHeight output_xoffset output_yoffset} { < set f [smallfont] < set w .wvfull < set active [session active] < set screen_width 1024 < set screen_height 768 < < toplevel $w -class Vic \ < -visual "[winfo visual .top] [winfo depth .top]" \ < -colormap .top -background black < catch "wm resizable $w false false" < < set geo4 "+$output_yoffset" < set geo3 "+$output_xoffset" < set geo2 "x$output_screenHeight" < set geof "$output_screenWidth$geo2$geo3$geo4" < wm geometry $w $geof < wm title $w "fullscreen" < wm overrideredirect $w true < < switch $numVideos { < "1" {set width [expr $output_screenWidth/$numScreens] ; set height [expr round($width/1.33)] } < "4" {set width [expr $output_screenWidth/(2*$numScreens)] ; set height [expr round($width/1.33)] } < "16" {set width [expr $output_screenWidth/(4*$numScreens)] ; set height [expr round($width/1.33)] } < "64" {set width [expr $output_screenWidth/(8*$numScreens)] ; set height [expr round($width/1.33)] } < } < < set numColumns [expr int(sqrt($numVideos)*$numScreens)] < < for {set i 1} {$i <= [expr $numVideos*$numScreens]} {incr i} { < frame $w.frame$i < create_video_widget $w.frame$i.video $width $height < # set size$w "$width{x}$height" < < set v $w.frame$i.video < pack $v -anchor c < if {$i <= [llength $active]} { < set row [expr abs(($i-1)/$numColumns)] < set column [expr (($i-1)%$numColumns)] < grid $w.frame$i -row $row -column $column < set current [lindex $active [expr $i-1]] < switcher_register $v $current window_switch < attach_window $current $v < } < < } < } < ####### <