From 173559e80bf5934b17c04ebf7043fbd385f70c54 Mon Sep 17 00:00:00 2001
From: Ivica Ico Bukvic <ico@vt.edu>
Date: Thu, 13 Dec 2012 21:13:15 -0500
Subject: [PATCH] fixed bug where copying from external buffer failed under
 certain circumstances

---
 pd/src/g_editor.c |   4 +-
 pd/src/pd.tk      | 142 +++++++++++++++++++++++++---------------------
 2 files changed, 80 insertions(+), 66 deletions(-)

diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index f5f2d504b..f4c0457fd 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -4174,6 +4174,7 @@ static void canvas_copy(t_canvas *x)
 	copiedfont = 0;
     binbuf_free(copy_binbuf);
 	//fprintf(stderr, "canvas_copy\n");
+	sys_vgui("pdtk_canvas_reset_last_clipboard\n");
     copy_binbuf = canvas_docopy(x);
 	if (!x->gl_editor->e_selection)
 		sys_vgui("pdtk_canvas_update_edit_menu .x%lx 0\n", x);
@@ -4188,8 +4189,7 @@ static void canvas_copy(t_canvas *x)
 
 //#if defined(MSW) || defined(__APPLE__)
 //            /* for Mac or Windows, copy the text to the clipboard here */
