pd.tk 309 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/wish
# Copyright (c) 1997-1999 Miller Puckette.
# For information on usage and redistribution, and for a DISCLAIMER OF ALL
# WARRANTIES, see the file, "LICENSE.txt," in this distribution.

# changed by Thomas Musil 09.2001
# between "pdtk_graph_dialog -- dialog window for graphs"
# and "pdtk_array_dialog -- dialog window for arrays"
# a new dialogbox was inserted, named:
# "pdtk_iemgui_dialog -- dialog window for iem guis"
#
12
# all these changes are labeled with #######iemlib########
Miller Puckette's avatar
Miller Puckette committed
13

Miller Puckette's avatar
Miller Puckette committed
14
# set pd_nt (bad name) 0 for unix, 1 for microsoft, and 2 for Mac OSX.
15
16
17
18
19

#May 22 2009
#GUI improvements and dynamic runtime 8.5 widget upgrade for Linux by Ivica Ico Bukvic
#http://ico.bukvic.net <ico@vt.edu>

20
#puts stderr [info tclversion]
21
22
23
24
25
##--moo: force default system and stdio encoding to UTF-8
encoding system utf-8
fconfigure stderr -encoding utf-8
fconfigure stdout -encoding utf-8
##--/moo
26

27
28
29
30
31
if { [info tclversion] >= 8.5 } {

	# EDIT THIS PART TO CUSTOMIZE LINUX THEME
	# match gnome colors
	# Ubuntu Human
32
	# set linux_wm_bgcolor "#3e3d39"
33
34
	set linux_wm_bgcolor "#e5e5e5"
	# set linux_wm_hlcolor "#fdbf69"
35
36
37
	# set linux_wm_hlcolor "#f9ba81"
	# set linux_wm_hlcolor "#ffaa16"
	set linux_wm_hlcolor "#eb5f28"
38
39
40
41
42
43
44
45
46
47

	# ttk colors
	# -frame, -lighter, and -selectbg are automatically
	#	replaced by theme colors specified above
	variable colors
	array set colors {
		-frame 		"#e5e5e5"
		-window		"#ffffff"
		-darkest 	"#999999"
		-darker 	"#709970"
48
49
		#-dark		"#a8e6a8"
		-dark		"#bcbcbc"
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
		-light		"#d2ffd2"
		-lighter 	"#e5e5e5"
		-disabledfg	"#a3a3a3"
		-selectbg	"#fdbf69"
		-selectfg	"#000000"
	}
	# STOP EDITING BEYOND THIS POINT

	#sync ttk with theme choice above it
	set colors(-frame) $linux_wm_bgcolor
	set colors(-lighter) $linux_wm_bgcolor
	set colors(-selectbg) $linux_wm_hlcolor

	ttk::style theme create purty_linux -parent clam -settings {

		ttk::style configure "." \
			-background 	$colors(-frame) \
			-foreground 	black \
			-bordercolor	$colors(-darkest) \
			-selectbackground 	$colors(-selectbg) \
			-selectforeground 	$colors(-selectfg) \
			-troughcolor	$colors(-dark) \
			-arrowcolor 	$colors(-darkest) \
			-font 		TkDefaultFont \
			;

		ttk::style map "." -background \
			[list disabled $colors(-frame)  active $colors(-lighter)] ;
		ttk::style map "." -foreground [list disabled $colors(-disabledfg)] ;
		    ttk::style map "." -embossed [list disabled 0] ;

		ttk::style configure TButton \
			-anchor center -width -11 -padding "1 1" \
			-relief raised -shiftrelief 1 \
			-highlightthickness 1 -highlightcolor $colors(-selectbg)

		ttk::style map TButton -relief {
			{pressed !disabled} 	sunken
			{active !disabled} 	raised
		} -highlightcolor {alternate black}

		ttk::style configure TCheckbutton \
			-indicatorcolor $colors(-window) -padding 2
		ttk::style configure TRadiobutton \
			-indicatorcolor $colors(-window) -padding 2
		ttk::style map TCheckbutton -indicatorcolor \
			[list  disabled $colors(-frame)  pressed $colors(-frame)]
		ttk::style map TRadiobutton -indicatorcolor \
			[list  disabled $colors(-frame)  pressed $colors(-frame)]

		ttk::style configure TMenubutton \
			-width -11 -padding "3 3" -relief raised

		ttk::style configure TEntry \
			-padding 1 -fieldbackground $colors(-window) ;
		ttk::style map TEntry -fieldbackground \
			[list readonly $colors(-frame) disabled $colors(-frame)]
		ttk::style configure TCombobox \
			-padding 1 -fieldbackground $colors(-window) ;
		ttk::style map TCombobox -fieldbackground \
			[list readonly $colors(-frame) disabled $colors(-frame)]

		ttk::style configure Toolbutton -relief flat -padding 2
		ttk::style map Toolbutton -relief \
			{disabled flat selected sunken pressed sunken active raised}
		ttk::style map Toolbutton -background \
			[list pressed $colors(-dark)  active $colors(-light)]

		ttk::style configure TScrollbar -relief raised
		ttk::style configure TScale \
			-groovewidth 4 -troughrelief sunken \
			-sliderwidth raised -borderwidth 2
		ttk::style configure TProgressbar \
			-background $colors(-selectbg) -borderwidth 0

		ttk::style configure TLabelframe -relief groove -borderwidth 2

		ttk::style configure TNotebook -tabmargins {2 2 1 0}
		ttk::style configure TNotebook.Tab \
			-padding {4 2} -background $colors(-dark)
		ttk::style map TNotebook.Tab \
			-background [list selected $colors(-frame)] \
			-expand [list selected {2 2 1 0}] \
			;

		ttk::style configure Treeview -fieldbackground $colors(-window)
		ttk::style configure Heading -font TkHeadingFont -relief raised
		ttk::style configure Row -background $colors(-window)
		ttk::style map Row \
			-background [list selected $colors(-selectbg)]
		ttk::style map Item \
			-foreground [list selected $colors(-selectfg)]
		ttk::style map Cell \
			-foreground [list selected $colors(-selectfg)]
	}
}

# Automate matching of the linux wm and use ttk where possible
# As of right now it is only enabled if system is Linux/Unix using tcl >= 8.5
proc match_linux_wm {list} {
	global pd_nt linux_wm_bgcolor linux_wm_hlcolor
	if { [info tclversion] >= 8.5 && $pd_nt == 0 } {
		if {[lsearch -regexp $list ::] == -1} {
153
			#puts stderr [lindex $list 0]
154
155
156
157
			if {[lindex $list 0] != "button" \
				&& [lindex $list 0] != "checkbutton" \
				&& [lindex $list 0] != "radiobutton" \
				&& [lindex $list 0] != "entry" \
158
159
				&& [lindex $list 0] != "scrollbar" \
				&& [lindex $list 1] != "add"} { 
160
161
162
163
164
165
166
					lappend list -bg $linux_wm_bgcolor
			}
			if {[lindex $list 0] == "listbox" \
				|| [lindex $list 0] == "text"} {

				lappend list -bg white -highlightcolor $linux_wm_hlcolor
			}
167
168
169
170
171
			if {[lindex $list 1] == "add"} {
	
				#lappend list -background "#000000"
				set newlist [list [lindex $list 0] add command -label {} -state disabled]
			}
172
173
			if {[lindex $list 0] == "menu"} {
	
174
				lappend list -activebackground $linux_wm_hlcolor -bg "#3c3b37" -fg "#dddddd" -bd 0 -activeborderwidth 0 -relief flat -disabledforeground "#777777"
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
			}
			#convert non-ttk objects to ttk objects
			if {[lindex $list 0] == "button" \
				|| [lindex $list 0] == "checkbutton" \
				|| [lindex $list 0] == "radiobutton" \
				|| [lindex $list 0] == "entry" \
				|| [lindex $list 0] == "scrollbar"} { 
				set newlist [lreplace $list 0 0 ttk::[lindex $list 0]]
			}
		}
	}
	if {[info exists newlist]} {
		eval $newlist
	} else {
		eval $list
	}
}

Miller Puckette's avatar
Miller Puckette committed
193
194
if { $tcl_platform(platform) == "windows" }  {
    set pd_nt 1
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
195
    set ctrl_key "Control"
196
    # fontsc
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
197
    set defaultFontFamily {DejaVu Sans Mono}
198
    font create menuFont -family Tahoma -size 10
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
199
200
201
202
203
204
205
206
    # mouse cursors
    set cursor_runmode_nothing "arrow"
    set cursor_runmode_clickme "right_ptr"
    set cursor_runmode_thicken "sb_v_double_arrow"
    set cursor_runmode_addpoint "plus"
    set cursor_editmode_nothing "hand2"
    set cursor_editmode_connect "circle"
    set cursor_editmode_disconnect "X_cursor"
207
208
	set cursor_editmode_resize "sb_h_double_arrow"
	set cursor_editmode_resize_bottom_right "bottom_right_corner"
209
	set cursor_scroll "fleur"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
210
211
212
213
214
215
216
217
218
219
220
221
222
	# set file types that open/save recognize
	set filetypes {
		{{Pd Files}         {.pd}  }
		{{Max Patch Files}  {.pat} }
		{{Max Text Files}   {.mxt} }
		{{Max Binary Files} {.mxb} }
		{{Max Help Files}   {.help} }
	}
	# use CommonProgramFiles by default instead because its a lot easier to
	# find. Microsoft seems to have carefully hidden the AppData folder from
	# all but the most determined users.
	#set externalsdir "$::env(AppData)/Pd"
	set externalsdir "$::env(CommonProgramFiles)/Pd"
Miller Puckette's avatar
Miller Puckette committed
223
224
} elseif { $tcl_platform(os) == "Darwin" } {  
    set pd_nt 2
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
225
226
	set ctrl_key "Mod1"
    # fonts
Miller Puckette's avatar
Miller Puckette committed
227
    set defaultFontFamily Monaco
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
228
229
230
231
232
233
234
235
    # mouse cursors
    set cursor_runmode_nothing "arrow"
    set cursor_runmode_clickme "center_ptr"
    set cursor_runmode_thicken "sb_v_double_arrow"
    set cursor_runmode_addpoint "plus"
    set cursor_editmode_nothing "hand2"
    set cursor_editmode_connect "circle"
    set cursor_editmode_disconnect "X_cursor"
236
237
	set cursor_editmode_resize "sb_h_double_arrow"
	set cursor_editmode_resize_bottom_right "bottom_right_corner"
238
	set cursor_scroll "fleur"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
239
240
241
242
243
244
245
246
247
	# set file types that open/save recognize
	set filetypes {
		{{Pd Files}                {.pd}  }
		{{Max Patch Files (.pat)}  {.pat} }
		{{Max Text Files (.mxt)}   {.mxt} }
		{{Max Binary Files (.mxb)} {.mxb} }
		{{Max Help Files (.help)}  {.help} }
	}
	set externalsdir "$::env(HOME)/Library/Pd"
Miller Puckette's avatar
Miller Puckette committed
248
} else { 
249
250
	# set nicer theme
	ttk::style theme use purty_linux
251
	clipboard clear
252
	set window_prefs {}
Miller Puckette's avatar
Miller Puckette committed
253
    set pd_nt 0
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
254
    set ctrl_key "Control"
255
256
257
	# Shift modifier
	set shift_l_down 0
	set shift_r_down 0
258
259
260
	# Ctrl modifier
	set ctrl_l_down 0
	set ctrl_r_down 0
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
261
262
263
264
265
266
267
268
    # fonts
    set defaultFontFamily {DejaVu Sans Mono}
    # mouse cursors
    set cursor_runmode_nothing "left_ptr"
    set cursor_runmode_clickme "right_ptr"
    set cursor_runmode_thicken "sb_v_double_arrow"
    set cursor_runmode_addpoint "plus"
    set cursor_editmode_nothing "hand2"
269
    set cursor_editmode_connect "target"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
270
    set cursor_editmode_disconnect "X_cursor"
271
272
	set cursor_editmode_resize "sb_h_double_arrow"
	set cursor_editmode_resize_bottom_right "bottom_right_corner"
273
	set cursor_scroll "fleur"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
274
275
276
277
278
279
280
281
	# set file types that open/save recognize
	set filetypes {
		{{pd files}         {.pd}  }
		{{max patch files}  {.pat} }
		{{max text files}   {.mxt} }
		{{max binary files} {.mxb} }
		{{max help files}   {.help} }
	}
282
	set externalsdir "$::env(HOME)/pd-l2ork-externals"
Ivica Bukvic's avatar
Ivica Bukvic committed
283
284
}   

285
286
287
#proc bgerror {message} {
#	pdtk_post "\ntcl error: $message"
#}     
Miller Puckette's avatar
Miller Puckette committed
288

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
# make sure the user folder for installing externals exists
catch {
	if { ! [file exists $externalsdir] && [file exists [file dirname $externalsdir]] } {
		puts stderr "Creating folder for user-installed externals: \n\t$externalsdir"
		file mkdir $externalsdir
	}
}


# namespace for general-purpose functions
proc pdtk_encode { listdata } {
    set outlist {}
    foreach this_path $listdata {
        if {0==[string match "" $this_path]} {
            lappend outlist [pdtk_encodedialog $this_path]
        }
    }
    return $outlist
}


# args is a list of length 1 or 2,
# specifying optional additional x, y offsets for the window
proc center_window { w args } {
    set offx 0
    set offy 0

    if { [llength $args] >= 2 } {
        set offx [lindex $args 0]
        set offy [lindex $args 1]
    }

    set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \
        - [winfo vrootx [winfo parent $w]] + $offx]
    set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \
        - [winfo vrooty [winfo parent $w]] + $offy]
    wm geom $w +$x+$y
}


Miller Puckette's avatar
Miller Puckette committed
329
330
331
# start Pd-extended font hacks -----------------------------

# Pd-0.39.2-extended hacks to make font/box sizes the same across platform
332
#puts stderr "tk scaling is [tk scaling]"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
333
tk scaling 1
Miller Puckette's avatar
Miller Puckette committed
334
335

# this font is for the Pd Window console text
336
font create console_font -family $defaultFontFamily -size 9 -weight normal
Miller Puckette's avatar
Miller Puckette committed
337
# this font is for text in Pd windows
338
font create text_font -family $defaultFontFamily -size 9 -weight normal
Miller Puckette's avatar
Miller Puckette committed
339
# for text in Properties Panels and other panes
340
font create highlight_font -family $defaultFontFamily -size 9 -weight bold
Miller Puckette's avatar
Miller Puckette committed
341
342
343

# end Pd-extended font hacks -----------------------------

344
345
# K-12 version global variable (enabled through -k12, disabled by default)
set k12_mode 0
346
set k12_saveas_on_new 0
347
348
349
350
351
352
353
354

# Only can be enabled at startup (cannot be toggled afterwards)
proc pdtk_enable_k12_mode {extra_dir} {
	global k12_mode
	global signal_cord_width
	global autotips
	global signal_cord_highlight
	global signal_cord
355
	global highlight_width
356
357

	set k12_mode 1
358
	set signal_cord_width 5
359
360
361
	set autotips 1
	set signal_cord_highlight "#474"
	set signal_cord "#2ca7d4"
362
	set highlight_width 7
363

364
365
366
367
	image create photo i.wii_connect -file $extra_dir/K12/icons/wii_connect_on.png
	image create photo i.wii_buttons -file $extra_dir/K12/icons/wii_buttons.png
	image create photo i.wii_speed -file $extra_dir/K12/icons/wii_speed.png
	image create photo i.wii_hit -file $extra_dir/K12/icons/wii_hit.png
368

369
	image create photo i.sarcduino -file $extra_dir/K12/icons/sarcduino_on.png
370
371
372
	image create photo i.sarcduino_digital -file $extra_dir/K12/icons/sarcduino_digital.png
	image create photo i.sarcduino_analog -file $extra_dir/K12/icons/sarcduino_analog.png
	image create photo i.sarcduino_hit -file $extra_dir/K12/icons/sarcduino_hit.png
373
	image create photo i.sarcduino_piezo -file $extra_dir/K12/icons/sarcduino_piezo.png
374
375
	#image create photo i.sarcduino_net -file $extra_dir/K12/icons/sarcduino_net.png

376
	image create photo i.math_number -file $extra_dir/K12/icons/math_number.png
377
378
379
380
	image create photo i.math_netsend -file $extra_dir/K12/icons/math_netsend.png
	image create photo i.math_netreceive -file $extra_dir/K12/icons/math_netreceive.png
	image create photo i.math_tag -file $extra_dir/K12/icons/math_tag.png
	image create photo i.math_routebytag -file $extra_dir/K12/icons/math_routebytag.png
381

382
	image create photo i.math_average -file $extra_dir/K12/icons/math_average.png
383
	image create photo i.math_random -file $extra_dir/K12/icons/math_random.png
384
385
386
387
	image create photo i.math_add -file $extra_dir/K12/icons/math_add.png
	image create photo i.math_subtract -file $extra_dir/K12/icons/math_subtract.png
	image create photo i.math_multiply -file $extra_dir/K12/icons/math_multiply.png

388
	image create photo i.math_divide -file $extra_dir/K12/icons/math_divide.png
389
	image create photo i.math_scale -file $extra_dir/K12/icons/math_scale.png
390

391
	image create photo i.logic_compare -file $extra_dir/K12/icons/logic_compare.png
392
	image create photo i.logic_mapper -file $extra_dir/K12/icons/logic_mapper.png
393
394
395
396
	image create photo i.logic_metronome -file $extra_dir/K12/icons/logic_metronome.png
	image create photo i.logic_counter -file $extra_dir/K12/icons/logic_counter.png
	image create photo i.logic_sequencer -file $extra_dir/K12/icons/logic_sequencer.png

397
398
399
	image create photo i.preset -file $extra_dir/K12/icons/preset.png
	image create photo i.comment -file $extra_dir/K12/icons/comment.png

400
	image create photo i.signal_microphone -file $extra_dir/K12/icons/signal_microphone.png
401
402
	image create photo i.signal_netsend -file $extra_dir/K12/icons/signal_netsend.png
	image create photo i.signal_netreceive -file $extra_dir/K12/icons/signal_netreceive.png	
403
	image create photo i.signal_sampler -file $extra_dir/K12/icons/signal_sampler.png
404
	image create photo i.signal_player -file $extra_dir/K12/icons/signal_player.png
405
406
407
408
409

	image create photo i.signal_sine -file $extra_dir/K12/icons/signal_sine.png
	image create photo i.signal_saw -file $extra_dir/K12/icons/signal_saw.png
	image create photo i.signal_square -file $extra_dir/K12/icons/signal_square.png
	image create photo i.signal_triangle -file $extra_dir/K12/icons/signal_triangle.png
410
	image create photo i.signal_envelope -file $extra_dir/K12/icons/signal_envelope.png
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427

	image create photo i.signal_noise -file $extra_dir/K12/icons/signal_noise.png
	image create photo i.signal_pink -file $extra_dir/K12/icons/signal_pink.png
	image create photo i.signal_add -file $extra_dir/K12/icons/signal_add.png
	image create photo i.signal_multiply -file $extra_dir/K12/icons/signal_multiply.png

	image create photo i.instr_short1 -file $extra_dir/K12/icons/instr_short1.png
	image create photo i.instr_short2 -file $extra_dir/K12/icons/instr_short2.png
	image create photo i.instr_sustained1 -file $extra_dir/K12/icons/instr_sustained1.png
	image create photo i.instr_sustained2 -file $extra_dir/K12/icons/instr_sustained2.png

	image create photo i.fx_filter -file $extra_dir/K12/icons/fx_filter.png
	image create photo i.fx_multitap -file $extra_dir/K12/icons/fx_multitap.png
	image create photo i.fx_reverb -file $extra_dir/K12/icons/fx_reverb.png

	image create photo i.output -file $extra_dir/K12/icons/audio_on.png

428
429
	image create photo i.edit -file $extra_dir/K12/icons/edit.png
	image create photo i.perform -file $extra_dir/K12/icons/perform.png
430

431
432
433
434
435
	image create photo i.data -file $extra_dir/K12/icons/data.png
	image create photo i.sound -file $extra_dir/K12/icons/sound.png
	image create photo i.data_on -file $extra_dir/K12/icons/data_on.png
	image create photo i.sound_on -file $extra_dir/K12/icons/sound_on.png

436
	#pack forget .controls.switches.audiobutton
437
	#pack forget .controls.inout
438
	#.mbar.audio delete 0 2
439
440
}

