⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecosynth.tcl

📁 eCos操作系统源码
💻 TCL
📖 第 1 页 / 共 5 页
字号:
    }    proc _handle_exit_timer { } {	if { $synth::ecos_running } {	    incr synth::_handle_exit_retries	    if { $synth::_handle_exit_retries < 5 } {		synth::request_application_exit		synth::report "Still waiting for the eCos application to exit.\n"	    } else {		synth::_send_SIGKILL	    }	    set synth::_handle_exit_after [after 1000 synth::_handle_exit_timer]	}    }}# }}}# {{{  Main window layout                                       # ----------------------------------------------------------------------------# The window layout is as follows:#  1) a menu bar at the top (surprise surprise). Many of the menus will be#     empty or nearly so, but device-specific scripts may want to extend#     the menus.#  2) a toolbar. This is primarily for use by device-specific scripts#  3) a central grid.#  4) a status line at the bottom.## The central grid is organised as a 3x3 set of frames. The centre frame holds# the main text display, plus associated scrollbars, and is the frame that# will expand or shrink as the toplevel is resized. The remaining eight frames# (nw, n, ne, e, se, s, sw, w) are available for use by device-specific# scripts, typically under control of settings in the target definition file.# It is very possible that some or all of these eight frames will be empty,# and if an entire row or column is empty then Tk will make them invisible.## Possible enhancements:# 1) implement some sort of paning/resizing around the central text window.#    That would provide some way of letting the user control the space#    taken by device-specific subwindows. This would be implemented#    by modifying the weights assigned to different rows/columns.# 2) it would be very useful if the main text window could be split,#    like emacs. This would require multiple text widgets, with output#    being pasted in each one.# 3) possibly the text window should not be hard-wired to the centre frame,#    instead its frame could be selected by preferences somehow.if { $synth::flag_debug } {    synth::report "Creating main window layout\n"}# The various frames are generally accessed via variablesmenu .menubar -borderwidth 1menu .menubar.filemenu .menubar.editmenu .menubar.viewmenu .menubar.windowsmenu .menubar.help. configure -menu .menubar.menubar add cascade -label "File"    -underline 0 -menu .menubar.file.menubar add cascade -label "Edit"    -underline 0 -menu .menubar.edit.menubar add cascade -label "View"    -underline 0 -menu .menubar.view.menubar add cascade -label "Windows" -underline 0 -menu .menubar.windows.menubar add cascade -label "Help"    -underline 0 -menu .menubar.help.menubar.file add command -label "Save"        -underline 0 -accelerator "Ctrl-S" -command [list synth::_handle_file_save].menubar.file add command -label "Save As..."  -underline 5                       -command [list synth::_handle_file_save_as].menubar.file add command -label "Save All..." -underline 6                       -command [list synth::_handle_file_save_all].menubar.file add command -label "Kill eCos"   -underline 0                       -command [list synth::_handle_kill_request].menubar.file add command -label "Exit"        -underline 1 -accelerator "Ctrl-Q" -command [list synth::_handle_exit_request]bind . <Control-KeyPress-q> [list synth::_handle_exit_request]bind . <Control-KeyPress-s> [list synth::_handle_file_save]# Once eCos has exited, the kill option should be disablednamespace eval synth {    proc _menubar_ecos_exit_clean { arg_list } {	.menubar.file entryconfigure "Kill eCos" -state disabled    }    synth::hook_add "ecos_exit" synth::_menubar_ecos_exit_clean}frame .toolbar -borderwidth 1 -relief grooveif { "" != $synth::image_save } {    button .toolbar.save    -image $synth::image_save -borderwidth 0 -command [list synth::_handle_file_save]    pack .toolbar.save -side left -padx 2    synth::register_balloon_help .toolbar.save "Save visible output"}if { "" != $synth::image_saveall } {    button .toolbar.saveall -image $synth::image_saveall -borderwidth 0 -command [list synth::_handle_file_save_all]    pack .toolbar.saveall -side left -padx 2    synth::register_balloon_help .toolbar.saveall "Save all output"}if { "" != $synth::image_cut } {    button .toolbar.cut    -image $synth::image_cut -borderwidth 0 -state disabled -command [list synth::_handle_edit_cut]    pack .toolbar.cut -side left -padx 2    synth::register_balloon_help .toolbar.cut "Cut"}if { "" != $synth::image_copy } {    button .toolbar.copy    -image $synth::image_copy -borderwidth 0 -command [list synth::_handle_edit_copy]    pack .toolbar.copy -side left -padx 2    synth::register_balloon_help .toolbar.copy "Copy"}if { "" != $synth::image_paste } {    button .toolbar.paste    -image $synth::image_paste -borderwidth 0 -state disabled -command [list synth::_handle_edit_paste]    pack .toolbar.paste -side left -padx 2    synth::register_balloon_help .toolbar.paste "Paste"}pack .toolbar -side top -fill xframe .mainframe .main.nw -borderwidth 0frame .main.n  -borderwidth 0frame .main.ne -borderwidth 0frame .main.e  -borderwidth 0frame .main.se -borderwidth 0frame .main.s  -borderwidth 0frame .main.sw -borderwidth 0frame .main.w  -borderwidth 0frame .main.centreframe .main.border_nw_n      -width 2 -background black -borderwidth 0frame .main.border_n_ne      -width 2 -background black -borderwidth 0frame .main.border_w_centre  -width 2 -background black -borderwidth 0frame .main.border_centre_e  -width 2 -background black -borderwidth 0frame .main.border_sw_s      -width 2 -background black -borderwidth 0frame .main.border_s_se      -width 2 -background black -borderwidth 0frame .main.border_nw_w      -height 2 -background black -borderwidth 0frame .main.border_n_centre  -height 2 -background black -borderwidth 0frame .main.border_ne_e      -height 2 -background black -borderwidth 0frame .main.border_w_sw      -height 2 -background black -borderwidth 0frame .main.border_centre_s  -height 2 -background black -borderwidth 0frame .main.border_e_se      -height 2 -background black -borderwidth 0text .main.centre.text -xscrollcommand [list .main.centre.horizontal set] -yscrollcommand [list .main.centre.vertical set]scrollbar .main.centre.horizontal -orient horizontal -command [list .main.centre.text xview]scrollbar .main.centre.vertical   -orient vertical -command [list .main.centre.text yview]grid configure .main.centre.text -row 0 -column 0 -sticky newsgrid configure .main.centre.vertical -row 0 -column 1 -sticky nsgrid configure .main.centre.horizontal -row 1 -column 0 -sticky ew# Is there anything useful to be done in 1,1? e.g. a >> button to# go directly to perform ".main.centre.text see end"# Make sure that row 0 column 0, i.e. the text widget rather than the# scrollbars, grows to fit all available space.grid rowconfigure .main.centre 0 -weight 1grid rowconfigure .main.centre 1 -weight 0grid columnconfigure .main.centre 0 -weight 1grid columnconfigure .main.centre 1 -weight 0grid configure .main.nw              -row 0 -column 0 -sticky newsgrid configure .main.border_nw_n     -row 0 -column 1 -sticky nsgrid configure .main.n               -row 0 -column 2 -sticky newsgrid configure .main.border_n_ne     -row 0 -column 3 -sticky nsgrid configure .main.ne              -row 0 -column 4 -sticky newsgrid configure .main.border_nw_w     -row 1 -column 0 -sticky ewgrid configure .main.border_n_centre -row 1 -column 1 -columnspan 3  -sticky ewgrid configure .main.border_ne_e     -row 1 -column 4 -sticky ewgrid configure .main.w               -row 2 -column 0 -sticky newsgrid configure .main.border_w_centre -row 2 -column 1 -sticky nsgrid configure .main.centre          -row 2 -column 2 -sticky newsgrid configure .main.border_centre_e -row 2 -column 3 -sticky nsgrid configure .main.e               -row 2 -column 4 -sticky newsgrid configure .main.border_w_sw     -row 3 -column 0 -sticky ewgrid configure .main.border_centre_s -row 3 -column 1 -columnspan 3 -sticky ewgrid configure .main.border_e_se     -row 3 -column 4 -sticky ewgrid configure .main.sw              -row 4 -column 0 -sticky newsgrid configure .main.border_sw_s     -row 4 -column 1 -sticky nsgrid configure .main.s               -row 4 -column 2 -sticky newsgrid configure .main.border_s_se     -row 4 -column 3 -sticky nsgrid configure .main.se              -row 4 -column 4 -sticky newsgrid columnconfigure .main 0 -weight 0grid columnconfigure .main 1 -weight 0grid columnconfigure .main 2 -weight 1grid columnconfigure .main 3 -weight 0grid columnconfigure .main 4 -weight 0grid rowconfigure .main 0 -weight 0grid rowconfigure .main 1 -weight 0grid rowconfigure .main 2 -weight 1grid rowconfigure .main 3 -weight 0grid rowconfigure .main 4 -weight 0# The .main frame should not be packed into the main window yet.# Until all devices have been instantiated the various subwindows# are not yet known, so the desired size of .main is not known# either. Packing it too early and then adding more windows# causes confusion.# }}}# {{{  Help                                                     # ----------------------------------------------------------------------------# Two main sources of documentation are of interest to the synthetic# target. The first is the toplevel eCos documentation. The second# is the documentation specific to the generic target. Device-specific# scripts may want to add menu entries for their own documentation.## The problems are:#   1) where to find the documentation#   2) how to view it?## The documentation should be in the component repository. If there is# a variable ECOS_REPOSITORY then that gives the appropriate information.# Otherwise things get messy because the repository being used for# eCos may not match the repository used when building the host-side# support - the versions should match but the repository may have# moved. Never the less that is the best we can do.# NOTE: sources.redhat.com might provide another alternative, but the# documentation is not organized in the same way as the repository.## As for how to view the documentation, this is up to user preferences# but ecosynth has built-in knowledge of three different viewers. namespace eval synth {    if { $synth::flag_debug } {	synth::report "Setting up help menu\n"    }        variable _browser1   "mozilla -remote openURL(%s)"    variable _browser2   "mozilla %s"    variable _browser3   "gnome-help-browser %s"    variable _main_help  ""    variable _synth_help ""    set _repo ""        if { [info exists env(ECOS_REPOSITORY)] } {	set _repo $env(ECOS_REPOSITORY)    } else {	set _repo $synth::_ecos_repository    }    if { ![file exists [file join $_repo "ecos.db"]] } {	synth::report_warning "Failed to locate eCos component repository.\n   \		Please define an environment variable ECOS_REPOSITORY.\n"    } else {	# FIXME: this needs attention once the documentation is more sorted	set synth::_main_help [file join $_repo "index.html"]	if { ![file exists $synth::_main_help] } {	    if { 0 } {		synth::report_warning "Failed to locate toplevel documentation file $synth::_main_help\n   \	                               Help->eCos menu option disabled.\n"	    }	    set synth::_main_help ""	} else {	    set synth::_main_help "file://$_main_help"	}		set synth::_synth_help [file join $_repo $synth::_ecosynth_package_dir $synth::_ecosynth_package_version "doc/hal-synth-arch.html"]	if { ![file exists $synth::_synth_help] } {	    synth::report_warning "Failed to locate synthetic target documentation $synth::_synth_help\n   \		    Help->Synthetic target menu option disabled.\n"	    set synth::_synth_help ""	} else {	    set synth::_synth_help "file://$_synth_help"	}    }    if { "" != $_main_help } {	.menubar.help add command -label "eCos" -command [list synth::_menu_help $synth::handle_help]    } else {	.menubar.help add command -label "eCos" -state disabled    }    if { "" != $_synth_help } {	.menubar.help add command -label "Synthetic target" -command [list synth::handle_help "$synth::_synth_help"]    } else {	.menubar.help add command -label "Synthetic target" -state disabled    }        unset _repo        proc handle_help { which } {	set command [format $synth::_browser1 $which]	if { 0 != [catch { eval exec -- "$command > /dev/null" } & ] } {	    set command [format $synth::_browser2 $which]	    if { 0 != [catch { eval exec -- "$command > /dev/null &" } ] } {		set command [format $synth::_browser3 $which]		if { 0 != [catch { eval exec -- "$command > /dev/null &"} ] } {		    synth::report_warning "Unable to start a help browser.\n   Please check the settings in Edit->Preferences.\n"		}	    }	}    }    # FIXME: add an about box as well.}# }}}# {{{  Filters                                                  # ----------------------------------------------------------------------------# The central text window is expected to provide the bulk of the information# to the user. This information can be voluminous, so filtering is desirable.## There are two types of filters. System filters are provided by ecosynth# itself and by device-specific scripts. For example ecosynth has a filter# for warnings, and the console device has a filter for eCos trace messages.# In addition users can specify their own filters using regular expressions,# and those filters take priority. Note that there is an assumption that# output is predominantly line-based: if partial lines get output then# some confusion is possible.## With tk the implementation is relatively straightforward: the text widget's# tag facility does all the hard work of controlling how text gets displayed.# It is possible to show or hide text using -elide, colours can be controlled# using -background and -foreground, ... Not all of this functionality# is made available to the user just yet.namespace eval synth {    # The bulk of the information is held in arrays, indexed by the name of    # the filter. Lists are used to keep track of all valid names.    variable _system_filter_list      [list]    variable _system_filter_settings    variable _user_filter_list        [list]    variable _user_filter_settings    # Does a given system filter already exist?    proc filter_exists { name } {	set result 0	if { -1 != [lsearch -exact $synth::_system_filter_list $name] } {	    set result 1	}	return $result    }    proc filter_get_list { } {	return $synth::_system_filter_list    }        # Parsing support. All filters take a number of standard options:    #    #   -text "message"      - how to identify this filter to the user    #   -hide [

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -