This file is indexed.

/usr/share/openmsx/scripts/session_management.tcl is in openmsx-data 0.10.0-1ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# this file implements machine session management

namespace eval session_management {

set_help_text save_session \
{save_session [<name>]

Saves the state of all your currently running machines as a session with the
given name.
Any existing session with that name will be silently overwritten.

See also 'load_session', 'list_sessions' and 'delete_session'.
}

set_help_text load_session \
{load_session <name>

Restores the state of all machines of the session with the given name and
reactivates the machine that was active at save time. Note: all machines
already running will be silently destroyed! (Unless no single machine succeeded
to be restored.)

See also 'save_session', 'list_sessions' and 'delete_session'.
}

set_help_text list_sessions \
{list_sessions

Returns the names of all previously saved sessions.

See also 'save_session', 'load_session' and 'delete_session'.
}

set_help_text delete_session \
{delete_session <name>

Delete a previously saved session.

See also 'save_session', 'load_session' and 'list_sessions'.
}


user_setting create boolean enable_session_management "Whether to save your session at exit and restore it again at start up." false

proc tabcompletion {args} {
	return [list_sessions]
}

set_tabcompletion_proc load_session [namespace code tabcompletion]
set_tabcompletion_proc save_session [namespace code tabcompletion]
set_tabcompletion_proc delete_session [namespace code tabcompletion]

proc delete_session {name} {
	set directory [file normalize $::env(OPENMSX_USER_DATA)/../sessions/${name}]

	# remove old session under this name
	file delete -force -- $directory
}

proc list_sessions {} {
	set directory [file normalize $::env(OPENMSX_USER_DATA)/../sessions]
	return [lsort [glob -tails -directory $directory -type d -nocomplain *]]
}

proc get_machine_representation {machine_id} {
	return "[utils::get_machine_display_name $machine_id] @ [utils::get_machine_time $machine_id]"
}

proc save_session {{name "untitled"}} {
	if {[llength [list_machines]] == 0} {
		return "Nothing to save..."
	}

	set result ""

	set directory [file normalize $::env(OPENMSX_USER_DATA)/../sessions/${name}]

	# remove old session under this name
	delete_session $name
	file mkdir $directory

	# save using ID as file names
	foreach machine [list_machines] {
		append result "Saving machine $machine ([get_machine_representation $machine])...\n"
		store_machine $machine [file join $directory ${machine}.oms]
	}
	# save in a separate file the currently active machine
	set fileId [open [file join $directory active_machine] "w"]
	puts $fileId [format "%s.oms" [machine]]
	close $fileId

	append result "Session saved as $name\n"
	return $result
}

proc load_session {name} {
	set result ""

	# get all savestate files
	set directory [file normalize $::env(OPENMSX_USER_DATA)/../sessions/${name}]
	set states_to_restore [glob -tails -directory $directory -nocomplain *.oms *.xml.gz]

	# abort if we have nothing to restore
	if {[llength $states_to_restore] == 0} {
		error "Nothing found to restore..."
	}

	# sort them in order of ID, to guarantee consistent order as saved
	set states_to_restore [lsort -dictionary $states_to_restore]

	# save the machines we start with
	set orginal_machines [list_machines]

	# try to load file with active machine
	set active_machine ""
	catch {
		set fp [open [file join $directory active_machine] "r"]
		set active_machine [read -nonewline $fp]
		close $fp
	}

	# restore all saved machines
	set first true
	foreach state $states_to_restore {
		set fullname [file join $directory $state]
		if {[catch { ;# skip machines failing to restore
			set newID [restore_machine $fullname]
			append result "Restored $state as $newID ([get_machine_representation $newID])...\n"
			# activate saved active machine or alternatively, first machine
			if {(($active_machine ne "") && ($state eq $active_machine)) || \
			    (($active_machine eq "") && $first)} {
				activate_machine $newID
			}
			set first false
		} error_result]} {
			append result "Skipping $state: $error_result\n"
		}
	}

	# if restoring at least one machine succeeded, delete all original machines
	if {[llength [list_machines]] > [llength $orginal_machines]} {
		foreach machine $orginal_machines {
			delete_machine $machine
		}
	} else {
		append result "Couldn't restore a single machine, aborting...\n"
	}

	# if the active machine failed to load, activate the first machine (if available):
	if {[activate_machine] eq "" && [llength [list_machines]] > 0} {
		activate_machine [lindex [list_machines] 0]
	}

	return $result
}

variable after_quit_id

# do actual session management
if {$::enable_session_management} {
	# need after realtime command here, because openMSX needs to have started up first
	after realtime 0 {load_session "default_session"}
	set after_quit_id [after quit {save_session "default_session"}]
}

proc setting_changed {name1 name2 op} {
	variable after_quit_id

	if {$::enable_session_management} {;# setting changed from disabled to enabled
		set after_quit_id [after quit {save_session "default_session"}]
	} else { ;# setting changed from enabled to disabled
		after cancel $after_quit_id
	}
}

trace add variable ::enable_session_management "write" [namespace code setting_changed]

namespace export save_session
namespace export load_session
namespace export list_sessions
namespace export delete_session

} ;# namespace session_management

namespace import session_management::*