441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
# calculate offset on a movable canvas
set tmp_xpix 0
set tmp_ypix 0

set popup_xpix 0
set popup_ypix 0

# monitor pointer position
set pointer_x_local 0
set pointer_y_local 0

set pointer_x_virtual 0
set pointer_y_virtual 0

set pointer_x_global 0
set pointer_y_global 0

# text pasting global
set copytexttocanvas 0

461
set global_clipboard 0
462
463
# used for comparison to avoid redundant copyfromexternalbuffer
set last_clipboard 0
464
465
set global_selection 0

466
467
468
469
470
471
472
#TOOLTIPS PATCH
#TODO: make a separate tcl file for tooltips and put
#afterid in its scope    
variable afterid 0
variable duplicate_tags -1
variable current_window 0
variable nlet_color 0
473
variable autotips 0
474
#variable magicglass 0
475
variable tooltip_visible 0
476

477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
# x:y location tooltip during dragging
set tooltip [toplevel .tooltip -bd 1 -bg black]
wm attributes $tooltip -topmost 1
wm overrideredirect $tooltip 1
pack [label $tooltip.label -bg lightyellow -fg black -text aaa -justify left]
wm withdraw $tooltip

# timeout for the tooltip
proc pdtk_toggle_xy_tooltip {name num} {
	global tooltip
	if {$num == 0} {
		wm withdraw $tooltip
	} else {
		wm deiconify $tooltip
	}
}

proc pdtk_update_xy_tooltip {name x y} {
	global tooltip
	global pointer_x_virtual pointer_y_virtual pointer_x_global pointer_y_global
	wm geometry $tooltip +[expr $pointer_x_global+15]+[expr $pointer_y_global-2]
	$tooltip.label configure -text [concat x: $x\ny: $y]
	set pointer_x_virtual $x
	set pointer_y_virtual $y
}

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
503
504
505
506
507
508
509
510
511
512
513
514
# begin hack to hide hidden files/folder in tk browser on unix ----------
if {$pd_nt == 0} {
    # load the dialog once, otherwise setting the vars will not work
    catch {tk_getOpenFile -with-invalid-argument} 

    # change the environment variables
    namespace eval ::tk::dialog::file {
    variable showHiddenBtn 1
    variable showHiddenVar 0
    }
}
# end hidden files/folder hack ------------------
Miller Puckette's avatar
Miller Puckette committed
515

516
# Tearoff is set to false by default:
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
517
set pd_tearoff 0
518
519
# Put menu tearoff is set to true by default:
set put_tearoff 1
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
520
521
# turn off tearoff menus globally
#option add *tearOff 0
Miller Puckette's avatar
Miller Puckette committed
522
523
524
525
526
527
528
529

# jsarlo
set pd_array_listview_pagesize 1000
set pd_array_listview_id(0) 0
set pd_array_listview_entry(0) 0
set pd_array_listview_page(0) 0
# end jsarlo

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
530
531
532
# color scheme
set canvas_fill "white"
set text_color "#000"
533
set select_color "#e87216"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
534
535
536
537
538
539
540
541
542
543
set dash_outline "#f00"
set dash_fill "#f7f7f7"
set box_outline "#ccc"
set graph_outline "#777"
set atom_box_fill "#eee"
set msg_box_fill "#f8f8f6"
set obj_box_fill "#f6f8f8"
set signal_cord_highlight "#58a"
set signal_cord "#808095"
set signal_nlet $signal_cord
544
set signal_cord_width 3
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
545
546
547
548
set msg_cord_highlight "#474"
set msg_cord "#565"
set msg_nlet "white"
set mixed_nlet "#88aaff"
549
set msg_cord_width 1
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
550

551
552
#nlet highlighting stuff
set select_nlet_color $select_color
553
set highlight_width 5
554

Miller Puckette's avatar
Miller Puckette committed
555
556
557
558
if {$pd_nt == 1} {
    global pd_guidir
    set pd_gui2 [string range $argv0 0 [expr [string last \\ $argv0 ] - 1]]
    regsub -all \\\\ $pd_gui2 / pd_gui3
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
559
    set pd_guidir [file normalize $pd_gui3/..]
Miller Puckette's avatar
Miller Puckette committed
560
561
562
563
    load $pd_guidir/bin/pdtcl.dll
}

if {$pd_nt == 2} {
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
564
    # turn on James Tittle II's fast drawing
Miller Puckette's avatar
Miller Puckette committed
565
    set tk::mac::useCGDrawing 1
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
566
567
    # anti-alias all lines that need it
    set tk::mac::CGAntialiasLimit 0
Miller Puckette's avatar
Miller Puckette committed
568
569
    global pd_guidir
    set pd_gui2 [string range $argv0 0 [expr [string last / $argv0 ] - 1]]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
570
    set pd_guidir [file normalize $pd_gui2/..]
Miller Puckette's avatar
Miller Puckette committed
571
572
573
574
575
576
577
578
579
580
581
582
583
    load $pd_guidir/bin/libPdTcl.dylib
    global pd_macready
    set pd_macready 0
    global pd_macdropped
    set pd_macdropped ""
    # tk::mac::OpenDocument is called with the filenames put into the 
    # var args whenever docs are either dropped on the Pd.app icon or 
    # opened from the Finder.
    # It uses menu_doc_open so it can handles numerous file types.
    proc tk::mac::OpenDocument {args} {
        global pd_macready pd_macdropped
        foreach file $args {
            if {$pd_macready != 0} {
584
585
                pd [concat pd open [pdtk_enquote [file tail $file]] \
                        [pdtk_enquote  [file dirname $file]] \;]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
586
                menu_doc_open [file dirname $file] [file tail $file]
Miller Puckette's avatar
Miller Puckette committed
587
588
589
590
591
            } else {
                set pd_macdropped $args
            }
        }
    }
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
592
593
594
595
596
	# intercept kAEQuitApplication from Cmd-Q
	proc ::tk::mac::Quit {} {
		puts stderr "::tk::mac::Quit"
		menu_quit
	}
Miller Puckette's avatar
Miller Puckette committed
597
598
599
600
601
602
603
604
605
606
607
608
609
}

# hack so you can easily test-run this script in linux... define pd_guidir
# (which is normally defined at startup in pd under linux...)