-        sys_vgui("clipboard clear\n", bufsize, buf);
-        sys_vgui("clipboard append {%.*s}\n", bufsize, buf);
+        sys_vgui("clipboard clear\n clipboard append {%.*s}\n", bufsize, buf);
 //#else
             /* in X windows the selection already went to the
             clipboard when it was made; here we "copy" it to our own buffer
diff --git a/pd/src/pd.tk b/pd/src/pd.tk
index 7a6e3fe5c..10f839b76 100644
--- a/pd/src/pd.tk
+++ b/pd/src/pd.tk
@@ -1903,83 +1903,97 @@ proc menu_mycnv {name accel} {
 
 # correct edit menu, enabling or disabling undo/redo/cut/copy/paste
 proc menu_fixeditmenu {name} {
-	catch {
-		#puts stderr "fixeditmenu $name\n"
-
-		#global pd_undoaction
-		#global pd_redoaction
-		#global pd_undocanvas
-
-		global global_selection
-		global global_clipboard
-		global last_clipboard
-
-		# investigate if we have already something copied from an external source
-		set current_clipboard 0
-		catch {set current_clipboard [clipboard get]}
-		if {$current_clipboard != 0} {
-			# make sure the clipboard contents have not changed
-			if { [string compare $last_clipboard $current_clipboard] } {
-				set data [split $current_clipboard "\n"]
-				set first 0
-				set full_line ""
-				pd [concat $name reset_copyfromexternalbuffer\;]
-				foreach line $data {
-					if { [string index $line end] == ";" } {
-						if { $full_line == "" } {
-							set full_line $line
+	if { [winfo exists $name] } {
+		catch {
+			#puts stderr "fixeditmenu $name\n"
+
+			#global pd_undoaction
+			#global pd_redoaction
+			#global pd_undocanvas
+
+			global global_selection
+			global global_clipboard
+			global last_clipboard
+
+			# investigate if we have already something copied from an external source
+			set current_clipboard 0
+			catch {set current_clipboard [clipboard get]}
+			#puts stderr $current_clipboard
+			#puts stderr "======================================\n"
+			#puts stderr $last_clipboard
+			if {$current_clipboard != 0} {
+				#puts stderr "curent clipboard != 0"
+				# make sure the clipboard contents have not changed
+				if { [string compare $last_clipboard $current_clipboard] } {
+					#puts stderr "current != last"
+					set data [split $current_clipboard "\n"]
+					set first 0
+					set full_line ""
+					pd [concat $name reset_copyfromexternalbuffer\;]
+					foreach line $data {
+						if { [string index $line end] == ";" } {
+							if { $full_line == "" } {
+								set full_line $line
+							} else {
+								append full_line " " $line
+							}
+							#puts stderr "pd.tk sends: |$line| |$full_line|"
+							if { !$first } {
+								pd [concat $name copyfromexternalbuffer\;]
+								pd [concat $name copyfromexternalbuffer $full_line\;]
+								set first 1
+							} else {
+								pd [concat $name copyfromexternalbuffer $full_line\;]
+							}
+							set full_line ""
 						} else {
 							append full_line " " $line
+							set full_line [string map {"\n" ""} $full_line]
 						}
-						#puts stderr "pd.tk sends: |$line| |$full_line|\n"
-						if { !$first } {
-							pd [concat $name copyfromexternalbuffer\;]
-							pd [concat $name copyfromexternalbuffer $full_line\;]
-							set first 1
-						} else {
-							pd [concat $name copyfromexternalbuffer $full_line\;]
-						}
-						set full_line ""
-					} else {
-						append full_line " " $line
-						set full_line [string map {"\n" ""} $full_line]
 					}
+					set global_clipboard 1
+					set last_clipboard $current_clipboard
+					pd [concat $name copyfromexternalbuffer\;]
+					pdtk_canvas_update_edit_menu $name 1
 				}
-				set global_clipboard 1
-				set last_clipboard $current_clipboard
-				pd [concat $name copyfromexternalbuffer\;]
-				pdtk_canvas_update_edit_menu $name 1
 			}
-		}
 
-		# puts stderr [concat menu_fixeditmenu $name $pd_undocanvas $pd_undoaction]
-		if {$::undo($name) != "no"} {
-		    $name.m.edit entryconfigure "Undo*" -state normal \
-		        -label [concat "Undo " $::undo($name)]
-		} else {
-		    $name.m.edit entryconfigure "Undo*" -state disabled -label "Undo"
-		}
-		if {$::redo($name) != "no"} {
-		    $name.m.edit entryconfigure "Redo*" -state normal\
-		        -label [concat "Redo " $::redo($name)]
-		} else {
-		    $name.m.edit entryconfigure "Redo*" -state disabled
-		}
+			# puts stderr [concat menu_fixeditmenu $name $pd_undocanvas $pd_undoaction]
+			if {$::undo($name) != "no"} {
+				$name.m.edit entryconfigure "Undo*" -state normal \
+				    -label [concat "Undo " $::undo($name)]
+			} else {
+				$name.m.edit entryconfigure "Undo*" -state disabled -label "Undo"
+			}
+			if {$::redo($name) != "no"} {
+				$name.m.edit entryconfigure "Redo*" -state normal\
+				    -label [concat "Redo " $::redo($name)]
+			} else {
+				$name.m.edit entryconfigure "Redo*" -state disabled
+			}
 
-		if {$global_selection == 1} {
-		    $name.m.edit entryconfigure "Duplicate" -state normal
-		} else {
-		    $name.m.edit entryconfigure "Duplicate" -state disabled
-		}
+			if {$global_selection == 1} {
+				$name.m.edit entryconfigure "Duplicate" -state normal
+			} else {
+				$name.m.edit entryconfigure "Duplicate" -state disabled
+			}
 
-		if {$global_clipboard == 1} {
-		    $name.m.edit entryconfigure "Paste" -state normal
-		} else {
-		    $name.m.edit entryconfigure "Paste" -state disabled
+			if {$global_clipboard == 1} {
+				$name.m.edit entryconfigure "Paste" -state normal
+			} else {
+				$name.m.edit entryconfigure "Paste" -state disabled
+			}
 		}
 	}
 }
 
+# reset last_clipboard whenever we do copy/cut from inside pd
+proc pdtk_canvas_reset_last_clipboard {} {
+	global last_clipboard
+	set last_clipboard 0
+	#puts stderr pdtk_canvas_reset_last_clipboard
+}
+
 # message from Pd to update the currently available undo/redo action
 proc pdtk_undomenu {name undoaction redoaction} {
     #global pd_undoaction
-- 
GitLab