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