if {$pd_nt == 0} {
    if {! [info exists pd_guidir]} {
        global pd_guidir
        puts stderr {setting pd_guidir to '.'}
        set pd_guidir .
    }
}

610
611
#set pd_deffont {courier 10}
set pd_deffont console_font
Miller Puckette's avatar
Miller Puckette committed
612
613
614

set help_top_directory $pd_guidir/doc

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
615
616
617
618
619
620
621
622
#==============================================================================#
# pd-gui-rewrite-0.43 help browser backport

# Pd's packages are stored in the same directory as the main script (pd-gui.tcl)
set auto_path [linsert $auto_path 0 [file dirname [info script]]]
# the pd-gui-rewrite-0.43 help browser is backported to Pd-extended 0.42
package require helpbrowser
package require msgcat
623
package require tkpng
Miller Puckette's avatar
Miller Puckette committed
624

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
625
626
627
628
629
630
631
632
633
634
635
636
637
# official GNU gettext msgcat shortcut
proc _ {s} {return [::msgcat::mc $s]}

namespace eval ::pdwindow:: {
    proc verbose {level postme} {puts stderr "$level: $postme"}
    proc error {postme} {puts stderr $postme; pdtk_post $postme}
    proc warn {postme} {::pdwindow::error $postme}
}

set ::dialog_menubar .mbar
set ::modifier $ctrl_key
set ::sys_libdir $pd_guidir
switch $pd_nt {
638
    0 {set ::pd_path [list ~/pd-l2ork-externals /usr/local/lib/pd-l2ork-externals]}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
639
640
641
642
643
    1 {set ::pd_path [list [file normalize $::env(AppData)/Pd] \
                          [file normalize $::env(CommonProgramFiles)/Pd]]}
    2 {set ::pd_path [list ~/Library/Pd /Library/Pd]}
}
#==============================================================================#
Miller Puckette's avatar
Miller Puckette committed
644
645
646
647
648

################## set up main window #########################
# the menus are instantiated here for the main window
# for the patch windows, they are created by pdtk_canvas_new

649
650
651
652
653
654
655
656
657
#ttk error button customizations
ttk::style configure IOErrorOn.TButton -background "#dd2222"
ttk::style map IOErrorOn.TButton -background [list active "#ff2222"] \
	-foreground [list disabled black]
ttk::style configure IOErrorOff.TButton -background lightgrey
ttk::style map IOErrorOff.TButton -background [list active $colors(-frame)]

match_linux_wm [list menu .mbar -relief flat]
match_linux_wm [list menu .mbar.file -tearoff $pd_tearoff]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
658
.mbar add cascade -label File -menu .mbar.file
659
match_linux_wm [list menu .mbar.edit -tearoff $pd_tearoff]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
660
.mbar add cascade -label Edit -menu .mbar.edit
661
match_linux_wm [list menu .mbar.put -tearoff $pd_tearoff]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
662
.mbar add cascade -label Put -menu .mbar.put
663
664
665
666
667
#match_linux_wm [list menu .mbar.find -tearoff $put_tearoff]
#.mbar add cascade -label Find -menu .mbar.find
match_linux_wm [list menu .mbar.windows -postcommand [concat pdtk_fixwindowmenu] \
	-tearoff $pd_tearoff]
match_linux_wm [list menu .mbar.audio -tearoff $pd_tearoff]
Miller Puckette's avatar
Miller Puckette committed
668
669
670
if {$pd_nt != 2} {
    .mbar add cascade -label "Windows" -menu .mbar.windows
    .mbar add cascade -label "Media" -menu .mbar.audio
671
    match_linux_wm [list menu .mbar.help -tearoff $pd_tearoff]
Miller Puckette's avatar
Miller Puckette committed
672
673
674
675
    .mbar add cascade -label "Help" -menu .mbar.help
} else {
    menu .mbar.apple -tearoff 0
    .mbar add cascade -label "Apple" -menu .mbar.apple 
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
676
    # arrange menus according to Apple HIG
Miller Puckette's avatar
Miller Puckette committed
677
678
    .mbar add cascade -label "Media" -menu .mbar.audio
    .mbar add cascade -label "Window" -menu .mbar.windows
679
    match_linux_wm [list menu .mbar.help -tearoff $pd_tearoff]
Miller Puckette's avatar
Miller Puckette committed
680
681
682
    .mbar add cascade -label "Help" -menu .mbar.help
}

Miller Puckette's avatar
Miller Puckette committed
683
684
685
# fix menu font size on Windows with tk scaling = 1
if {$pd_nt == 1} {
    .mbar.file configure -font menuFont
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
686
    .mbar.edit configure -font menuFont
Miller Puckette's avatar
Miller Puckette committed
687
688
689
690
691
692
    .mbar.find configure -font menuFont
    .mbar.windows configure -font menuFont
    .mbar.audio configure -font menuFont
    .mbar.help configure -font menuFont
}

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
693
694
proc showhide_printouttext {state} {
    if {$state} {
695
696
        #pack .printout -side bottom -fill both -expand 1
		#pack .controls.clr_console -pady 30
697
698
699
		wm deiconify .printout
		#wm resizable . 1 1
		#wm minsize . 460 194
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
700
    } else {
701
        #pack forget .printout
702
703
704
705
706
		wm withdraw .printout
		#pack forget .controls.clr_console
		#wm minsize . 0 0
		#wm geometry . 355x75
		#wm resizable . 0 0
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
707
708
709
    }
}

Miller Puckette's avatar
Miller Puckette committed
710
711
712
713
set ctrls_audio_on 0
set ctrls_meter_on 0
set ctrls_inlevel 0
set ctrls_outlevel 0
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
714
set show_text_window 0
Miller Puckette's avatar
Miller Puckette committed
715

716
match_linux_wm [list frame .controls]
717
718
719
720
721
722
#if { [info tclversion] >= 8.5 && $pd_nt == 0 } {
#	ttk::separator .eyecandy
#	pack .eyecandy .controls -fill x -expand 0
#} else {
pack .controls -fill x -expand 1
#}
723
724
match_linux_wm [list frame .controls.switches]
match_linux_wm [list checkbutton .controls.switches.audiobutton -text {compute audio  } \
Miller Puckette's avatar
Miller Puckette committed
725
    -variable ctrls_audio_on \
726
    -command {pd [concat pd dsp $ctrls_audio_on \;]}]
Miller Puckette's avatar
Miller Puckette committed
727

728
match_linux_wm [list checkbutton .controls.switches.meterbutton -text {peak meters  } \
Miller Puckette's avatar
Miller Puckette committed
729
    -variable ctrls_meter_on \
730
    -command {pd [concat pd meters $ctrls_meter_on \;]}]
Miller Puckette's avatar
Miller Puckette committed
731

732
match_linux_wm [list checkbutton .controls.switches.console -text "console" \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
733
    -variable show_console \
734
    -command {showhide_printouttext $show_console}]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
735

Miller Puckette's avatar
Miller Puckette committed
736
pack .controls.switches.audiobutton .controls.switches.meterbutton \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
737
    .controls.switches.console -side top -anchor w
Miller Puckette's avatar
Miller Puckette committed
738

739
740
741
742
743
744
745
746
747
748
749
750
751
752
match_linux_wm [list frame .controls.inout]
match_linux_wm [list frame .controls.inout.in]
match_linux_wm [list label .controls.inout.in.label -text IN]
entry .controls.inout.in.level -textvariable ctrls_inlevel -width 3 \
	-highlightthickness 0 -takefocus 0 -state readonly -readonlybackground white
if { [info tclversion] >= 8.5 && $pd_nt == 0 } {
	match_linux_wm [list button .controls.inout.in.clip \
		-text {CLIP} -state disabled -style IOErrorOff.TButton -width 4]
} else {
	button .controls.inout.in.clip -text {CLIP} -state disabled
}

match_linux_wm [list frame .controls.inout.in.spacer]

Miller Puckette's avatar
Miller Puckette committed
753
pack .controls.inout.in.label .controls.inout.in.level \
754
755
756
757
758
759
760
761
762
763
764
765
766
767
    .controls.inout.in.clip .controls.inout.in.spacer -side top -pady 1

match_linux_wm [list frame .controls.inout.out]
match_linux_wm [list label .controls.inout.out.label -text OUT]
entry .controls.inout.out.level -textvariable ctrls_outlevel -width 3 \
	 -highlightthickness 0 -takefocus 0 -state readonly -readonlybackground white
if { [info tclversion] >= 8.5 && $pd_nt == 0 } {
	match_linux_wm [list button .controls.inout.out.clip \
		-text {CLIP} -state disabled -style IOErrorOff.TButton -width 4]
} else {
	button .controls.inout.out.clip -text {CLIP} -state disabled
}

match_linux_wm [list frame .controls.inout.out.spacer]
Miller Puckette's avatar
Miller Puckette committed
768
769

pack .controls.inout.out.label .controls.inout.out.level \
770
771
772
773
774
775
776
777
778
779
780
781
782
783
    .controls.inout.out.clip .controls.inout.out.spacer -side top -pady 1

if { [info tclversion] >= 8.5 && $pd_nt == 0 } {
	match_linux_wm [list ttk::button .controls.dio -text "\nIO Errors\n" \
		-command { if {![info exists show_console] || $show_console == 0} \
		{ menu_toggle_console; }; \
		pd [concat pd audiostatus \;]} \
		-width 8 -style IOErrorOff.TButton]
} else {
	button .controls.dio -text "DIO\nerrors" \
		-command { if {![info exists show_console] || $show_console == 0} \ 
		{ .controls.switches.console invoke; }; \
		pd [concat pd audiostatus \;]}
}
Miller Puckette's avatar
Miller Puckette committed
784

785
786
#match_linux_wm [list button .controls.clr_console -text "Clear Console" \
#	-command [concat menu_clear_console]]
Miller Puckette's avatar
Miller Puckette committed
787
788
789

pack .controls.inout.in .controls.inout.out -side left -padx 6
pack .controls.inout -side left -padx 14
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
790
791
792
pack .controls.switches -side right
pack .controls.dio -side right -padx 20

793
794
795
#if {[info exists show_console] && $show_console == 1} {
#	pack .controls.clr_console -pady 30
#}
Miller Puckette's avatar
Miller Puckette committed
796

797
toplevel .printout -class [winfo class .]
798
wm title .printout "Console"
799
# initial location of the console window (+x+y)
800
wm geometry .printout +10+170
801
# wm minsize .printout 460 194
802
wm protocol .printout WM_DELETE_WINDOW { .controls.switches.console invoke }
803
804
match_linux_wm [list frame .printout.frame]
text .printout.frame.text -relief sunken -bd 1 -font console_font \
805
    -yscrollcommand ".printout.frame.scroll set"  -width 70 -height 24 \
806
	-highlightthickness 0 -takefocus 0 -fg gray20 -state disabled
807
808
809
810
811
812
813
814
815
816
#.printout.frame.text tag configure sel -background $linux_wm_hlcolor

# .printout.frame.text insert end "\n\n\n\n\n\n\n\n\n\n"
match_linux_wm [list scrollbar .printout.frame.scroll -command ".printout.frame.text yview"]
match_linux_wm [list frame .printout.bar]
match_linux_wm [list button .printout.bar.clear -text "CLEAR" \
	-width 7 -command [concat menu_clear_console]]
match_linux_wm [list entry .printout.bar.entry \
	-textvariable send_textvariable]
bind .printout.bar.entry <KeyPress-Return> {
817
	pdtk_post "\nmessage-to-pd: $send_textvariable"
818
819
820
821
    pd [concat $send_textvariable \;]
}
#match_linux_wm [list button .printout.bar.x -text "x" \
#	-width 2 -command [concat .printout.bar.entry delete 0 end]]
822
match_linux_wm [list label .printout.bar.label -text "Send Message to Pd:"]
823
824
825

pack .printout.frame.scroll -side right -fill y
pack .printout.frame.text -side left -fill both -expand 1
826
pack .printout.bar -side bottom -fill x -expand 0
827
828
829
pack .printout.frame -fill both -expand 1
pack .printout.bar.clear -side left -padx 3 -pady 3
#pack .printout.bar.x -side right -padx 3 -pady 3
Ivica Bukvic's avatar
Ivica Bukvic committed
830
pack .printout.bar.entry -side right -fill both -expand 1 -padx 3 -pady 3
831
pack .printout.bar.label -side right -padx 3 -pady 3
Miller Puckette's avatar
Miller Puckette committed
832

833
834
835
# the console is open by default
#.controls.switches.console select
# in the case console should be turned off by default
836
837
838
839
wm withdraw .printout
#wm geometry .printout 1x1+0+0
#wm overrideredirect .printout 1
#wm transient .printout
840

841
842
bind .printout.frame.text <Button> {pdtk_update_root_edit_menu 0}
bind .printout.frame.text <<Selection>> {pdtk_update_root_edit_menu 1}
843
bind .printout <Control-Next> {menu_raisenextwindow}	
844
bind .printout <Control-w> { .controls.switches.console invoke }
845
846

proc pdtk_update_root_edit_menu {value} {
847
	#pdtk_post "update_root_edit_menu $value\n"
848
	if {$value} {
849
		set range [.printout.frame.text tag ranges sel]
850
851
		#pdtk_post "[lindex $range 0] -- [lindex $range 1]\n"
		if {[lindex $range 0] != [lindex $range 1]} {
852
			#.mbar.edit entryconfigure "Cut" -state normal
853
854
855
856
			.mbar.edit entryconfigure "Copy" -state normal
		}
	} else {
		#pdtk_post off
857
		#.mbar.edit entryconfigure "Cut" -state disabled
858
859
860
861
		.mbar.edit entryconfigure "Copy" -state disabled
	}
}

Miller Puckette's avatar
Miller Puckette committed
862
proc pdtk_post {stuff} {
863
864
865
866
	.printout.frame.text configure -state normal
    .printout.frame.text insert end $stuff
    .printout.frame.text yview end-2char
	.printout.frame.text configure -state disabled
Miller Puckette's avatar
Miller Puckette committed
867
868
869
}

proc pdtk_standardkeybindings {id} {
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
870
871
872
873
874
875
876
877
878
879
880
    global pd_nt ctrl_key
    bind $id <$ctrl_key-Key> {pdtk_canvas_ctrlkey %W %K 0}
    bind $id <$ctrl_key-Shift-Key> {pdtk_canvas_ctrlkey %W %K 1}
}

proc pdtk_panelkeybindings {id panelname} {
    global pd_nt ctrl_key
    pdtk_standardkeybindings $id
    bind $id <KeyPress-Escape> [format "%s_cancel %s" $panelname $id]
    bind $id <KeyPress-Return> [format "%s_ok %s" $panelname $id]
    bind $id <$ctrl_key-Key-w> [format "%s_cancel %s" $panelname $id]
Miller Puckette's avatar
Miller Puckette committed
881
882
883
}

pdtk_standardkeybindings .
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
884
# hacks to add standard key bindings to the Pd window
885
886
bind . <$ctrl_key-Key-a> {.printout.frame.text tag add sel 1.0 end}
#bind . <$ctrl_key-Key-x> {tk_textCut .printout.frame.text; \
887
#	.mbar.edit entryconfigure "Paste" -state normal}
888
bind . <$ctrl_key-Key-c> {tk_textCopy .printout.frame.text}
889
bind .printout <$ctrl_key-Key-c> {tk_textCopy .printout.frame.text}
890
bind .printout <$ctrl_key-Key-a> {.printout.frame.text tag add sel 1.0 end}
891
#	.mbar.edit entryconfigure "Paste" -state normal}
892
#bind . <$ctrl_key-Key-v> {tk_textPaste .printout.frame.text}
893
bind . <$ctrl_key-Key-w> {menu_quit}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
894
895
896
897
898
# kludge to add window control bindings to the Pd Window
if {$pd_nt == 2} {
	bind . <Mod1-quoteleft>  {menu_raisenextwindow}
} else {
	bind . <Control-Next>    {menu_raisenextwindow}
Ivica Bukvic's avatar
Ivica Bukvic committed
899
	bind . <Control-Prior>   {menu_raisepreviouswindow} ;# needs Tcl/Tk 8.5
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
900
}
Miller Puckette's avatar
Miller Puckette committed
901

902
903
904
905
906
907
908
909
# pass key presses inside main window to patch windows
proc pdtk_capture_root_window_keys {state key iso shift} {
	global menu_windowlist

	set first_patch_window_name [lindex $menu_windowlist 0 1]
	# pdtk_post "$first_patch_window_name\n"

	if { [string length $first_patch_window_name] > 0 } {
910
		pdtk_canvas_sendkey $first_patch_window_name.c $state $key $iso $shift 0
911
912
913
914
915
916
917
918
919
	}
}

bind . <Key> {pdtk_capture_root_window_keys 1 %K %A 0}
bind . <Shift-Key> {pdtk_capture_root_window_keys 1 %K %A 1}
bind . <KeyRelease> {pdtk_capture_root_window_keys 0 %K %A 0}
bind . <Control-Key> {pdtk_canvas_ctrlkey %W %K 0}
bind . <Control-Shift-Key> {pdtk_canvas_ctrlkey %W %K 1}

920
921
922
923
924
bind .printout <Key> {pdtk_capture_root_window_keys 1 %K %A 0}
bind .printout <Shift-Key> {pdtk_capture_root_window_keys 1 %K %A 1}
bind .printout <KeyRelease> {pdtk_capture_root_window_keys 0 %K %A 0}
bind .printout <Control-Key> {pdtk_canvas_ctrlkey %W %K 0}
bind .printout <Control-Shift-Key> {pdtk_canvas_ctrlkey %W %K 1}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
925

926
wm title . "Pure-Data L2Ork"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
927
# initial location of Pd window (+x+y)
928
wm geometry . +10+35
929
catch {
Ivica Bukvic's avatar
Ivica Bukvic committed
930
	set appicon [image create photo -format gif -file "$pd_guidir/pd-l2ork.gif"]
931
932
	wm iconphoto . -default $appicon
}
933
934
. configure -menu .mbar -width 200 -height 150
if { [info tclversion] >= 8.5 && $pd_nt == 0 } { wm resizable . 0 0 }
Miller Puckette's avatar
Miller Puckette committed
935
936
# Intercept closing the main pd window: MP 20060413:
wm protocol . WM_DELETE_WINDOW menu_quit
937
focus .
Miller Puckette's avatar
Miller Puckette committed
938

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
939

Miller Puckette's avatar
Miller Puckette committed
940
941
942
############### set up global variables ################################

set untitled_number 1
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
943
944
945
946
947
if {$pd_nt == 2} {
    set untitled_directory $::env(HOME)
} else {
    set untitled_directory [pwd]
}
Miller Puckette's avatar
Miller Puckette committed
948
949
set pd_opendir $untitled_directory
set pd_savedir $untitled_directory
950
951
952
#set pd_undoaction no
#set pd_redoaction no
#set pd_undocanvas no
Miller Puckette's avatar
Miller Puckette committed
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989

################ utility functions #########################

# enquote a string to send it to a tcl function
proc pdtk_enquote {x} {
    set foo [string map {"," "" ";" "" \" ""} $x]
    set foo2 [string map {" " "\\ "} $foo]
    concat $foo2
}

#enquote a string to send it to Pd.  Blow off semi and comma; alias spaces
#we also blow off "{", "}", "\" because they'll just cause bad trouble later.
proc pdtk_unspace {x} {
    set y [string map {" " "_" ";" "" "," "" "{" "" "}" "" "\\" ""} $x]
    if {$y == ""} {set y "empty"}
    concat $y
}

#enquote a string for preferences (command strings etc.)
proc pdtk_encodedialog {x} {
    concat +[string map {" " "+_" "$" "+d" ";" "+s" "," "+c" "+" "++"} $x]
}

proc pdtk_debug {x} {
    tk_messageBox -message $x -type ok
}

proc pdtk_watchdog {} {
    pd [concat pd watchdog \;]
    after 2000 {pdtk_watchdog}
}

proc pdtk_ping {} {
    pd [concat pd ping \;]
}

##### routine to ask user if OK and, if so, send a message on to Pd ######
Miller Puckette's avatar
Miller Puckette committed
990
proc pdtk_check {canvas x message default} {
Miller Puckette's avatar
Miller Puckette committed
991
    global pd_nt
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
992
	raise $canvas
Miller Puckette's avatar
Miller Puckette committed
993
994
995
996
997
998
    if {$pd_nt == 1} {
        set answer [tk_messageBox -message $x -type yesno -default $default \
            -icon question]
    } else {
        set answer [tk_messageBox -message $x -type yesno -default $default \
            -parent $canvas -icon question]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
999
    }
1000
1001
1002
    if {! [string compare $answer yes]}  {
		pd $message
		if {$canvas eq "."} {
1003
			focus $canvas
1004
1005
1006
1007
		} else {
			menu_close $canvas
		}
	}
Miller Puckette's avatar
Miller Puckette committed
1008
1009
}

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1010
1011
1012
1013
1014
##### ask user Save? Discard? Cancel?, and if so, send a message on to Pd ######
proc pdtk_canvas_menuclose {window reply} {
	global pd_nt
	raise $window
	set filename [wm title $window]
1015
	set message [format {Do you wish to save the changes you made in "%s"?} $filename]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1016
1017
1018
	set answer [tk_messageBox -message $message -type yesnocancel -default "yes" \
					-parent $window -icon question]
	switch -- $answer {
1019
		yes {
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1020
			pd [concat $window menusave \;]
1021
1022
1023
1024
1025
1026
			#when quitting the application sometimes the save menu fails to show up
			#after 250 pd $reply
			#pd $reply
		}
		no {
			pd [concat $window dirty 0 \;]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1027
1028
1029
1030
1031
1032
			pd $reply
		}
		cancel {}
	}
}

Miller Puckette's avatar
Miller Puckette committed
1033
1034
1035
set menu_windowlist {} 

proc pdtk_fixwindowmenu {} {
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
    global menu_windowlist pd_nt k12_mode
	if { $k12_mode == 0 } {
		.mbar.windows delete 0 end
		if {$pd_nt == 2} {
			.mbar.windows add command -label {Minimize} -command {menu_minimize .} \
				-accelerator [accel_munge "Ctrl+m"]
			.mbar.windows add command -label {Zoom} -command {menu_zoom .}
		} else {
			.mbar.windows add command -label "Next Window" -command {menu_raisenextwindow} \
				-accelerator "Ctrl+PageDown"
Ivica Bukvic's avatar
Ivica Bukvic committed
1046
1047
			.mbar.windows add command -label "Previous Window" -command {menu_raisepreviouswindow} \
				-accelerator "Ctrl+PageUp"
1048
		}
1049
		match_linux_wm [list .mbar.windows add separator]
1050
1051
1052
		.mbar.windows add command -label {parent window} -state disabled
		.mbar.windows add command -label {Pd & Console} -command menu_raise_console \
			-accelerator [accel_munge "Ctrl+;"] -state disabled
1053
		match_linux_wm [list .mbar.windows add separator]
1054
1055
1056
1057
1058
		foreach i $menu_windowlist {
		    .mbar.windows add command -label [lindex $i 0] \
		        -command [concat menu_domenuwindow [lindex $i 1]]
		    menu_fixwindowmenu [lindex $i 1]
		}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1059
	}
Miller Puckette's avatar
Miller Puckette committed
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
}

####### Odd little function to make better Mac accelerators #####

proc accel_munge {acc} {
    global pd_nt

    if {$pd_nt == 2} {
        if [string is upper [string index $acc end]] {
            return [format "%s%s" "Shift+" \
                        [string toupper [string map {Ctrl Meta} $acc] end]]
        } else {
            return [string toupper [string map {Ctrl Meta} $acc] end]
        }
    } else {
        return $acc
    }
}



###############  the "New" menu command  ########################
proc menu_new {} {
    global untitled_number
    global untitled_directory
1085
	global k12_mode
1086
	global k12_saveas_on_new
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1087
1088
1089
    if { ! [file isdirectory $untitled_directory]} {set untitled_directory $::env(HOME)}
    pd [concat pd filename Untitled-$untitled_number \
			[pdtk_enquote $untitled_directory] \;]
1090
	if { $k12_mode == 1 } {
1091
		set k12_saveas_on_new 1
1092
1093
		pd {
		    #N canvas;
1094
			#X obj -30 -30 preset_hub k12 1 %hidden%;
1095
1096
1097
1098
1099
1100
1101
1102
		    #X pop 1;
		}
	} else {
		pd {
		    #N canvas;
		    #X pop 1;
		}
	}
Miller Puckette's avatar
Miller Puckette committed
1103
1104
1105
1106
1107
    set untitled_number [expr $untitled_number + 1]
}

################## the "Open" menu command #########################

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
proc menu_open {} {
    global pd_opendir filetypes
    if { ! [file isdirectory $pd_opendir]} {set pd_opendir $::env(HOME)}
    set files [tk_getOpenFile -defaultextension .pd \
					  -multiple true \
                      -filetypes $filetypes -initialdir $pd_opendir]
    if {$files != ""} {
		foreach filename $files {
			open_file $filename
		}
	}
Miller Puckette's avatar
Miller Puckette committed
1119
1120
}

1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
proc menu_k12_open_demos {} {
	global pd_guidir filetypes
	if { ! [file isdirectory $pd_guidir/extra/K12/demos]} {
		set files [tk_getOpenFile -defaultextension .pd \
						  -multiple true \
		                  -filetypes $filetypes -initialdir $pd_guidir/extra/]
	} else {
		set files [tk_getOpenFile -defaultextension .pd \
						  -multiple true \
		                  -filetypes $filetypes -initialdir $pd_guidir/extra/K12/demos]
	}
    if {$files != ""} {
		foreach filename $files {
			open_file $filename
		}
	}	
}

1139
1140
1141
1142
1143
1144
1145
proc pdtk_set_current_dir {path_and_filename} {
	global pd_opendir untitled_directory
	set directory [file dirname $path_and_filename]
	set pd_opendir $directory
	set untitled_directory $directory
}

Miller Puckette's avatar
Miller Puckette committed
1146
proc open_file {filename} {
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1147
    global pd_opendir pd_guidir pd_nt
1148
	#puts stderr open_file
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
	set directory [file dirname $filename]
	set basename [file tail $filename]
    if {[regexp -nocase -- "\.(pat|mxb|help)$" $basename]} {
		puts stderr "converting $filename"
		if {$pd_nt == 0} { 
			# on GNU/Linux, cyclist is installed into /usr/bin usually
			set cyclist "/usr/bin/cyclist" 
		} else {
			set cyclist "$pd_guidir/bin/cyclist"
		}
		puts stderr "$cyclist '$filename'"
		# convert Max binary to text .pat
		set binport [open "| \"$cyclist\" \"$filename\""]
		set convertedtext [read $binport]
		if { ! [catch {close $binport} err]} {
			if {! [file writable $directory]} {	set directory "/tmp" }
			set basename "$basename.pat"
			set textpatfile [open "$directory/$basename" w]
			puts $textpatfile $convertedtext
			close $textpatfile
			puts stderr "converted Max binary to text format: $directory/$basename"
		}
	}
    if {[regexp -nocase -- "\.(pd|pat|mxt)$" $basename]} {
Miller Puckette's avatar
Miller Puckette committed
1173
        pd "pd open [pdtk_enquote $basename] [pdtk_enquote $directory] ;"
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1174
        set pd_opendir $directory
Miller Puckette's avatar
Miller Puckette committed
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
    }
}

catch {
    package require tkdnd
    dnd bindtarget . text/uri-list <Drop> {
        foreach file %D {open_file $file}
    }
}

################## the "Message" menu command #########################
proc menu_send {} {
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1187
    global pd_nt ctrl_key
1188
1189
1190
    if { [winfo exists .sendpanel.entry] } {
        raise .sendpanel
    } else {
1191
		toplevel .sendpanel -class [winfo class .]
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
		wm title .sendpanel {Send Message to Pd}
		wm resizable .sendpanel 0 0
		match_linux_wm [list .sendpanel configure]
		pdtk_standardkeybindings .sendpanel
		match_linux_wm [list entry .sendpanel.entry \
			-textvariable send_textvariable]
		pack .sendpanel.entry -side bottom -fill both -ipadx 100 -padx 3 -pady 5
		if { [info tclversion] < 8.5 } {
			.sendpanel.entry select from 0
			.sendpanel.entry select adjust end
		}
		bind .sendpanel <$ctrl_key-Key-w> {destroy .sendpanel}
		bind .sendpanel <KeyPress-Escape> {destroy .sendpanel}
		bind .sendpanel.entry <KeyPress-Return> {
1206
			pdtk_post "\nmessage-to-pd: $send_textvariable"
1207
1208
1209
1210
		    pd [concat $send_textvariable \;]
		}
		focus .sendpanel.entry
	}
Miller Puckette's avatar
Miller Puckette committed
1211
1212
}

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228

################## menu commands for Mac OS X #########################

proc menu_minimize {window} {
	if {$window eq ""} { #Pd Window
		wm iconify [winfo toplevel .printout]
	} else {
		wm iconify [winfo toplevel $window]
	}
}

proc menu_zoom {window} {
	wm state $window zoomed
}

proc menu_raisenextwindow {} {
1229
1230
1231
1232
1233
1234
1235
	set target [lindex [wm stackorder .] 0]
	raise $target
	if { [winfo exists $target.c] } {
		focus $target.c
	} else {
		focus $target
	}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1236
1237
1238
}

# lreverse came along in Tcl 8.5
Ivica Bukvic's avatar
Ivica Bukvic committed
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
proc menu_raisepreviouswindow {} {
	set last [lindex [wm stackorder .] end]
	set all [wm stackorder .]
	foreach i $all {
		if { $i != $last } { 
			raise [lindex $i]
			set target $i
		} else {
			if { [winfo exists $target.c] } {
				focus $target.c
			} else {
				focus $target
			}
		}
	}
}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1255
1256
1257
1258
1259
1260

################## menu commands for console #########################

proc menu_raise_console {} {
	set pd_window .
	set top_window [lindex [wm stackorder $pd_window] end]
1261
	focus .
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1262
1263
	if {$pd_window eq $top_window} {
		lower $pd_window
1264
1265
1266
1267
		.controls.switches.console instate {selected} {
			lower .printout
		}
		#catch {lower .printout}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1268
1269
1270
	} else {
		wm deiconify $pd_window
		raise $pd_window
1271
1272
1273
1274
1275
1276
1277
1278
1279
		.controls.switches.console instate {selected} {
			wm deiconify .printout
			wm manage .printout
			raise .printout
			#focus .printout
		}
		#catch {wm deiconify .printout}
		#catch {wm manage .prinout}
		#raise .printout
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1280
1281
1282
	}
}

1283
proc menu_toggle_console {} { .controls.switches.console invoke }
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1284

1285
proc menu_clear_console {} {.printout.frame.text configure -state normal; .printout.frame.text delete 0.0 end; .printout.frame.text configure -state disabled}
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1286

Miller Puckette's avatar
Miller Puckette committed
1287
1288
1289
1290
1291
1292
1293
1294
################## the "Quit" menu command #########################
proc menu_really_quit {} {pd {pd quit;}}

proc menu_quit {} {pd {pd verifyquit;}}

######### the "audio" menu command  ###############
proc menu_audio {flag} {pd [concat pd dsp $flag \;]}

Miller Puckette's avatar
Miller Puckette committed
1295
1296
1297
######### the "reselect" menu command ################
proc menu_reselect {name} {pd [concat $name reselect \;]}

Miller Puckette's avatar
Miller Puckette committed
1298
1299
1300
1301
1302
1303
1304
1305
1306
######### the "documentation" menu command  ###############

set doc_number 1

# open text docs in a Pd window
proc menu_opentext {filename} {
    global doc_number
    global pd_guidir
    global pd_myversion
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1307
	global ctrl_key
1308
1309
1310
1311
    if { [winfo exists .about.text] } {
        raise .about
    } else {
		destroy .about
1312
		toplevel .about -class [winfo class .]
1313
		wm title .about "Text Viewer"
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
		wm geometry .about 550x480
		match_linux_wm [list text .about.text -relief sunken -bd 1 -font text_font \
		    -yscrollcommand ".about.scroll set" -highlightthickness 0 -takefocus 0]
		match_linux_wm [list scrollbar .about.scroll -command ".about.text yview"]
		pack .about.scroll -side right -fill y
		pack .about.text -side left -fill both -expand 1
		bind .about <$ctrl_key-Key-w> [concat destroy .about set doc_number [expr $doc_number - 1]]
		
		set f [open $filename]
		while {![eof $f]} {
		    set bigstring [read $f 1000]
		    regsub -all PD_BASEDIR $bigstring $pd_guidir bigstring2
		    regsub -all PD_VERSION $bigstring2 $pd_myversion bigstring3
		    .about.text insert end $bigstring3
		}
		close $f
	}
Miller Puckette's avatar
Miller Puckette committed
1331
1332
1333
1334
1335
1336
1337
}

# open HTML docs from the menu using the OS-default HTML viewer
proc menu_openhtml {filename} {
    global pd_nt         

    if {$pd_nt == 0} {
1338
1339
        foreach candidate \
            { gnome-open xdg-open sensible-browser iceweasel firefox mozilla \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1340
1341
1342
                  galeon konqueror netscape lynx } {
                      set browser [lindex [auto_execok $candidate] 0]
                      if {[string length $browser]} {
1343
                          puts stderr [format "%s '%s'" $browser $filename]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1344
1345
1346
1347
                          exec -- sh -c [format "%s '%s'" $browser $filename] &
                          break
                      }
                  }
Miller Puckette's avatar
Miller Puckette committed
1348
    } elseif {$pd_nt == 2} {
1349
        puts stderr [format "open '%s'" $filename]
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1350
        exec sh -c [format "open '%s'" $filename]
Miller Puckette's avatar
Miller Puckette committed
1351
1352
    } else {
        exec rundll32 url.dll,FileProtocolHandler \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1353
            [format "%s" $filename] &
Miller Puckette's avatar
Miller Puckette committed
1354
1355
1356
    }
}

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
proc menu_openpdpedia {} {
	set top_window [lindex [wm stackorder .] end]
	set window_title [wm title $top_window]
	set helpfile [regsub -- {(.*)-help.*} $window_title {\1}]
	if {$helpfile eq $window_title} {
		menu_openhtml "http://wiki.puredata.info/"
	} else {
		menu_openhtml "http://wiki.puredata.info/en/$helpfile"
	}
}

proc menu_doc_open {dir basename} {
Miller Puckette's avatar
Miller Puckette committed
1369
    global pd_guidir
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1370
1371
1372
1373
1374
1375
    
    if {[file pathtype $dir] eq "relative"} {
        set dirname "$pd_guidir/$dir"
    } else {
        set dirname $dir
    }
Miller Puckette's avatar
Miller Puckette committed
1376

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1377
1378
1379
    if {[file isdirectory [file join $dirname $basename]]} {
        menu_openhtml $dirname/$basename
    } elseif {[regexp -nocase -- ".*\.(txt|c)$" $basename]} {
Miller Puckette's avatar
Miller Puckette committed
1380
        menu_opentext $dirname/$basename
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1381
1382
    } elseif {[regexp -nocase -- ".*\.(htm|html|pdf)$" $basename]} {
        menu_openhtml $dirname/$basename
Miller Puckette's avatar
Miller Puckette committed
1383
    } else {
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1384
1385
1386
        set fullpath [file normalize [file join $dirname $basename]]
        set dirname [file dirname $fullpath]
        set basename [file tail $fullpath]
Miller Puckette's avatar
Miller Puckette committed
1387
1388
1389
1390
1391
        pd [concat pd open [pdtk_enquote $basename] \
                [pdtk_enquote $dirname] \;]
    }
}

1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
# backported from pd
# ------------------------------------------------------------------------------
# opening docs as menu items (like the Test Audio and MIDI patch and the manual)
#package provide pd_menucommands 0.1
#
#namespace eval ::pd_menucommands:: {
#    variable untitled_number "1"
#
#    namespace export menu_*
#}

1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
# TODO enquote a filename to send it to pd, " isn't handled properly tho...
#proc enquote_path {message} {
#    string map {"," "\\," ";" "\\;" " " "\\ "} $message
#}

#proc ::menu_doc_open {dir basename} {
#    if {[file pathtype $dir] eq "relative"} {
#        set dirname "$::sys_libdir/$dir"
#    } else {
#        set dirname $dir
#    }
#    set textextension "[string tolower [file extension $basename]]"
#    if {[lsearch -exact [lindex $::filetypes 0 1]  $textextension] > -1} {
#        set fullpath [file normalize [file join $dirname $basename]]
#        set dirname [file dirname $fullpath]
#        set basename [file tail $fullpath]
#        pdsend "pd open [enquote_path $basename] [enquote_path $dirname]"
#    } else {
#        ::menu_openfile "$dirname/$basename"
#    }
#}
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442

# open HTML docs from the menu using the OS-default HTML viewer
proc ::menu_openfile {filename} {
    if {$::tcl_platform(os) eq "Darwin"} {
        exec sh -c [format "open '%s'" $filename]
    } elseif {$::tcl_platform(platform) eq "windows"} {
        exec rundll32 url.dll,FileProtocolHandler [format "%s" $filename] &
    } else {
        foreach candidate { gnome-open xdg-open sensible-browser iceweasel firefox \
                                mozilla galeon konqueror netscape lynx } {
            set browser [lindex [auto_execok $candidate] 0]
            if {[string length $browser] != 0} {
                exec -- sh -c [format "%s '%s'" $browser $filename] &
                break
            }
        }
    }
}

Miller Puckette's avatar
Miller Puckette committed
1443
1444
1445
1446
############# routine to add media, help, and apple menu items ###############

proc menu_addstd {mbar} {
    global pd_apilist pd_midiapilist pd_nt pd_tearoff
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1447
    #          the "Audio" menu
Ivica Bukvic's avatar
Ivica Bukvic committed
1448
    $mbar.audio add command -label {Audio ON} -accelerator [accel_munge "Ctrl+/"] \
Miller Puckette's avatar
Miller Puckette committed
1449
        -command {menu_audio 1} 
Ivica Bukvic's avatar
Ivica Bukvic committed
1450
    $mbar.audio add command -label {Audio OFF} -accelerator [accel_munge "Ctrl+."] \
Miller Puckette's avatar
Miller Puckette committed
1451
        -command {menu_audio 0} 
1452
	match_linux_wm [list $mbar.audio add separator]
Ivica Bukvic's avatar
Ivica Bukvic committed
1453
1454
    for {set x 1} {$x<[llength $pd_apilist]} {incr x} {
        $mbar.audio add radiobutton -label [concat [lindex [lindex $pd_apilist $x] 0] Audio Driver] \
Miller Puckette's avatar
Miller Puckette committed
1455
            -command {menu_audio 0} -variable pd_whichapi \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1456
            -value [lindex [lindex $pd_apilist $x] 1]\
1457
			-selectcolor "#dddddd" \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1458
            -command {pd [concat pd audio-setapi $pd_whichapi \;]}
Miller Puckette's avatar
Miller Puckette committed
1459
    }
1460
	match_linux_wm [list $mbar.audio add separator]
Miller Puckette's avatar
Miller Puckette committed
1461
    for {set x 0} {$x<[llength $pd_midiapilist]} {incr x} {
Ivica Bukvic's avatar
Ivica Bukvic committed
1462
        $mbar.audio add radiobutton -label [concat [lindex [lindex $pd_midiapilist $x] 0] driver]\
Miller Puckette's avatar
Miller Puckette committed
1463
            -command {menu_midi 0} -variable pd_whichmidiapi \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1464
            -value [lindex [lindex $pd_midiapilist $x] 1]\
1465
			-selectcolor "#dddddd" \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1466
1467
            -command {pd [concat pd midi-setapi $pd_whichmidiapi \;]}
    }
Ivica Bukvic's avatar
Ivica Bukvic committed
1468
1469
1470
1471
1472
1473
1474
    #if {$pd_nt != 2} {
	#	$mbar.audio add separator
    #    $mbar.audio add command -label {Audio settings...} \
    #        -command {pd pd audio-properties \;}
    #    $mbar.audio add command -label {MIDI settings...} \
    #        -command {pd pd midi-properties \;}
    #}
1475
	match_linux_wm [list $mbar.audio add separator] 
Miller Puckette's avatar
Miller Puckette committed
1476
1477
1478
1479
1480
    $mbar.audio add command -label {Test Audio and MIDI} \
        -command {menu_doc_open doc/7.stuff/tools testtone.pd} 
    $mbar.audio add command -label {Load Meter} \
        -command {menu_doc_open doc/7.stuff/tools load-meter.pd} 

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1481
1482
1483
1484
1485
1486
1487
1488
1489
    #       the MacOS X app menu

    # The menu on the main menubar named $whatever.apple while be treated
    # as a special menu on MacOS X.  Tcl/Tk assigns the $whatever.apple menu
    # to the app-specific menu in MacOS X that is named after the app,
    # so in our case, the Pd menu.  <hans@at.or.at>
    # See SPECIAL MENUS IN MENUBARS http://www.tcl.tk/man/tcl8.4/TkCmd/menu.htm
    if {$pd_nt == 2} {
        $mbar.apple add command -label "About Pd..." -command \
1490
            {menu_doc_open doc/1.manual 1.introduction.txt} 
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
        menu $mbar.apple.preferences -tearoff 0
        $mbar.apple add cascade -label "Preferences" -menu $mbar.apple.preferences
        $mbar.apple.preferences add command -label "Path..." \
            -command {pd pd start-path-dialog \;}
        $mbar.apple.preferences add command -label "Startup..." \
            -command {pd pd start-startup-dialog \;}
        $mbar.apple.preferences add command -label "Audio Settings..." \
            -command {pd pd audio-properties \;}
        $mbar.apple.preferences add command -label "MIDI settings..." \
            -command {pd pd midi-properties \;}
    }


    # the "Help" menu
Miller Puckette's avatar
Miller Puckette committed
1505
    if {$pd_nt != 2} {
1506
        $mbar.help add command -label {About Pd-L2Ork} \
1507
            -command {menu_doc_open doc/1.manual 1.introduction.txt} 
Miller Puckette's avatar
Miller Puckette committed
1508
    }
Ivica Bukvic's avatar
Ivica Bukvic committed
1509
    $mbar.help add command -label {Manual} \
Miller Puckette's avatar
Miller Puckette committed
1510
        -command {menu_doc_open doc/1.manual index.htm} 
1511
    $mbar.help add command -label {Browser} \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1512
1513
        -accelerator [accel_munge "Ctrl+b"] \
        -command {::helpbrowser::open_helpbrowser}
1514
    match_linux_wm [list $mbar.help add separator]
Ivica Bukvic's avatar
Ivica Bukvic committed
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
    #$mbar.help add command -label {puredata.info} \
    #    -command {menu_openhtml http://puredata.info} 
    #$mbar.help add command -label {Pdpedia} \
    #    -command {menu_openpdpedia} 
    #$mbar.help add command -label {FAQ} \
    #    -command {menu_openhtml http://puredata.info/docs/faq} 
    #$mbar.help add separator
    $mbar.help add command -label {Pd-L2Ork mailing list} \
        -command {menu_openhtml http://disis.music.vt.edu/listinfo/l2ork-dev} 
    $mbar.help add command -label {Pure-Data mailing lists} \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1525
        -command {menu_openhtml http://puredata.info/community/lists} 
Ivica Bukvic's avatar
Ivica Bukvic committed
1526
    $mbar.help add command -label {Forums} \
Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
1527
1528
1529
        -command {menu_openhtml http://puredata.hurleur.com/} 
    $mbar.help add command -label {IRC chat} \
        -command {menu_openhtml irc://irc.freenode.net/dataflow} 
Ivica Bukvic's avatar
Ivica Bukvic committed
1530
1531
1532
    #$mbar.help add separator
	#$mbar.help add command -label {report bug} -command \
	#	{menu_openhtml {http://sourceforge.net/tracker/?func=add&group_id=55736&atid=478070}} 
Miller Puckette's avatar
Miller Puckette committed
1533
1534
1535
1536
1537
1538
}

#################### the "File" menu for the Pd window ##############

.mbar.file add command -label New -command {menu_new} \
    -accelerator [accel_munge "Ctrl+n"]