From 7ab5f0bc6f1edfb8cffa7ad99f6f923732b94a17 Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Thu, 12 Feb 2015 22:52:07 -0500 Subject: [PATCH] first attempt at nw.js GUI --- pd/nw/DejaVuSansMono.ttf | Bin 0 -> 335068 bytes pd/nw/index.html | 489 +++++++ pd/nw/package.json | 8 + pd/nw/pdcanvas.css | 50 + pd/nw/pdcanvas.html | 1009 ++++++++++++++ pd/nw/pdgui.js | 2695 ++++++++++++++++++++++++++++++++++++++ pd/nw/todo.txt | 80 ++ pd/src/g_all_guis.c | 34 + pd/src/g_bang.c | 14 +- pd/src/g_canvas.c | 63 +- pd/src/g_canvas.h | 2 + pd/src/g_editor.c | 205 ++- pd/src/g_graph.c | 76 +- pd/src/g_magicglass.c | 15 + pd/src/g_mycanvas.c | 14 + pd/src/g_numbox.c | 18 +- pd/src/g_radio.c | 34 +- pd/src/g_readwrite.c | 5 +- pd/src/g_rtext.c | 16 +- pd/src/g_scalar.c | 185 ++- pd/src/g_slider.c | 22 + pd/src/g_template.c | 538 ++++++-- pd/src/g_text.c | 81 +- pd/src/g_toggle.c | 11 + pd/src/g_traversal.c | 4 +- pd/src/g_vumeter.c | 45 +- pd/src/m_pd.h | 9 + pd/src/s_audio.c | 2 +- pd/src/s_inter.c | 148 ++- pd/src/s_main.c | 32 +- pd/src/s_midi.c | 2 +- pd/src/s_print.c | 7 +- 32 files changed, 5671 insertions(+), 242 deletions(-) create mode 100644 pd/nw/DejaVuSansMono.ttf create mode 100644 pd/nw/index.html create mode 100644 pd/nw/package.json create mode 100644 pd/nw/pdcanvas.css create mode 100644 pd/nw/pdcanvas.html create mode 100644 pd/nw/pdgui.js create mode 100644 pd/nw/todo.txt diff --git a/pd/nw/DejaVuSansMono.ttf b/pd/nw/DejaVuSansMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8b7bb2a4e1b2c27786398c320e9020bcc24c3af3 GIT binary patch literal 335068 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⪻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⋘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�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 literal 0 HcmV?d00001 diff --git a/pd/nw/index.html b/pd/nw/index.html new file mode 100644 index 000000000..b8f71616f --- /dev/null +++ b/pd/nw/index.html @@ -0,0 +1,489 @@ +<!DOCTYPE html> +<html> + <head> + </head> + <body> + <input style="display:none;" id="fileDialog" type="file" nwworkingdir multiple /> + <script> + 'use strict'; + var nw = require('nw.gui'); + console.log(nw.App.argv); + var pdgui = require('./pdgui.js'); + var port_no = nw.App.argv[0]; // fed to us by the Pd process + var pwd = process.env.PWD; + pdgui.set_port(port_no); + pdgui.set_pwd(pwd); + pdgui.set_pd_window(this); + pdgui.set_app_quitfn(app_quit); + + console.log("Hello from " + pwd); + + function app_quit () { + console.log("quitting for reals"); + nw.App.quit(); + } + + var chooser = document.querySelector("#fileDialog"); + chooser.addEventListener("change", function(evt) { + var file_array = this.value; + // reset value so that we can open the same file twice + this.value = null; + pdgui.menu_open(file_array); + console.log("tried to open something"); + }, false); + + + +// prompt("hey", "you"); + + // Invoke some functions to create main menus, etc. + + nw.Window.get().on("close", function() { + pdgui.menu_quit(); +// stop-gap to shutdown properly +// this.close(true); + }); + console.log(nw.App.argv); + + document.getElementById("fileDialog").setAttribute("nwworkingdir", pwd); + document.getElementById("fileDialog").setAttribute("accept", + Object.keys(pdgui.pd_filetypes).toString()); + + nw_create_pd_window_menus(); + + pdgui.connect(); + pdgui.init_socket_events(); + + // nw context callbacks (mostly just creating/destroying windows) + pdgui.set_new_window_fn(nw_create_window); + pdgui.set_close_window_fn(nw_close_window); + + + function pdmenu_copy () { + alert("Please implement pdmenu_copy"); + } + + function pdmenu_selectall () { + alert("Please implement pdmenu_selectall"); + } + + function pdmenu_preferences () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_next_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_previous_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_parent_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_console_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_audio_on () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_audio_off () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_test_audio () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_load_meter () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_about_pd () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_manual () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_help_browser () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_l2ork_mailinglist () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_pd_mailinglists () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_forums () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_irc () { + alert("Please implement pdmenu_preferences"); + } + +// Menus for the main Pd window +function nw_create_pd_window_menus () { + // Window menu + var windowMenu = new nw.Menu({ + type: 'menubar' + }); + + // File menu + var fileMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'File', + submenu: fileMenu + })); + + // File sub-entries + fileMenu.append(new nw.MenuItem({ + label: 'New', + click: pdgui.menu_new, + key: 'n', + modifiers: "ctrl" + })); + + fileMenu.append(new nw.MenuItem({ + label: 'Open', + key: 'o', + modifiers: "ctrl", + click: function (){ + var chooser = document.querySelector('#fileDialog'); + chooser.click(); + } + })); + + if (pdgui.k12_mode == 1) { + fileMenu.append(new nw.MenuItem({ + label: 'K12 Demos', + click: pdgui.menu_k12_open_demos + })); + } + + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + // Note: this must be different for the main Pd window + fileMenu.append(new nw.MenuItem({ + label: 'Save', + click: function () {}, + enabled: false, + key: 's', + modifiers: "ctrl" + })); + + fileMenu.append(new nw.MenuItem({ + label: 'Save as...', + click: function (){}, + enabled: false, + key: 'S', + modifiers: "ctrl" + })); + + if (pdgui.k12_mode == 0) { + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + } + + fileMenu.append(new nw.MenuItem({ + label: 'Message...', + click: pdgui.menu_send, + key: 'm', + modifiers: "ctrl" + })); + + if (pdgui.k12_mode == 0) { + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + } + + // recent files go here + + // anther separator goes here if there are any recent files + + // Note: there's no good reason to have this here + fileMenu.append(new nw.MenuItem({ + label: 'Close', + click: function () {}, + enabled: false, + })); + + // Quit Pd + fileMenu.append(new nw.MenuItem({ + label: 'Quit', + click: pdgui.menu_quit, + key: 'q', + modifiers: "ctrl" + })); + + + // Edit menu + var editMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Edit', + submenu: editMenu + })); + + // Edit sub-entries + editMenu.append(new nw.MenuItem({ + label: 'Copy', + click: pdmenu_copy, + key: 'c', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Select All', + click: function () { + document.selectAllChildren(document); + }, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Zoom In', + click: function () { + nw.Window.get().zoomLevel += 1; + pdgui.gui_post("zoom level is " + nw.Window.get().zoomLevel); + }, + key: '=', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Zoom Out', + click: function () { + nw.Window.get().zoomLevel -= 1; + pdgui.gui_post("zoom level is " + nw.Window.get().zoomLevel); + }, + key: '-', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Preferences...', + click: pdmenu_preferences, + key: 'a', + modifiers: "ctrl" + })); + + + // Windows menu... call it "winman" (i.e., window management) to avoid confusion + var winmanMenu = new nw.Menu(); + + // Add to windows menu + windowMenu.append(new nw.MenuItem({ + label: 'Windows', + submenu: winmanMenu + })); + + // Winman sub-entries + winmanMenu.append(new nw.MenuItem({ + label: 'Next Window', + click: pdmenu_next_win, + key: 'c', + modifiers: "ctrl" + })); + + winmanMenu.append(new nw.MenuItem({ + label: 'Previous Window', + click: pdmenu_previous_win, + key: 'a', + modifiers: "ctrl" + })); + + winmanMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + winmanMenu.append(new nw.MenuItem({ + label: 'Parent Window', + click: pdmenu_parent_win, + key: 'a', + modifiers: "ctrl" + })); + + winmanMenu.append(new nw.MenuItem({ + label: 'Pd & Console', + click: pdmenu_console_win, + key: 'a', + modifiers: "ctrl" + })); + + // Media menu + var mediaMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Media', + submenu: mediaMenu + })); + + // Media sub-entries + mediaMenu.append(new nw.MenuItem({ + label: 'Audio On', + click: function() { + pdgui.pdsend("pd dsp 1"); + }, + key: 'c', + modifiers: "ctrl" + })); + + mediaMenu.append(new nw.MenuItem({ + label: 'Audio Off', + click: function() { + pdgui.pdsend("pd dsp 0"); + }, + key: 'a', + modifiers: "ctrl" + })); + + mediaMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + mediaMenu.append(new nw.MenuItem({ + label: 'Test Audio and Midi', + click: pdmenu_test_audio, + key: 'a', + modifiers: "ctrl" + })); + + mediaMenu.append(new nw.MenuItem({ + label: 'Load Meter', + click: pdmenu_load_meter, + key: 'a', + modifiers: "ctrl" + })); + + // Help menu + var helpMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Help', + submenu: helpMenu + })); + + // Help sub-entries + helpMenu.append(new nw.MenuItem({ + label: 'About Pd-L2ork', + click: pdmenu_about_pd, + key: 'c', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Manual', + click: pdmenu_manual, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Help Browser', + click: pdmenu_help_browser, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Pd-L2ork Mailing List', + click: pdmenu_l2ork_mailinglist, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Pure Data Mailing Lists', + click: pdmenu_pd_mailinglists, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Forums', + click: pdmenu_forums, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'IRC Chat', + click: pdmenu_irc, + key: 'a', + modifiers: "ctrl" + })); + + // Assign to window + nw.Window.get().menu = windowMenu; +} + +function nw_close_window(window) { + window.close(true); +} + +function nw_create_window(cid, width, height, xpos, ypos, menu_flag, resize, topmost, cnv_color, + canvas_string, dir, dirty_flag, cargs) { + // todo: make a separate way to format the title for OSX + var my_title = pdgui.format_window_title(canvas_string, dirty_flag, cargs, dir); + + var new_win = nw.Window.open('pdcanvas.html', { + title: my_title, + position: "center", + toolbar: true, + focus: true, + width: width, + height: height, + x: xpos, + y: ypos + }); + return new_win; +} + +function canvasNew(args) { + console.log(args); +} + + + + + + </script> + <input style="display:none;" id="saveDialog" type="file" nwsaveas /> + + <pre id="p1" style="white-space: pre-wrap;">Welcome to Pd GUI using Node-Webkit + <script>document.write(process.versions['node-webkit'])</script><br/></pre> + + <script> + + + </script> + </body> +</html> diff --git a/pd/nw/package.json b/pd/nw/package.json new file mode 100644 index 000000000..de61b251c --- /dev/null +++ b/pd/nw/package.json @@ -0,0 +1,8 @@ +{ + "name": "my-app", + "version": "0.1.0", + "main": "index.html", + "window": { + "toolbar": true + } +} diff --git a/pd/nw/pdcanvas.css b/pd/nw/pdcanvas.css new file mode 100644 index 000000000..88baa317e --- /dev/null +++ b/pd/nw/pdcanvas.css @@ -0,0 +1,50 @@ +@font-face { + font-family: "DejaVu Sans Mono"; + src: url("DejaVuSansMono.ttf"); +} + +body { + margin: 0px; + font-family: "DejaVu Sans Mono"; +} + +.noselect { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +text { + // fill: red; + cursor: default; +} + +.selected_border { + stroke: blue; + stroke-dasharray: none; + stroke-width: 1; +} + +.selected_line { + stroke: blue; +} + +.broken_border { + fill: #f7f7f7; + stroke: red; + stroke-dasharray: 3 2; +} + +.xlet { + stroke: black; + fill: gray; + stroke-width: 1; + shape-rendering: optimizeSpeed; +} + +//.xlet:hover { +// stroke: red; +//} diff --git a/pd/nw/pdcanvas.html b/pd/nw/pdcanvas.html new file mode 100644 index 000000000..9bd9af314 --- /dev/null +++ b/pd/nw/pdcanvas.html @@ -0,0 +1,1009 @@ +<!DOCTYPE html> +<html> + <head> + </head> + <link rel="stylesheet" type="text/css" href="pdcanvas.css"> + <body> + <input style="display:none;" id="fileDialog" type="file" multiple /> + <input style="display:none;" id="saveDialog" type="file" nwsaveas nwworkingdir accept=".pd" /> + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="patchsvg" height="1000" width="1000" class="noselect"> + <rect/> + </svg> + <script> + 'use strict'; + var nw = require('nw.gui'); + var pdgui = require('./pdgui.js'); + + var name = pdgui.last_loaded(); + + console.log("my working dire is " + pdgui.get_pwd()); + document.getElementById("saveDialog").setAttribute("nwworkingdir", pdgui.get_pwd()); + + document.getElementById("fileDialog").setAttribute("nwworkingdir", pdgui.get_pwd()); + document.getElementById("fileDialog").setAttribute("accept", + Object.keys(pdgui.pd_filetypes).toString()); + + + + // The right-click popup menu + var popup_menu = new nw.Menu(); + pdgui.add_popup(name, popup_menu); + + popup_menu.append(new nw.MenuItem({ + label: 'Properties', + click: function() { + pdgui.popup_action(name, 0); + } + })); + popup_menu.append(new nw.MenuItem({ + label: 'Open', + click: function() { + pdgui.popup_action(name, 1); + } + })); + popup_menu.append(new nw.MenuItem({ + label: 'Help', + click: function() { + pdgui.popup_action(name, 2); + } + })); + + document.querySelector("#saveDialog").addEventListener("change", function(evt) { + pdgui.saveas_callback(name, this.value); + console.log("tried to open something"); + }, false); + + + document.querySelector("#fileDialog").addEventListener("change", function(evt) { + var file_array = this.value; + // reset value so that we can open the same file twice + this.value = null; + pdgui.menu_open(file_array); + console.log("tried to open something"); + }, false); + + + document.addEventListener("mousemove", function(evt) { + //pdgui.gui_post("x: " + evt.pageX + " y: " + evt.pageY + + // " modifier: " + (evt.shiftKey + (evt.ctrlKey << 1))); + pdgui.pdsend(name + " motion " + evt.pageX + " " + evt.pageY + " " + + (evt.shiftKey + (evt.ctrlKey << 1))); + evt.stopPropagation(); +// evt.preventDefault(); + return false; + }); + + var last_keydown = ""; + + + function add_keymods(key, evt) { + var shift = evt.shiftKey ? "Shift" : ""; + var ctrl = evt.ctrlKey ? "Ctrl" : ""; + return shift + ctrl + key; + } + + document.addEventListener("keydown", function(evt) { + var key_code = evt.keyCode; + var hack = null; // hack for unprintable ascii codes + switch(key_code) { + case 8: + case 9: + case 10: + case 27: +// case 32: + case 127: hack = key_code; break; + + + case 37: hack = add_keymods('Left', evt); break; + case 38: hack = add_keymods('Up', evt); break; + case 39: hack = add_keymods('Right', evt); break; + case 40: hack = add_keymods('Down', evt); break; + case 33: hack = add_keymods('Prior', evt); break; + case 34: hack = add_keymods('Next', evt); break; + case 35: hack = add_keymods('End', evt); break; + case 36: hack = add_keymods('Home', evt); break; + + // Need to handle Control key, Alt + + case 16: hack = 'Shift'; break; + case 17: hack = 'Control'; break; + case 18: hack = 'Alt'; break; + } + if (hack !== null) { + pdgui.gui_canvas_sendkey(name, 1, evt, hack); + pdgui.set_keymap(key_code, hack); + } + pdgui.gui_post("keydown time: keycode is " + evt.keyCode); + last_keydown = evt.keyCode; + evt.stopPropagation(); + }); + + document.addEventListener("keypress", function(evt) { + pdgui.gui_canvas_sendkey(name, 1, evt, evt.charCode); + pdgui.set_keymap(last_keydown, evt.charCode); + pdgui.gui_post("keypress time: charcode is " + evt.charCode); + // Don't do things like scrolling on space, arrow keys, etc. + evt.stopPropagation(); + evt.preventDefault(); + }); + + document.addEventListener("keyup", function(evt) { + var my_char_code = pdgui.get_char_code(evt.keyCode); + pdgui.gui_canvas_sendkey(name, 0, evt, my_char_code); + pdgui.gui_post("keyup time: charcode is: " + my_char_code); + }); + + // just left-clicks for the moment + document.onmousedown = function(evt) { + //pdgui.gui_post("mousedown: x: " + evt.pageX + " y: " + evt.pageY + + // " button: " + (evt.button + 1) + " modifier: " + (evt.shiftKey + (evt.ctrlKey << 1))); + // tk events are one greater than html5... + var b = evt.button + 1; + var mod; + // For some reason right-click sends a modifier value of "8", and canvas_doclick in + // g_editor.c depends on that value to do the right thing. So let's hack... + if (b === 3) { // right-click + mod = 8; + } else { + mod = (evt.shiftKey + (evt.ctrlKey << 1)); + } + pdgui.pdsend(name + " mouse " + evt.pageX + " " + evt.pageY + " " + + b + " " + mod); + evt.stopPropagation(); + evt.preventDefault(); + } + + document.onmouseup = function(evt) { + //pdgui.gui_post("mouseup: x: " + evt.pageX + " y: " + evt.pageY + + // " button: " + (evt.button + 1)); + pdgui.pdsend(name + " mouseup " + evt.pageX + " " + evt.pageY + " " + + (evt.button + 1)); + } + + + + + // let's handle some events for this window... + + // closing the Window + // this isn't actually closing the window yet + nw.Window.get().on("close", function() { + pdgui.pdsend(name + " menuclose 0"); + }); + // draw the objects in the patch once we've finished loading this boilerplate page + // We could probably use the window.onload here, which would make it standard javascript + this.onload = function() { + pdgui.canvas_map(name); + }; + + + + + +nw_create_patch_window_menus(name); + + function menu_generic () { + alert("Please implement this"); + } + + function pdmenu_copy () { + alert("Please implement pdmenu_copy"); + } + + function pdmenu_selectall () { + alert("Please implement pdmenu_selectall"); + } + + function pdmenu_preferences () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_next_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_previous_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_parent_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_console_win () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_audio_on () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_audio_off () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_test_audio () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_load_meter () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_about_pd () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_manual () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_help_browser () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_l2ork_mailinglist () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_pd_mailinglists () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_forums () { + alert("Please implement pdmenu_preferences"); + } + + function pdmenu_irc () { + alert("Please implement pdmenu_preferences"); + } + +// Menus for the Patch window +function nw_create_patch_window_menus () { + + // Window menu + var windowMenu = new nw.Menu({ + type: 'menubar' + }); + + // File menu + var fileMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'File', + submenu: fileMenu + })); + + // File sub-entries + fileMenu.append(new nw.MenuItem({ + label: 'New', + click: pdgui.menu_new, + key: 'n', + modifiers: "ctrl" + })); + + fileMenu.append(new nw.MenuItem({ + label: 'Open', + key: 'o', + modifiers: "ctrl", + click: function (){ + var chooser = document.querySelector('#fileDialog'); + chooser.click(); + } + })); + + if (pdgui.k12_mode == 1) { + fileMenu.append(new nw.MenuItem({ + label: 'K12 Demos', + click: pdgui.menu_k12_open_demos + })); + } + + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + // Note: this must be different for the main Pd window + fileMenu.append(new nw.MenuItem({ + label: 'Save', + click: function () { + pdgui.menu_save(name); + }, + key: 's', + modifiers: "ctrl" + })); + + fileMenu.append(new nw.MenuItem({ + label: 'Save as...', + click: function (){ + pdgui.menu_saveas(name); + }, + key: 's', + modifiers: "ctrl+shift" + })); + + if (pdgui.k12_mode == 0) { + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + } + + fileMenu.append(new nw.MenuItem({ + label: 'Message...', + click: pdgui.menu_send, + key: 'm', + modifiers: "ctrl" + })); + + if (pdgui.k12_mode == 0) { + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + } + + // recent files go here + + // anther separator goes here if there are any recent files + + fileMenu.append(new nw.MenuItem({ + label: 'Close', + click: function() { + pdgui.menu_close(name); + } + })); + + // Quit Pd + fileMenu.append(new nw.MenuItem({ + label: 'Quit', + click: pdgui.menu_quit, + key: 'q', + modifiers: "ctrl" + })); + + + // Edit menu + var editMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Edit', + submenu: editMenu + })); + + // Edit sub-entries + editMenu.append(new nw.MenuItem({ + label: 'Undo', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Redo', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Cut', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Copy', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Paste', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + + editMenu.append(new nw.MenuItem({ + label: 'Duplicate', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Select All', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Reselect', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Zoom In', + click: function () { + nw.Window.get().zoomLevel += 1; + pdgui.gui_post("zoom level is " + nw.Window.get().zoomLevel); + }, + key: '=', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Zoom Out', + click: function () { + nw.Window.get().zoomLevel -= 1; + pdgui.gui_post("zoom level is " + nw.Window.get().zoomLevel); + }, + key: '-', + modifiers: "ctrl" + })); + + + + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Tidy Up', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Bring to Front', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Send to Back', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Font', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Cord Inspector', + click: function() { + pdgui.pdsend(name + " magicglass 0"); + }, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Find', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Find Again', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Find Last Error', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Autotips', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + label: 'Editmode', + click: function() { pdgui.pdsend(name + " editmode 0"); }, + key: 'e', + modifiers: "ctrl" + })); + + editMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + editMenu.append(new nw.MenuItem({ + label: 'Preferences...', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + // Put menu + var putMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Put', + submenu: putMenu + })); + + // Put menu sub-entries + putMenu.append(new nw.MenuItem({ + label: 'Object', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " obj 0"); + }, + key: '1', + modifiers: "ctrl" + })); + +/* + +proc menu_floatatom {name accel} { + pd [concat $name dirty 1 \;] + pd [concat $name floatatom $accel \;] +} + +proc menu_symbolatom {name accel} { + pd [concat $name dirty 1 \;] + pd [concat $name symbolatom $accel \;] +} + +proc menu_comment {name accel} { + pd [concat $name dirty 1 \;] + pd [concat $name text $accel \;] +} + +proc menu_graph {name} { + pd [concat $name dirty 1 \;] + set xdraw [expr int([$name.c canvasx 0])] + set ydraw [expr int([$name.c canvasy 0])] + pd [concat $name graph NULL 0 0 0 0 [expr $xdraw+30] [expr $ydraw+30] 0 [expr $ydraw+30]\;] + #pd [concat $name graph \;] +} + +proc menu_array {name} { + pd [concat $name dirty 1 \;] + pd [concat $name menuarray \;] +} + + +*/ + + putMenu.append(new nw.MenuItem({ + label: 'Message', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " msg 0"); + }, + key: '2', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Number', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " floatatom 0"); + }, + key: '3', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Symbol', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " symbolatom 0"); + }, + key: '4', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Comment', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " text 0"); + }, + key: '5', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + putMenu.append(new nw.MenuItem({ + label: 'Bang', + click: function(e) { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " bng 0"); + }, + key: 'b', + modifiers: "ctrl-shift" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Toggle', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " toggle 0"); + }, + key: 't', + modifiers: "ctrl-shift" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Number2', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " numbox 0"); + }, + key: 'n', + modifiers: "ctrl-shift" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Vslider', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " vslider 0"); + }, + key: 'v', + modifiers: "ctrl-shift" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Hslider', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " hslider 0"); + }, + key: 'h', + modifiers: "ctrl-shift" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Vradio', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " vradio 0"); + }, + key: 'd', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Hradio', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " hradio 0"); + }, + key: 'i', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'VU', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " vumeter 0"); + }, + key: 'u', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Canvas', + click: function() { + pdgui.pdsend(name + " dirty 1"); + pdgui.pdsend(name + " mycnv 0"); + }, + key: 'c', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + putMenu.append(new nw.MenuItem({ + label: 'Graph', + click: function() { + pdgui.pdsend(name + " dirty 1"); + // leaving out some placement logic... see pd.tk menu_graph + pdgui.pdsend(name + " graph NULL 0 0 0 0 30 30 0 30"); + }, + key: 'a', + modifiers: "ctrl" + })); + + putMenu.append(new nw.MenuItem({ + label: 'Array', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + + // Windows menu... call it "winman" (i.e., window management) to avoid confusion + var winmanMenu = new nw.Menu(); + + // Add to windows menu + windowMenu.append(new nw.MenuItem({ + label: 'Windows', + submenu: winmanMenu + })); + + // Winman sub-entries + winmanMenu.append(new nw.MenuItem({ + label: 'Next Window', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + winmanMenu.append(new nw.MenuItem({ + label: 'Previous Window', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + winmanMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + winmanMenu.append(new nw.MenuItem({ + label: 'Parent Window', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + winmanMenu.append(new nw.MenuItem({ + label: 'Pd & Console', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + // Media menu + var mediaMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Media', + submenu: mediaMenu + })); + + // Media sub-entries + mediaMenu.append(new nw.MenuItem({ + label: 'Audio On', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + mediaMenu.append(new nw.MenuItem({ + label: 'Audio Off', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + mediaMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + mediaMenu.append(new nw.MenuItem({ + label: 'Test Audio and Midi', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + mediaMenu.append(new nw.MenuItem({ + label: 'Load Meter', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + // Help menu + var helpMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Help', + submenu: helpMenu + })); + + // Help sub-entries + helpMenu.append(new nw.MenuItem({ + label: 'About Pd-L2ork', + click: menu_generic, + key: 'c', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Manual', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Help Browser', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Pd-L2ork Mailing List', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Pure Data Mailing Lists', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'Forums', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + helpMenu.append(new nw.MenuItem({ + label: 'IRC Chat', + click: menu_generic, + key: 'a', + modifiers: "ctrl" + })); + + // Assign to window + nw.Window.get().menu = windowMenu; + +} + + + +/* +function nw_create_canvas_window_menus(name) { + // Window menu + var windowMenu = new nw.Menu; + var windowMenu = new nw.Menu({ + type: 'menubar' + }); + + + // File menu + var fileMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'File', + submenu: fileMenu + })); + + // File sub-entries + fileMenu.append(new nw.MenuItem({ + label: 'New', + click: pdgui.menu_new, + key: 'n', + modifiers: "ctrl" + })); + + fileMenu.append(new nw.MenuItem({ + label: 'Open', + key: 'o', + modifiers: "ctrl", + click: function (){ + var chooser = document.querySelector('#fileDialog'); + chooser.click(); + chooser.addEventListener("change", function(evt) { + menu_open(this.value); + console.log("tried to open something"); + }, false); + } + })); + + if (pdgui.k12_mode == 1) { + fileMenu.append(new nw.MenuItem({ + label: 'K12 Demos', + click: pdgui.menu_k12_open_demos + })); + } + + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + + // Note: this must be different for the main Pd window + fileMenu.append(new nw.MenuItem({ + label: 'Save', + click: function (){ + pdgui.menu_save(name); + }, + key: 's', + modifiers: "ctrl" + })); + + fileMenu.append(new nw.MenuItem({ + label: 'Save as...', + click: function (){ + pdgui.menu_saveas(name); + }, + key: 'S', + modifiers: "ctrl" + })); + + if (pdgui.k12_mode == 0) { + fileMenu.append(new nw.MenuItem({ + type: 'separator' + })); + } + + // Assign to window + nw.Window.get().menu = windowMenu; +} +*/ + + </script> + </body> +</html> diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js new file mode 100644 index 000000000..825bafcca --- /dev/null +++ b/pd/nw/pdgui.js @@ -0,0 +1,2695 @@ +'use strict'; + +// Modules + +var pwd; + +exports.set_pwd = function(pwd_string) { + pwd = pwd_string; +} + +exports.get_pwd = function() { + return pwd; +} + +var fs = require('fs'); // for fs.existsSync +var path = require('path'); // for path.dirname path.extname + +var pd_window; +exports.pd_window; + +exports.set_pd_window = function(win) { + pd_window = win; + exports.pd_window = win; +} + +var nw_create_window; +var nw_close_window; +var nw_app_quit; + +exports.set_new_window_fn = function (nw_context_fn) { + nw_create_window = nw_context_fn; +} + +exports.set_close_window_fn = function (nw_context_fn) { + nw_close_window = nw_context_fn; +} + +// Global variables from tcl +var pd_myversion, // Pd version string + pd_apilist, // Available Audio APIs (tcl list) + pd_midiapilist, // MIDI APIsa (tcl list) + pd_nt, // Something to do with Windows configuration + fontname, // Font + fontweight, // config + pd_fontlist, // (Seems to be hard coded in Pd-l2ork) + pd_whichmidiapi, // MIDI API, set by pd->gui message + pd_whichapi, // Audio API, set by pd->gui message + pd_opendir, // + pd_guidir, // + pd_tearoff, // + put_tearoff, // + tcl_version, // + canvas_fill, // + colors, // + global_clipboard, // + global_selection, // + k12_mode = 0, // should be set from argv ('0' is just a stopgap) + k12_saveas_on_new, // + autotips, // tooltips + magicglass, // cord inspector + window_prefs, //retaining window-specific preferences + pdtk_canvas_mouseup_name, // not sure what this does + filetypes, // valid file extensions for opening/saving (includes Max filetypes) + untitled_number, // number to increment for each new patch that is opened + untitled_directory, // default directory where to create/save new patches + popup_coords, // x/y for current popup window (global because there's only one at a time) + pd_colors = {}; // associative array of canvas color presets + + var pd_filetypes = { ".pd": "Pd Files", + ".pat":"Max Patch Files", + ".mxt":"Max Text Files", + ".mxb":"Max Binary Files", + ".help":"Max Help Files" + }; + + exports.k12_mode = k12_mode; + exports.pd_filetypes = pd_filetypes; + + popup_coords = [0,0]; + + var startup_files = []; // Array of files to be opened at startup (from the command line) + + var pd_keymap = {}; // to iteratively map keydown/keyup keys + // to keypress char codes + +function set_keymap(keycode, charcode) { + pd_keymap[keycode] = charcode; +} + +exports.set_keymap = set_keymap; + +function get_char_code(keycode) { + return pd_keymap[keycode]; +} + +exports.get_char_code = get_char_code; + + // Hard-coded Pd-l2ork font metrics +/* +var font_fixed_metrics = "\ +8 5 11 \ +9 6 12 \ +10 6 13 \ +12 7 16 \ +14 8 17 \ +16 10 19 \ +18 11 22 \ +24 14 29 \ +30 18 37 \ +36 22 44"; +*/ + +// Let's try to get some metrics specific to Node-webkit... + // Hard-coded Pd-l2ork font metrics +var font_fixed_metrics = "\ +8 5 11 \ +9 6 12 \ +10 6 13 \ +12 7 16 \ +14 8 17 \ +16 10 19 \ +18 11 22 \ +24 14 29 \ +30 18 37 \ +36 22 44"; + + +// Utility Functions + +// originally used to enquote a string to send it to a tcl function +function enquote (x) { + var foo = x.replace(/,/g, ""); + foo = foo.replace(/;/g, ""); + foo = foo.replace(/"/g, ""); + foo = foo.replace(/ /g, "\\ "); + foo = foo.trim(); + return foo; +} + +// from stackoverflow.com/questions/21698906/how-to-check-if-a-path-is-absolute-or-relative +// this doesn't seem to be needed atm +function path_is_absolute(myPath) { + var ret = (path.resolve(myPath) === path.normalize(myPath).replace(/(.+)([\/]\\])$/, '$1')); + return ret; +} + +function set_midiapi(val) { + pd_whichmidiapi = val; +} + +function set_audioapi(val) { + pd_whichapi = val; +} + +function gui_post(string, color) { + if (color === undefined) { color = "black" }; + var myp = pd_window.document.getElementById('p1'); + var text; + var span = pd_window.document.createElement("span"); + span.style.color = color; + var text = pd_window.document.createTextNode(string + "\n"); + span.appendChild(text); + myp.appendChild(span); + pd_window.window.scrollTo(0, pd_window.document.body.scrollHeight); +} + +exports.gui_post = gui_post; + +function pd_error_select_by_id(objectid) { + if (objectid !== null) { + pdsend("pd findinstance " + objectid); + } +} +exports.pd_error_select_by_id = pd_error_select_by_id + +function gui_post_error(objectid, loglevel, errormsg) { + var my_p = pd_window.document.getElementById('p1'); + // if we have an object id, make a friendly link... + var error_title = pd_window.document.createTextNode("error"); + if (objectid.length > 0) { + var my_a = pd_window.document.createElement('a'); + my_a.href = "javascript:pdgui.pd_error_select_by_id('" + objectid + "')"; + my_a.appendChild(error_title); + my_p.appendChild(my_a); + } else { + my_p.appendChild(error_title); + } + var rest = pd_window.document.createTextNode(": " + errormsg + "\n"); + my_p.appendChild(rest); + + // looks like tcl/tk tried to throttle this... maybe we should, too... + /* + after cancel .printout.frame.text yview end-2char + after idle .printout.frame.text yview end-2char + .printout.frame.text configure -state disabled + */ +} + +function menu_save(name) { +// gui_post(name + " menusave"); + pdsend(name + " menusave"); +} + +exports.menu_save = menu_save; + +function gui_canvas_saveas (name, initfile, initdir) { + gui_post("working directory is " + pwd); + //global pd_nt filetypes untitled_directory + if (!fs.existsSync(initdir)) { + initdir = pwd; + } +// patchwin[name].window.document.getElementById("fileDialog").setAttribute("nwworkingdir", pwd); + var chooser = patchwin[name].window.document.querySelector('#saveDialog'); + chooser.click(); +// chooser.addEventListener("change", function(evt) { +// saveas_callback(name, this.value); +// console.log("tried to open something"); +// }, false); +} + +function saveas_callback(cid, file) { + gui_post("tried a saveas, and the file chosen is " + file); + var filename = file; + // It probably isn't possible to arrive at the callback with an + // empty string. But I've only tested on Debian so far... + if (filename === null) { + return; + } + // We don't need to use the codepath below because node-webkit + // let's us specify the allowed files extensions. Lo and behold, + // nw just does the "right thing" whether the user types an extension + // or not. This should put us on part with Microsoft Word in the late + // 90s. + //var lc = filename.toLowerCase(); + //if (lc.slice(-3) !== '.pd' && + // lc.slice(-4) !== '.pat' && + // lc.slice(-4) !== '.mxt') { + // remove any other extensions + // filename = filename.slice(0, + // (filename.length - path.extname(filename).length)); + // add ".pd" + // filename = filename + '.pd'; + //} + // test again after downcasing and maybe adding a ".pd" on the end + //if (fs.existsSync(filename)) { + // var reply = patchwin[cid].window.confirm(filename + + // " already exists. Do you want to replace it?"); + // if (!reply) { + // return; + // } + //} + var directory = path.dirname(filename); + var basename = path.basename(filename); + pdsend(cid + " savetofile " + enquote(basename) + " " + + enquote(directory)); + + // haven't implemented these last few commands yet... + // set untitled_directory $directory + // add to recentfiles + //::pd_guiprefs::update_recentfiles "$filename" 1 +} + +exports.saveas_callback = saveas_callback; + +function menu_saveas(name) { + pdsend(name + " menusaveas"); +} + +exports.menu_saveas = menu_saveas; + +function menu_new () { + //if { ! [file isdirectory $untitled_directory]} {set untitled_directory $::env(HOME)} + untitled_directory = pwd; + pdsend("pd filename " + "Untitled-" + untitled_number + " " + enquote(untitled_directory)); + if (k12_mode == 1) { + k12_saveas_on_new = 1; + pdsend("#N canvas"); + pdsend("#X obj -30 -30 preset_hub k12 1 %hidden%"); + pdsend("#X pop 1"); + } else { + pdsend("#N canvas"); + pdsend("#X pop 1"); + } + untitled_number++; +} + +exports.menu_new = menu_new; + +function gui_close_window(cid) { + nw_close_window(patchwin[cid]); +} + +function menu_k12_open_demos () { + +} + +exports.menu_k12_open_demos = menu_k12_open_demos; + + +function menu_open (filenames_string) { + gui_post("menu_open " + filenames_string); + var file_array = filenames_string.split(";"); + var length = file_array.length; + gui_post("file_array is " + file_array); + for (var i = 0; i < length; i++) { + open_file(file_array[i]); + } +} + +exports.menu_open = menu_open; + +function menu_close(name) { + // not handling the "text editor" yet + // not handling the "Window" menu yet + //pdtk_canvas_checkgeometry $name + pdsend(name + " menuclose 0"); +} + +exports.menu_close = menu_close; + +function canvas_menuclose_callback(cid_for_dialog, cid, force) { + // Hacky-- this should really be dir/filename here instead of + // filename/args/dir which is ugly + var title = patchwin[cid_for_dialog].window.document.title; + var reply = patchwin[cid_for_dialog].window.confirm("Save changes to " + title + "?"); + if (reply) { + pdsend(cid_for_dialog + " menusave"); + } else { + pdsend(cid_for_dialog + " dirty 0"); + pdsend(cid + " menuclose " + force); + } +} + +function gui_canvas_menuclose(cid_for_dialog, cid, force) { + // Hack to get around a renderer bug-- not guaranteed to work + // for long patches + setTimeout(function() { + canvas_menuclose_callback(cid_for_dialog, cid, force); + }, 450); +} + +function gui_pd_quit_dialog() { + var reply = pd_window.window.confirm("Really quit?"); + if (reply === true) { + pdsend("pd quit"); + } +} + +// send a message to Pd +function menu_send() { + gui_post("message...pdwindow is " + pd_window); + var message = pd_window.window.prompt("Type a message to send to Pd"); + if (message != undefined && message.length) { + gui_post("Sending message to Pd: " + message + ";"); + pdsend(message); + } +} + +exports.menu_send = menu_send; + +function menu_quit() { + pdsend("pd verifyquit"); +} + +exports.menu_quit = menu_quit; + +var nw_app_quit; + +function app_quit() { + nw_app_quit(); +} + +exports.set_app_quitfn = function(quitfn) { + nw_app_quit = quitfn; +} + +function open_file(file) { + //from tcl... + //global pd_opendir pd_guidir pd_nt + gui_post("open_file: " + file); + var directory = path.dirname(file); + var basename = path.basename(file); + var cyclist; + if (basename.match(/\.(pat|mxb|help)$/) !=null) { + gui_post("warning: opening pat|mxb|help not implemented yet"); + //gui_post("converting " + filename); + if (pd_nt == 0) { + // on GNU/Linux, cyclist is installed into /usr/bin usually + cyclist = "/usr/bin/cyclist"; + } else { + cyclist = pd_guidir + "/bin/cyclist" + } + //gui_post(cyclist + filename); + //convert Max binary to text .pat + // The following is tcl code which needs to get converted to javascript... + //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 (basename.match(/\.(pd|pat|mxt)$/i) != null) { + pdsend("pd open" + " " + enquote(basename) + " " + enquote(directory)); + pd_opendir = directory; + //::pd_guiprefs::update_recentfiles "$filename" 1 + } +} + +// Doesn't work yet... need to figure out how to send command line args (files) to be opened by +// the unique instance +function gui_open_files_via_unique(filenames) +{ + gui_post("pdtk_open_files_via_unique " + filenames); + length = filenames.length; + if (length != 0) { + for (var i = 0; i < length; i++) { + var file = filenames[i]; + //gui_post("open_file " + file); + open_file(file); + } + } +} + +function gui_build_filelist(file) { + startup_files.push(file); +} + +// This doesn't work at the moment. Not sure how to feed the command line filelist to a single +// instance of node-webkit. +function gui_check_unique (unique) { + // gui_post("pdtk_check_unique " + unique); + // global appname + return; + var final_filenames = new Array; + var startup_dir = pwd; + if (unique == 0) { + var filelist_length = startup_files.length; + for (var i = 0; i < filelist_length; i++) { + var file = startup_files[i]; + var dir; + //gui_post (file [file dirname $file] $startup_dir" + if (!pathIsAbsolute(file)) { + file = fs.join(pwd, file); + } + final_filenames.push(file); + } + gui_open_files_via_unique(final_filenames); + } + // old tcl follows... + //if path is relative + //then join pwd and relative path + //else + //use the absolute path + //(no need to check for existence here) + + // catch {cd [file dirname $file]} + // set dir [pwd] + + //file tail should be the filename + + // set name [file tail $file] + // #puts stderr "********DIR:$dir FILE:$name COMBINED:[file join $dir $name]" + // lappend final_filenames [file join $dir $name] + // cd $startup_dir + // } + // #puts stderr "send pd-l2ork pdtk_open_files_via_unique $final_filenames" + // set outcome [catch {send pd-l2ork pdtk_open_files_via_unique \{$final_filenames\}}] + // #puts stderr "outcome = $outcome" + // if { $outcome == 0 } { + // menu_really_quit + // exit + // } + //} + // tk appname $appname + // #puts stderr "this is unique instance [tk appname]" +} + + + +function gui_startup(version, apilist, midiapilist, fontname_from_pd, fontweight_from_pd) { + console.log("we're starting up..."); + // # tb: user defined typefaces + // our args: +// console.log(version); +// console.log(apilist); +// console.log(fontname); + + // set some global variables + pd_myversion = version; + pd_apilist = apilist; + pd_midiapilist = midiapilist; + + fontname = fontname_from_pd; + fontweight = fontweight_from_pd; + pd_fontlist = ""; + untitled_number = 1; // global variable to increment for each new patch + + // From tcl, not sure if needed... + // # on Mac OS X, lower the Pd window to the background so patches open on top + // if {$pd_nt == 2} { lower . } + // # on Windows, raise the Pd window so that it has focused when launched + // if {$pd_nt == 1} { raise . } + +// set fontlist "" +// if {[info tclversion] >= 8.5} {find_default_font} +// set_base_font $fontname_from_pd $fontweight_from_pd +// fit_font_into_metrics + +// # UBUNTU MONO 6 6 8 10 11 14 14 19 22 30 +// # DEJAVU SANS MONO 6 6 8 9 10 12 14 18 22 29 + +//# foreach i {6 6 8 10 11 14 14 19 22 30} { +//# set font [format {{%s} %d %s} $fontname_from_pd $i $fontweight_from_pd] +//# set pd_fontlist [linsert $pd_fontlist 100000 $font] +//# set width0 [font measure $font x] +//# set height0 [lindex [font metrics $font] 5] +//# set fontlist [concat $fontlist $i [font measure $font x] \ +//# [lindex [font metrics $font] 5]] +//# } + +// set tclpatch [info patchlevel] +// if {$tclpatch == "8.3.0" || \ +// $tclpatch == "8.3.1" || \ +// $tclpatch == "8.3.2" || \ +// $tclpatch == "8.3.3" } { +// set oldtclversion 1 +// } else { +// set oldtclversion 0 +// } + pdsend("pd init " + enquote(pwd) + " 0 " + font_fixed_metrics); + +// # add the audio and help menus to the Pd window. We delayed this +// # so that we'd know the value of "apilist". +// menu_addstd .mbar + +// global pd_nt +// if {$pd_nt == 2} { +// global pd_macdropped pd_macready +// set pd_macready 1 +// foreach file $pd_macdropped { +// pd [concat pd open [pdtk_enquote [file tail $file]] \ +// [pdtk_enquote [file dirname $file]] \;] +// menu_doc_open [file dirname $file] [file tail $file] +// } +// } +} + + + + + + + +/* + // Some other menu + var fooMenu = new nw.Menu(); + + // Add to window menu + windowMenu.append(new nw.MenuItem({ + label: 'Foo', + submenu: fooMenu + })); + + // Foo sub-entry + fooMenu.append(new nw.MenuItem({ + label: 'flub', + click: function(){ + alert('Foo flub'); + } + })); + + // Another Foo sub-entry + fooMenu.append(new nw.MenuItem({ + label: 'bub', + click: function(){ + alert('Foo bub'); + } + })); +} + + +/* +function canvas_create_menus(name) { + // the "File" menu + + // The menus are instantiated here for the patch windows. + // For the main window, they are created on load, at the + // top of this file. + match_linux_wm [list menu $name.m -relief flat] + match_linux_wm [list menu $name.m.file -postcommand [concat pdtk_fixfilemenu $name.m.file] -tearoff $pd_tearoff] + $name.m add cascade -label File -menu $name.m.file + + $name.m.file add command -label New -command {menu_new} \ + -accelerator [accel_munge "Ctrl+n"] + + $name.m.file add command -label Open -command {menu_open} \ + -accelerator [accel_munge "Ctrl+o"] + + if { $k12_mode == 1 } { + $name.m.file add command -label {K12 Demos} -command {menu_k12_open_demos} + } + + match_linux_wm [list $name.m.file add separator] + + $name.m.file add command -label Save -command [concat menu_save $name] \ + -accelerator [accel_munge "Ctrl+s"] + + $name.m.file add command -label "Save as..." \ + -command [concat menu_saveas $name] \ + -accelerator [accel_munge "Ctrl+S"] + if { $k12_mode == 0 } { + match_linux_wm [list $name.m.file add separator] + + # arrange menus according to Apple HIG + if {$pd_nt != 2 } { + $name.m.file add command -label "Message..." -command {menu_send} \ + -accelerator [accel_munge "Ctrl+m"] + # these are now part of Preferences... on Mac OS X + $name.m.file add command -label Path... \ + -command {pd pd start-path-dialog \;} + $name.m.file add command -label Startup... \ + -command {pd pd start-startup-dialog \;} + } else { + # Cmd-m is minimize window on Mac OS X + $name.m.file add command -label "Message..." -command {menu_send} + match_linux_wm [list $name.m.file add separator] + $name.m.file add command -label "Make app from patch..." \ + -command {menu_makeapp 0} + $name.m.file add command -label "Make app from folder..." \ + -command {menu_makeapp 1} + } + match_linux_wm [list $name.m.file add separator] + $name.m.file add command -label "Print..." -command [concat menu_print $name] \ + -accelerator [accel_munge "Ctrl+p"] + } + # update recent files + match_linux_wm [list $name.m.file add separator] + $name.m.file add command -label "No Recent Files" -state disabled + #match_linux_wm [list $name.m.file add separator] + #if {[llength $::recentfiles_list] > 0} { + # ::pd_menus::update_recentfiles_menu $name.m.file false + #} + + match_linux_wm [list $name.m.file add separator] + $name.m.file add command -label Close \ + -command [concat menu_close $name] \ + -accelerator [accel_munge "Ctrl+w"] + + if {$pd_nt != 2} { + # Mac OS X doesn't put Quit on the File menu + $name.m.file add command -label Quit -command {menu_quit} \ + -accelerator [accel_munge "Ctrl+q"] + } + + # the "Edit" menu + match_linux_wm [list menu $name.m.edit -postcommand [concat menu_fixeditmenu $name] -tearoff $pd_tearoff] + $name.m add cascade -label Edit -menu $name.m.edit + + $name.m.edit add command -label Undo -command [concat menu_undo $name] \ + -accelerator [accel_munge "Ctrl+z"] + + $name.m.edit add command -label Redo -command [concat menu_redo $name] \ + -accelerator [accel_munge "Ctrl+Z"] + + match_linux_wm [list $name.m.edit add separator] + + $name.m.edit add command -label Cut -command [concat menu_cut $name] \ + -accelerator [accel_munge "Ctrl+x"] -state disabled + + $name.m.edit add command -label Copy -command [concat menu_copy $name] \ + -accelerator [accel_munge "Ctrl+c"] -state disabled + + $name.m.edit add command -label Paste \ + -command [concat menu_paste $name] \ + -accelerator [accel_munge "Ctrl+v"] + + if {!$global_clipboard} { + $name.m.edit entryconfigure "Paste" -state disabled + } else { + $name.m.edit entryconfigure "Paste" -state normal + } + + $name.m.edit add command -label Duplicate \ + -command [concat menu_duplicate $name] \ + -accelerator [accel_munge "Ctrl+d"] + + if {!$global_selection} { + $name.m.edit entryconfigure "Duplicate" -state disabled + } else { + $name.m.edit entryconfigure "Duplicate" -state normal + } + + $name.m.edit add command -label {Select all} \ + -command [concat menu_selectall $name] \ + -accelerator [accel_munge "Ctrl+a"] + + if { $k12_mode == 0 } { + $name.m.edit add command -label {Reselect} \ + -command [concat menu_reselect $name] \ + -accelerator "Ctrl+Enter" -state disabled + } + + match_linux_wm [list $name.m.edit add separator] + + $name.m.edit add command -label {Tidy Up} \ + -command [concat menu_tidyup $name] \ + -accelerator [accel_munge "Ctrl+y"] -state disabled + + if { $k12_mode == 0 } { + + $name.m.edit add command -label {Bring To Front} \ + -command [concat popup_action $name 3] \ + -accelerator [accel_munge "Ctrl+Up"] -state disabled + + $name.m.edit add command -label {Send To Back} \ + -command [concat popup_action $name 4] \ + -accelerator [accel_munge "Ctrl+Down"] -state disabled + } + + match_linux_wm [list $name.m.edit add separator] + + if { $k12_mode == 0 } { + + #if {$pd_nt == 2} { # no key command on Mac OS X, conflicts with standard + # $name.m.edit add command -label {Text Editor} \ + # -command [concat menu_texteditor $name] + #} else { + # $name.m.edit add command -label {Text Editor} \ + # -accelerator [accel_munge "Ctrl+t"] \ + # -command [concat menu_texteditor $name] + #} + + $name.m.edit add command -label Font \ + -command [concat menu_font $name] + } + +## jsarlo + $name.m.edit add checkbutton -label "Cord Inspector" \ + -indicatoron false -selectcolor black \ + -command [concat menu_magicglass $name] \ + -accelerator [accel_munge "Ctrl+r"] + + #if { $editable == 0 } { + # $name.m.edit entryconfigure "Cord Inspector" -indicatoron false } + + match_linux_wm [list $name.m.edit add separator] +## end jsarlo + + $name.m.edit add command -label "Toggle console" \ + -accelerator [accel_munge "Ctrl+R"] \ + -command [concat .controls.switches.console invoke] + + $name.m.edit add command -label "Clear console" \ + -accelerator [accel_munge "Ctrl+L"] \ + -command [concat menu_clear_console] + + match_linux_wm [list $name.m.edit add separator] + + if { $k12_mode == 0 } { + + # Apple, Microsoft, and others put find functions in the Edit menu. + $name.m.edit add command -label {Find...} \ + -accelerator [accel_munge "Ctrl+f"] \ + -command [concat menu_findobject $name] + $name.m.edit add command -label {Find Again} \ + -accelerator [accel_munge "Ctrl+g"] \ + -command [concat menu_findagain $name] + $name.m.edit add command -label {Find last error} \ + -command [concat menu_finderror] + + match_linux_wm [list $name.m.edit add separator] + + ############iemlib################## + # instead of "red = #BC3C60" we take "grey85", so there is no difference, + # if widget is selected or not. + + $name.m.edit add checkbutton -label "Autotips" \ + -indicatoron false -selectcolor black \ + -command [concat menu_tooltips $name] \ + -accelerator [accel_munge "Ctrl+E"] + } + + $name.m.edit add checkbutton -label "Edit mode" \ + -indicatoron false -selectcolor black \ + -command [concat menu_editmode $name] \ + -accelerator [accel_munge "Ctrl+e"] + if {$k12_mode == 0} { + match_linux_wm [list $name.m.edit add separator] + $name.m.edit add command -label {Preferences...} \ + -command {::dialog_prefs::open_prefs_dialog .} + } + + if { $editable == 1 } { + $name.m.edit entryconfigure "Edit mode" -background "#7dd37d" -foreground black + } + + if { $k12_mode == 0 && $autotips == 1 } { + $name.m.edit entryconfigure "Autotips" -background "#7dd37d" -foreground "#dddddd" + } + + set ::editmode($name) $editable + + #if { $magicglass == 1 } { + # $name.m.edit entryconfigure "Cord Inspector" -background "#7dd37d" + # menu_magicglass $name + #} + + #if { $editable == 0 } { + # $name.m.edit entryconfigure "Edit mode" -indicatoron false + #} + +*/ + + + +// From what used to be canvas.js + +// Global canvas associative arrays (aka javascript objects) +var scroll = {}, + menu = {}, + canvas_color = {}, + topmost = {}, + resize = {}, + xscrollable = {}, + yscrollable = {}, + update_tick = {}, + drag_tick = {}, + undo = {}, + redo = {}, + font = {}, + doscroll = {}, + last_loaded, + loaded = {}, + popup_menu = {}; + + var patchwin = {}; // Associative array of patch windows + +exports.get_patchwin = function(name) { + return patchwin[name]; +} + +// stopgap... +pd_colors['canvas_color'] = "white"; + +exports.last_loaded = function () { + return last_loaded; +} + +// close a canvas window + +function gui_canvas_cursor(cid, pd_event_type) { + var patch = get_item(cid, "patchsvg"); + var c; + // A quick mapping of events to pointers-- these can + // be revised later + switch(pd_event_type) { + case "cursor_runmode_nothing": + c = 'default'; + break; + case "cursor_runmode_clickme": + c = 'pointer'; + break; + case "cursor_runmode_thicken": + c = 'inherit'; + break; + case "cursor_runmode_addpoint": + c = 'cell'; + break; + case "cursor_editmode_nothing": + c = 'pointer'; + break; + case "cursor_editmode_connect": + c = '-webkit-grabbing'; + break; + case "cursor_editmode_disconnect": + c = 'no-drop'; + break; + case "cursor_editmode_resize": + c = 'ew-resize'; + break; + case "cursor_editmode_resize_bottom_right": + c = 'se-resize'; + break; + case "cursor_scroll": + c = 'all-scroll'; + break; + } + patch.style.cursor = c; +} + +function gui_canvas_sendkey(cid, state, evt, char_code) { + pdsend( + cid + " key " + + state + " " + + char_code + " " + + (evt.shiftKey ? 1 : 0) + " " + + 1 + " " + + (evt.repeat ? 1 : 0) + ); +} + +exports.gui_canvas_sendkey = gui_canvas_sendkey; + +function title_callback(cid, title) { + patchwin[cid].window.document.title = title; +} + +function format_window_title(name, dirty_flag, args, dir) { + return name + " " + (dirty_flag ? "*" : "") + args + " - " + dir; +} + +exports.format_window_title = format_window_title; + +// This should be used when a file is saved with the name changed (and maybe in other situations) +function gui_canvas_set_title(cid, name, args, dir, dirty_flag) { + var title = format_window_title(name, dirty_flag, args, dir); + patchwin[cid].title = title; +} + +// create a new canvas +// todo: rename parameter "name" to "cid" +function gui_canvas_new(cid, width, height, geometry, editable, name, dir, dirty_flag, cargs) { + gui_post("canvas name is " + name); + gui_post("canvas string is " + name); + gui_post("canvas dir " + dir); + gui_post("canvas dirty_flag is " + dirty_flag); + gui_post("canvas cargsis " + cargs); + // hack for buggy tcl popups... should go away for node-webkit + //reset_ctrl_on_popup_window + + // local vars for window-specific behavior + // visibility of menu and scrollbars, plus canvas background + scroll[cid] = 1; + menu[cid] = 1; + // attempt at getting global presets to play + // well with local settings. + var my_canvas_color = ""; + //canvas_color[cid] = orange; + my_canvas_color = pd_colors['canvas_color']; + topmost[cid] = 0; + resize[cid] = 1; + xscrollable[cid] = 0; + yscrollable[cid] = 0; + update_tick[cid] = 0; + drag_tick[cid] = 0; + undo[cid] = false; + redo[cid] = false; + font[cid] = 10; + doscroll[cid] = 0; + // geometry is just the x/y screen offset "+xoff+yoff" + geometry = geometry.slice(1); // remove the leading "+" + geometry = geometry.split("+"); // x/y screen offset (in pixels) + // Keep patches on the visible screen + var xpos = Math.min(Number(geometry[0]), window.screen.height - width); + var ypos = Math.min(Number(geometry[1]), window.screen.height - height); + xpos = Math.max(xpos, 0); + ypos = Math.max(ypos, 0); + var menu_flag; + if (menu[cid] == 1) { + menu_flag = true; + } else { + menu_flag = false; + } + last_loaded = cid; + // Not sure why resize and topmost are here-- but we'll pass them on for the time being... + patchwin[cid] = nw_create_window(cid, width, height, xpos, ypos, menu_flag, + resize[cid], topmost[cid], my_canvas_color, name, dir, dirty_flag, cargs); + + // initialize variable to reflect that this window has been opened + loaded[cid] = 1; + //#pdtk_standardkeybindings $cid.c +} + +function canvas_map(name) { + console.log("canvas mapping " + name + "..."); + pdsend(name + " map 1"); +} + +exports.canvas_map = canvas_map; + +/* + ############iemlib################## + + if { $k12_mode == 0 } { + + # the "Put" menu + match_linux_wm [list menu $name.m.put -tearoff $put_tearoff] + $name.m add cascade -label Put -menu $name.m.put + + $name.m.put add command -label Object \ + -command [concat menu_object $name 0] \ + -accelerator [accel_munge "Ctrl+1"] + + $name.m.put add command -label Message \ + -command [concat menu_message $name 0] \ + -accelerator [accel_munge "Ctrl+2"] + + $name.m.put add command -label Number \ + -command [concat menu_floatatom $name 0] \ + -accelerator [accel_munge "Ctrl+3"] + + $name.m.put add command -label Symbol \ + -command [concat menu_symbolatom $name 0] \ + -accelerator [accel_munge "Ctrl+4"] + + $name.m.put add command -label Comment \ + -command [concat menu_comment $name 0] \ + -accelerator [accel_munge "Ctrl+5"] + + match_linux_wm [list $name.m.put add separator] + + ############iemlib################## + + $name.m.put add command -label Bang \ + -command [concat menu_bng $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+b"] + + $name.m.put add command -label Toggle \ + -command [concat menu_toggle $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+t"] + + $name.m.put add command -label Number2 \ + -command [concat menu_numbox $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+n"] + + $name.m.put add command -label Vslider \ + -command [concat menu_vslider $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+v"] + + $name.m.put add command -label Hslider \ + -command [concat menu_hslider $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+h"] + + $name.m.put add command -label Vradio \ + -command [concat menu_vradio $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+d"] + + $name.m.put add command -label Hradio \ + -command [concat menu_hradio $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+i"] + + $name.m.put add command -label VU \ + -command [concat menu_vumeter $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+u"] + + $name.m.put add command -label Canvas \ + -command [concat menu_mycnv $name 0] \ + -accelerator [accel_munge "Shift+Ctrl+c"] + + ############iemlib################## + + match_linux_wm [list $name.m.put add separator] + + $name.m.put add command -label Graph \ + -command [concat menu_graph $name] + + $name.m.put add command -label Array \ + -command [concat menu_array $name] + + # the find menu + # Apple, Microsoft, and others put find functions in the Edit menu. + # But in order to move these items to the Edit menu, the Find menu + # handling needs to be dealt with, including this line in g_canvas.c: + # sys_vgui(".mbar.find delete %d\n", i); + # <hans@at.or.at> + #match_linux_wm [list menu $name.m.find -tearoff $put_tearoff] + #$name.m add cascade -label Find -menu $name.m.find + # + #$name.m.find add command -label {Find...} \ + # -accelerator [accel_munge "Ctrl+f"] \ + # -command [concat menu_findobject $name] + #$name.m.find add command -label {Find Again} \ + # -accelerator [accel_munge "Ctrl+g"] \ + # -command [concat menu_findagain $name] + #$name.m.find add command -label {Find last error} \ + # -command [concat menu_finderror] + + # the window menu + match_linux_wm [list menu $name.m.windows -postcommand \ + [concat menu_fixwindowmenu $name] -tearoff $pd_tearoff] + + if {$pd_nt == 2} { + $name.m.windows add command -label {Minimize} \ + -command "menu_minimize $name" -accelerator [accel_munge "Ctrl+m"] + $name.m.windows add command -label {Zoom} -command "menu_zoom $name" + } else { + $name.m.windows add command -label "Next Window" -command {menu_raisenextwindow} \ + -accelerator "Ctrl+PageDown" + $name.m.windows add command -label "Previous Window" -command {menu_raisepreviouswindow} \ + -accelerator "Ctrl+PageUp" + } + match_linux_wm [list $name.m.windows add separator] + $name.m.windows add command -label {parent window}\ + -command [concat menu_windowparent $name] + $name.m.windows add command -label {Pd & Console} -command menu_raise_console \ + -accelerator [accel_munge "Ctrl+;"] + match_linux_wm [list $name.m.windows add separator] + + # the audio menu + match_linux_wm [list menu $name.m.audio -tearoff $pd_tearoff] + + if {$pd_nt != 2} { + $name.m add cascade -label Windows -menu $name.m.windows + $name.m add cascade -label Media -menu $name.m.audio + } else { + $name.m add cascade -label Media -menu $name.m.audio + $name.m add cascade -label Window -menu $name.m.windows + # the MacOS X app menu + menu $name.m.apple -tearoff $pd_tearoff + $name.m add cascade -label "Apple" -menu $name.m.apple + } + + # the "Help" menu + + match_linux_wm [list menu $name.m.help -tearoff $pd_tearoff] + $name.m add cascade -label Help -menu $name.m.help + + menu_addstd $name.m + } + + # the popup menu + match_linux_wm [list menu $name.popup -tearoff false] + if { $k12_mode == 0 } { + $name.popup add command -label {Properties} \ + -command [concat popup_action $name 0] + $name.popup add command -label {Open} \ + -command [concat popup_action $name 1] + $name.popup add command -label {Help} \ + -command [concat popup_action $name 2] + match_linux_wm [list $name.popup add separator] + $name.popup add command -label {To Front} \ + -command [concat popup_action $name 3] + $name.popup add command -label {To Back} \ + -command [concat popup_action $name 4] + } else { + $name.popup add command -label {Properties} -state disabled \ + -command [concat popup_action $name 0] + $name.popup add command -label {Open} -state disabled \ + -command [concat popup_action $name 1] + $name.popup add command -label {Help} \ + -command [concat popup_action $name 2] + match_linux_wm [list $name.popup add separator] + $name.popup add command -label {To Front} -state disabled \ + -command [concat popup_action $name 3] + $name.popup add command -label {To Back} -state disabled \ + -command [concat popup_action $name 4] + } + + # fix menu font size on Windows with tk scaling = 1 + if {$pd_nt == 1} { + $name.m.file configure -font menuFont + $name.m.edit configure -font menuFont + $name.m.find configure -font menuFont + $name.m.put configure -font menuFont + $name.m.windows configure -font menuFont + $name.m.audio configure -font menuFont + $name.m.help configure -font menuFont + $name.popup configure -font menuFont + } + + # WM protocol + wm protocol $name WM_DELETE_WINDOW [concat menu_close $name] + + # bindings. + # this is idiotic -- how do you just sense what mod keys are down and + # pass them on? I can't find it anywhere. + # Here we encode shift as 1, control 2, alt 4, in agreement + # with definitions in g_canvas.c. The third button gets "8" but we don't + # bother with modifiers there. + # We don't handle multiple clicks yet. + + bind $name.c <Configure> {pdtk_canvas_getscroll %W} + #bind $name.c <Configure> {after 100 pdtk_canvas_getscroll_configure %W} + bind $name.c <Button> {pdtk_canvas_click %W %x %y %b 0} + bind $name.c <Shift-Button> {pdtk_canvas_click %W %x %y %b 1} + bind $name.c <Control-Shift-Button> {pdtk_canvas_click %W %x %y %b 3} + # Alt key is called Option on the Mac + if {$pd_nt == 2} { + bind $name.c <Option-Button> {pdtk_canvas_click %W %x %y %b 4} + bind $name.c <Option-Shift-Button> {pdtk_canvas_click %W %x %y %b 5} + bind $name.c <Option-Control-Button> {pdtk_canvas_click %W %x %y %b 6} + bind $name.c <Mod1-Button> {pdtk_canvas_click %W %x %y %b 6} + bind $name.c <Option-Control-Shift-Button> \ + {pdtk_canvas_click %W %x %y %b 7} + } else { + bind $name.c <Alt-Button> {pdtk_canvas_click %W %x %y %b 4} + bind $name.c <Alt-Shift-Button> {pdtk_canvas_click %W %x %y %b 5} + bind $name.c <Alt-Control-Button> {pdtk_canvas_click %W %x %y %b 6} + bind $name.c <Alt-Control-Shift-Button> \ + {pdtk_canvas_click %W %x %y %b 7} + } + # button 2 is the right button on Mac; on other platforms it's button 3. + if {$pd_nt == 2} { + bind $name.c <Button-2> {pdtk_canvas_rightclick %W %x %y %b} + bind $name.c <Control-Button> {pdtk_canvas_rightclick %W %x %y %b} + } else { + bind $name.c <Button-3> {pdtk_canvas_rightclick %W %x %y %b} + bind $name.c <Control-Button> {pdtk_canvas_click %W %x %y %b 2} + } + #on linux, button 2 "pastes" from the X windows clipboard + if {$pd_nt == 0} { + bind $name.c <Button-2> {pdtk_canvas_middleclick %W %x %y %b 0;} + } + + bind $name.c <ButtonRelease> {pdtk_canvas_mouseup %W %x %y %b} + bind $name.c <Control-Key> {pdtk_canvas_ctrlkey %W %K 0} + bind $name.c <Control-Shift-Key> {pdtk_canvas_ctrlkey %W %K 1} + # bind $name.c <Mod1-Key> {puts stderr [concat mod1 %W %K %A]} + if {$pd_nt == 2} { + bind $name.c <Mod1-Key> {pdtk_canvas_ctrlkey %W %K 0} + bind $name.c <Mod1-Shift-Key> {pdtk_canvas_ctrlkey %W %K 1} + bind $name.c <Mod1-BackSpace> {pdtk_canvas_sendkey %W 1 %K %A 0 1 %t} + bind $name.c <Mod1-quoteleft> {menu_raisenextwindow} + } else { + bind $name.c <Control-Next> {menu_raisenextwindow} + bind $name.c <Control-Prior> {menu_raisepreviouswindow} ;# needs Tcl/Tk 8.5 + } + bind $name.c <Key> {pdtk_canvas_sendkey %W 1 %K %A 0 1 %t} + bind $name.c <Shift-Key> {pdtk_canvas_sendkey %W 1 %K %A 1 1 %t} + bind $name.c <KeyRelease> {pdtk_canvas_sendkey %W 0 %K %A 0 1 %t} + bind $name.c <Motion> {pdtk_canvas_motion %W %x %y 0} + bind $name.c <Shift-Motion> {pdtk_canvas_motion %W %x %y 1} + bind $name.c <Control-Motion> {pdtk_canvas_motion %W %x %y 2} + bind $name.c <Control-Shift-Motion> {pdtk_canvas_motion %W %x %y 3} + + # canvas bindings --------------------------------------------------------- + # just for tooltips right now + #$name.c bind all <Enter> "puts stderr {%x %y}" + #$name.c bind inlet <Enter> "pdtk_canvas_enteritem %W %x %y inlet %t" + #$name.c bind outlet <Enter> "pdtk_canvas_enteritem %W %x %y outlet %t" + #$name.c bind text <Enter> "pdtk_canvas_enteritem %W %x %y text %t" + #$name.c bind inlet <Leave> "pdtk_canvas_leaveitem %W inlet 0" + #$name.c bind outlet <Leave> "pdtk_canvas_leaveitem %W outlet 0" + #$name.c bind text <Leave> "pdtk_canvas_leaveitem %W text 0" + + if {$pd_nt == 2} { + bind $name.c <Option-Motion> {pdtk_canvas_motion %W %x %y 4} + } else { + bind $name.c <Alt-Motion> {pdtk_canvas_motion %W %x %y 4} + } + bind $name.c <Map> {pdtk_canvas_map %W} + bind $name.c <Unmap> {pdtk_canvas_unmap %W} + + switch $pd_nt { 0 { + bind $name.c <Button-4> "pdtk_canvas_scroll $name.c y -1" + bind $name.c <Button-5> "pdtk_canvas_scroll $name.c y +1" + bind $name.c <Shift-Button-4> "pdtk_canvas_scroll $name.c x -1" + bind $name.c <Shift-Button-5> "pdtk_canvas_scroll $name.c x +1" + #if { $k12_mode == 0 } { + # bind $name.c <Control-Button-4> "pdtk_zoom $name 1" + # bind $name.c <Control-Button-5> "pdtk_zoom $name -1" + #} + } default { + bind $name.c <MouseWheel> \ + "pdtk_canvas_scroll $name.c y \[expr -abs(%D)/%D\]" + bind $name.c <Shift-MouseWheel> \ + "pdtk_canvas_scroll $name.c x \[expr -abs(%D)/%D\]" + }} + + #dnd bindtarget $name.c text/uri-list <Drop> { pdtk_canvas_makeobjs $name %D %x %y } + after idle [list dnd bindtarget $name text/uri-list <Drop> { foreach file %D {open_file $file} }] + + # puts stderr "all done" + # after 1 [concat raise $name] + set pdtk_canvas_mouseup_name "" + + bind $name <FocusIn> "menu_fixeditmenu $name" + bind $name <FocusOut> "pdtk_canvas_leaveitem $name.c" + if { $k12_mode == 1 } { pd [concat $name tooltips 1 \;] } + after idle [concat focus $name.c] + + if { $k12_mode == 1 && $k12_saveas_on_new == 1 } { + after 1000 [concat pdtk_k12_saveas_on_new $name] + } + + set ::scroll_on($name) 0 + set ::hit_scrollbar($name) 0 + #set ::scroll_was_cursor($name) 0 + set ::last_scroll_x($name) 0 + set ::last_scroll_y($name) 0 + set ::canvaswidth($name) 0 + set ::canvasheight($name) 0 + + +/* + if { $k12_mode == 1 } { + # K-12 menu + + match_linux_wm [list frame $name.k12frame] + pack $name.k12frame -side left -fill y + + # ---------------------------------- EDIT BUTTON ----------------------------------------- + match_linux_wm [list frame $name.k12frame.edit -relief flat] + if {$editable==1} { + match_linux_wm [list button $name.k12frame.edit.b -image i.edit \ + -command [concat menu_editmode $name]] + } else { + match_linux_wm [list button $name.k12frame.edit.b -image i.perform \ + -command [concat menu_editmode $name]] + } + pack $name.k12frame.edit.b -side left -expand 1 -padx 1 -pady 0 + setTooltip $name.k12frame.edit.b "Toggle between building and playing an instrument" + pdtk_k12panel_standardkeybindings $name.k12frame.edit.b + bind $name.k12frame.edit.b <Key> [list pdtk_canvas_sendkey $name.c 1 %K %A 0 1 %t] + bind $name.k12frame.edit.b <KeyRelease> [list pdtk_canvas_sendkey $name.c 0 %K %A 0 1 %t] + + # ---------------------------------- DATA VS SOUND BUTTONS ---------------------------------- + match_linux_wm [list frame $name.k12frame.datasound -relief flat] + match_linux_wm [list button $name.k12frame.datasound.data -text "DATA" -image i.data_on -command [concat pdtk_k12_show_data_icons $name]] + match_linux_wm [list button $name.k12frame.datasound.sound -text "SOUND" -image i.sound -command [concat pdtk_k12_show_sound_icons $name]] + pack $name.k12frame.datasound.data $name.k12frame.datasound.sound -side left -pady 1 -padx 1 -expand 0 + setTooltip $name.k12frame.datasound.data "Show DATA objects" + setTooltip $name.k12frame.datasound.sound "Show SOUND objects" + pdtk_k12panel_standardkeybindings $name.k12frame.datasound.data + pdtk_k12panel_standardkeybindings $name.k12frame.datasound.sound + + # ---------------------------------- MESSAGES LABEL ----------------------------------------- + + #match_linux_wm [list frame $name.k12frame.msgs -relief flat] + #match_linux_wm [list label $name.k12frame.msgs.label -relief flat -text "MESSAGES"] + #pack $name.k12frame.msgs.label -fill x -pady 0 -padx 1 + + # ---------------------------------- WII ----------------------------------------- + match_linux_wm [list frame $name.k12frame.wii -relief flat] + match_linux_wm [list button $name.k12frame.wii.b_wii_connect -image i.wii_connect \ + -command [concat put_K12_objects $name wii_connect]] + match_linux_wm [list button $name.k12frame.wii.b_wii_buttons -image i.wii_buttons \ + -command [concat put_K12_objects $name wii_buttons]] + match_linux_wm [list button $name.k12frame.wii.b_wii_hit -image i.wii_hit \ + -command [concat put_K12_objects $name wii_hit]] + match_linux_wm [list button $name.k12frame.wii.b_wii_accelerometer -image i.wii_accelerometer \ + -command [concat put_K12_objects $name wii_accelerometer]] + match_linux_wm [list button $name.k12frame.wii.b_wii_speed_xry -image i.wii_speed_xry \ + -command [concat put_K12_objects $name wii_speed_xry]] + pack $name.k12frame.wii.b_wii_connect $name.k12frame.wii.b_wii_buttons $name.k12frame.wii.b_wii_hit $name.k12frame.wii.b_wii_accelerometer $name.k12frame.wii.b_wii_speed_xry -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.wii.b_wii_connect "Wiimote Connect: Use this to connect wiimote to the computer" + setTooltip $name.k12frame.wii.b_wii_buttons "Wiimote Buttons: Use this to select which Wiimote button should activate objects connected to this object" + setTooltip $name.k12frame.wii.b_wii_hit "Wiimote Hit: Use this to detect when the wiimote has been shaken like a mallet" + setTooltip $name.k12frame.wii.b_wii_accelerometer "Wiimote Accelerometer: Use this to monitor Wiimotes acceleration across X, Y, and Z axes" + setTooltip $name.k12frame.wii.b_wii_speed_xry "Wiimote Speed X, Roll, Y: Use this to detect how quickly is Wiimote moving across individual axes x, roll, and y (requires motion plus)" + pdtk_k12panel_standardkeybindings $name.k12frame.wii.b_wii_connect + pdtk_k12panel_standardkeybindings $name.k12frame.wii.b_wii_buttons + pdtk_k12panel_standardkeybindings $name.k12frame.wii.b_wii_hit + pdtk_k12panel_standardkeybindings $name.k12frame.wii.b_wii_accelerometer + pdtk_k12panel_standardkeybindings $name.k12frame.wii.b_wii_speed_xry + + # ---------------------------------- WII2 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.wii2 -relief flat] + match_linux_wm [list button $name.k12frame.wii2.b_wii_speed -image i.wii_speed \ + -command [concat put_K12_objects $name wii_speed]] + match_linux_wm [list button $name.k12frame.wii2.b_wii_nunchuk_buttons -image i.wii_nunchuk_buttons \ + -command [concat put_K12_objects $name wii_nunchuk_buttons]] + match_linux_wm [list button $name.k12frame.wii2.b_wii_nunchuk_hit -image i.wii_nunchuk_hit \ + -command [concat put_K12_objects $name wii_nunchuk_hit]] + match_linux_wm [list button $name.k12frame.wii2.b_wii_nunchuk_accelerometer -image i.wii_nunchuk_accelerometer \ + -command [concat put_K12_objects $name wii_nunchuk_accelerometer]] + match_linux_wm [list button $name.k12frame.wii2.b_wii_nunchuk_stick -image i.wii_nunchuk_stick \ + -command [concat put_K12_objects $name wii_nunchuk_stick]] + pack $name.k12frame.wii2.b_wii_speed $name.k12frame.wii2.b_wii_nunchuk_buttons $name.k12frame.wii2.b_wii_nunchuk_hit $name.k12frame.wii2.b_wii_nunchuk_accelerometer $name.k12frame.wii2.b_wii_nunchuk_stick -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.wii2.b_wii_speed "Wiimote Speed: Use this to detect how quickly is Wiimote moving (requires motion plus)" + setTooltip $name.k12frame.wii2.b_wii_nunchuk_buttons "Wiimote Nunchuk Buttons: Use this to select which Nunchuk button should activate objects connected to this object (requires nunchuk extension)" + setTooltip $name.k12frame.wii2.b_wii_nunchuk_hit "Wiimote Nunchuk Hit: Use this to detect when the wiimote has been shaken like a mallet (requires nunchuk extension)" + setTooltip $name.k12frame.wii2.b_wii_nunchuk_accelerometer "Wiimote Nunchuk Accelerometer: Use this to monitor Nunchuk acceleration across X, Y, and Z axes (requires nunchuk extension)" + setTooltip $name.k12frame.wii2.b_wii_nunchuk_stick "Wiimote Nunchuk stick: Use this to monitor Nunchuk stick motion across X and Y axes (requires nunchuk extension)" + pdtk_k12panel_standardkeybindings $name.k12frame.wii2.b_wii_speed + pdtk_k12panel_standardkeybindings $name.k12frame.wii2.b_wii_nunchuk_buttons + pdtk_k12panel_standardkeybindings $name.k12frame.wii2.b_wii_nunchuk_hit + pdtk_k12panel_standardkeybindings $name.k12frame.wii2.b_wii_nunchuk_accelerometer + pdtk_k12panel_standardkeybindings $name.k12frame.wii2.b_wii_nunchuk_stick + + # ---------------------------------- ARDUINO ----------------------------------------- + match_linux_wm [list frame $name.k12frame.arduino -relief flat] + match_linux_wm [list button $name.k12frame.arduino.b_sarcduino -image i.sarcduino \ + -command [concat put_K12_objects $name sarcduino_connect]] + match_linux_wm [list button $name.k12frame.arduino.b_sarcduino_digital -image i.sarcduino_digital \ + -command [concat put_K12_objects $name sarcduino_digital]] + match_linux_wm [list button $name.k12frame.arduino.b_sarcduino_analog -image i.sarcduino_analog \ + -command [concat put_K12_objects $name sarcduino_analog]] + match_linux_wm [list button $name.k12frame.arduino.b_sarcduino_hit -image i.sarcduino_hit \ + -command [concat put_K12_objects $name sarcduino_hit]] + match_linux_wm [list button $name.k12frame.arduino.b_sarcduino_piezo -image i.sarcduino_piezo \ + -command [concat put_K12_objects $name sarcduino_piezo]] + pack $name.k12frame.arduino.b_sarcduino $name.k12frame.arduino.b_sarcduino_digital $name.k12frame.arduino.b_sarcduino_analog $name.k12frame.arduino.b_sarcduino_hit $name.k12frame.arduino.b_sarcduino_piezo -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.arduino.b_sarcduino "Arduino Connect: Use this to arduino to the computer" + setTooltip $name.k12frame.arduino.b_sarcduino_digital "Arduino Digital: Use this to detect on/off states of a digital sensor" + setTooltip $name.k12frame.arduino.b_sarcduino_analog "Arduino Analog: Use this to monitor analog sensor speed" + setTooltip $name.k12frame.arduino.b_sarcduino_hit "Arduino Hit: Use this to detect when the arduino analog sensor data has rapidly changed" + setTooltip $name.k12frame.arduino.b_sarcduino_piezo "Arduino Piezo: Use this to analyze data coming from a piezo microphone sensor" + pdtk_k12panel_standardkeybindings $name.k12frame.arduino.b_sarcduino + pdtk_k12panel_standardkeybindings $name.k12frame.arduino.b_sarcduino_digital + pdtk_k12panel_standardkeybindings $name.k12frame.arduino.b_sarcduino_analog + pdtk_k12panel_standardkeybindings $name.k12frame.arduino.b_sarcduino_hit + pdtk_k12panel_standardkeybindings $name.k12frame.arduino.b_sarcduino_piezo + + # ---------------------------------- RPI & MATH ROW 1 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.math_1 -relief flat] + #match_linux_wm [list button $name.k12frame.math_1.b_sarcduino_net -image i.sarcduino_net \ + # -command [concat put_K12_objects $name sarcduino_net]] + match_linux_wm [list button $name.k12frame.math_1.b_rpi_digital -image i.raspberry_digital \ + -command [concat put_K12_objects $name raspberrypi_digital]] + match_linux_wm [list button $name.k12frame.math_1.b_rpi_analog_out -image i.raspberry_analog_out \ + -command [concat put_K12_objects $name raspberrypi_analog_out]] + match_linux_wm [list button $name.k12frame.math_1.b_rpi_analog_in -image i.raspberry_analog_in \ + -command [concat put_K12_objects $name raspberrypi_analog_in]] + match_linux_wm [list button $name.k12frame.math_1.b_math_number -image i.math_number \ + -command [concat put_K12_objects $name math_number]] + match_linux_wm [list button $name.k12frame.math_1.b_math_netsend -image i.math_netsend \ + -command [concat put_K12_objects $name math_netsend]] + pack $name.k12frame.math_1.b_rpi_digital $name.k12frame.math_1.b_rpi_analog_out $name.k12frame.math_1.b_rpi_analog_in $name.k12frame.math_1.b_math_number $name.k12frame.math_1.b_math_netsend -side left -expand 0 -padx 1 -pady 1 + #setTooltip $name.k12frame.math_1.b_sarcduino_net "Arduino Net: Use this to retrieve data from arduino devices connected via network" + setTooltip $name.k12frame.math_1.b_rpi_digital "RaspberryPi Digital: Use this to read from or write to GPIO pins in digital format" + setTooltip $name.k12frame.math_1.b_rpi_analog_out "RaspberryPi Analog Out: Use this to write to GPIO pins in analog format using PWM" + setTooltip $name.k12frame.math_1.b_rpi_analog_in "RaspberryPi Analog In: Use this to read from RaspberryPi LOP Shield's analog inputs" + setTooltip $name.k12frame.math_1.b_math_number "Number: Use this to assign a value to other objects" + setTooltip $name.k12frame.math_1.b_math_netsend "Netsend: Use this to send data over network to another computer" + pdtk_k12panel_standardkeybindings $name.k12frame.math_1.b_rpi_digital + pdtk_k12panel_standardkeybindings $name.k12frame.math_1.b_rpi_analog_out + pdtk_k12panel_standardkeybindings $name.k12frame.math_1.b_rpi_analog_in + pdtk_k12panel_standardkeybindings $name.k12frame.math_1.b_math_number + pdtk_k12panel_standardkeybindings $name.k12frame.math_1.b_math_netsend + + # ---------------------------------- MATH ROW 2 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.math_2 -relief flat] + match_linux_wm [list button $name.k12frame.math_2.b_math_netreceive -image i.math_netreceive \ + -command [concat put_K12_objects $name math_netreceive]] + match_linux_wm [list button $name.k12frame.math_2.b_math_tag -image i.math_tag \ + -command [concat put_K12_objects $name math_tag]] + match_linux_wm [list button $name.k12frame.math_2.b_math_routebytag -image i.math_routebytag \ + -command [concat put_K12_objects $name math_routebytag]] + match_linux_wm [list button $name.k12frame.math_2.b_math_add -image i.math_add \ + -command [concat put_K12_objects $name math_add]] + match_linux_wm [list button $name.k12frame.math_2.b_math_subtract -image i.math_subtract \ + -command [concat put_K12_objects $name math_subtract]] + pack $name.k12frame.math_2.b_math_netreceive $name.k12frame.math_2.b_math_tag $name.k12frame.math_2.b_math_routebytag $name.k12frame.math_2.b_math_add $name.k12frame.math_2.b_math_subtract -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.math_2.b_math_netreceive "Netreceive: Use this to receive data from another computer over network" + setTooltip $name.k12frame.math_2.b_math_tag "Tag: Use this to tag data to be sent over network" + setTooltip $name.k12frame.math_2.b_math_routebytag "Route By Tag: Use this to filter incoming network data by tag" + setTooltip $name.k12frame.math_2.b_math_add "Add: Use this to add two values" + setTooltip $name.k12frame.math_2.b_math_subtract "Subtract: Use this to subtract two values" + pdtk_k12panel_standardkeybindings $name.k12frame.math_2.b_math_netreceive + pdtk_k12panel_standardkeybindings $name.k12frame.math_2.b_math_tag + pdtk_k12panel_standardkeybindings $name.k12frame.math_2.b_math_routebytag + pdtk_k12panel_standardkeybindings $name.k12frame.math_2.b_math_add + pdtk_k12panel_standardkeybindings $name.k12frame.math_2.b_math_subtract + + # ---------------------------------- MATH ROW 3 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.math_3 -relief flat] + match_linux_wm [list button $name.k12frame.math_3.b_math_multiply -image i.math_multiply \ + -command [concat put_K12_objects $name math_multiply]] + match_linux_wm [list button $name.k12frame.math_3.b_math_divide -image i.math_divide \ + -command [concat put_K12_objects $name math_divide]] + match_linux_wm [list button $name.k12frame.math_3.b_math_random -image i.math_random \ + -command [concat put_K12_objects $name math_random]] + match_linux_wm [list button $name.k12frame.math_3.b_math_average -image i.math_average \ + -command [concat put_K12_objects $name math_average]] + match_linux_wm [list button $name.k12frame.math_3.b_math_scale -image i.math_scale \ + -command [concat put_K12_objects $name math_scale]] + pack $name.k12frame.math_3.b_math_multiply $name.k12frame.math_3.b_math_divide $name.k12frame.math_3.b_math_random $name.k12frame.math_3.b_math_average $name.k12frame.math_3.b_math_scale -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.math_3.b_math_multiply "Multiply: Use this to multiply two values" + setTooltip $name.k12frame.math_3.b_math_divide "Divide: Use this to divide two values" + setTooltip $name.k12frame.math_3.b_math_random "Random: Use this to generate random numbers" + setTooltip $name.k12frame.math_3.b_math_average "Average: Use this to calculate average from a stream of numbers" + setTooltip $name.k12frame.math_3.b_math_scale "Scale: Use this to scale incoming values to a new range and direction" + pdtk_k12panel_standardkeybindings $name.k12frame.math_3.b_math_multiply + pdtk_k12panel_standardkeybindings $name.k12frame.math_3.b_math_divide + pdtk_k12panel_standardkeybindings $name.k12frame.math_3.b_math_random + pdtk_k12panel_standardkeybindings $name.k12frame.math_3.b_math_average + pdtk_k12panel_standardkeybindings $name.k12frame.math_3.b_math_scale + + # ---------------------------------- LOGIC ----------------------------------------- + match_linux_wm [list frame $name.k12frame.logic -relief flat] + match_linux_wm [list button $name.k12frame.logic.b_logic_compare -image i.logic_compare \ + -command [concat put_K12_objects $name logic_compare]] + match_linux_wm [list button $name.k12frame.logic.b_logic_mapper -image i.logic_mapper \ + -command [concat put_K12_objects $name logic_mapper]] + match_linux_wm [list button $name.k12frame.logic.b_logic_metronome -image i.logic_metronome \ + -command [concat put_K12_objects $name logic_metronome]] + match_linux_wm [list button $name.k12frame.logic.b_logic_counter -image i.logic_counter \ + -command [concat put_K12_objects $name logic_counter]] + match_linux_wm [list button $name.k12frame.logic.b_logic_sequencer -image i.logic_sequencer \ + -command [concat put_K12_objects $name logic_sequencer]] + pack $name.k12frame.logic.b_logic_compare $name.k12frame.logic.b_logic_mapper $name.k12frame.logic.b_logic_metronome $name.k12frame.logic.b_logic_counter $name.k12frame.logic.b_logic_sequencer -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.logic.b_logic_compare "Compare: Use this to compare two values" + setTooltip $name.k12frame.logic.b_logic_mapper "Mapper: Use this to map one value to two different but related values" + setTooltip $name.k12frame.logic.b_logic_metronome "Metronome: Use this to create a steady pulse" + setTooltip $name.k12frame.logic.b_logic_counter "Counter: Use this to count events" + setTooltip $name.k12frame.logic.b_logic_sequencer "Sequencer: Use this to map values to MIDI pitches" + pdtk_k12panel_standardkeybindings $name.k12frame.logic.b_logic_compare + pdtk_k12panel_standardkeybindings $name.k12frame.logic.b_logic_mapper + pdtk_k12panel_standardkeybindings $name.k12frame.logic.b_logic_metronome + pdtk_k12panel_standardkeybindings $name.k12frame.logic.b_logic_counter + pdtk_k12panel_standardkeybindings $name.k12frame.logic.b_logic_sequencer + + # ---------------------------------- OTHER ----------------------------------------- + match_linux_wm [list frame $name.k12frame.other -relief flat] + match_linux_wm [list button $name.k12frame.other.b_preset -image i.preset \ + -command [concat put_K12_objects $name preset]] + match_linux_wm [list button $name.k12frame.other.b_comment -image i.comment \ + -command [concat menu_comment $name 1]] + pack $name.k12frame.other.b_preset $name.k12frame.other.b_comment -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.other.b_preset "Preset: Use this to store and recall up to four different states of your instrument" + setTooltip $name.k12frame.other.b_comment "Comment: Use this to post comments inside your patch" + pdtk_k12panel_standardkeybindings $name.k12frame.other.b_preset + pdtk_k12panel_standardkeybindings $name.k12frame.other.b_comment + + # ---------------------------------- SOUND LABEL ----------------------------------------- + #match_linux_wm [list frame $name.k12frame.sound -relief flat] + #match_linux_wm [list label $name.k12frame.sound.label -relief flat -text "SOUND"] + #pack $name.k12frame.sound.label -fill x -pady 0 -padx 1 + + # ---------------------------------- SIGNAL ROW 1 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.signal_1 -relief flat] + match_linux_wm [list button $name.k12frame.signal_1.b_signal_microphone -image i.signal_microphone \ + -command [concat put_K12_objects $name signal_microphone]] + + match_linux_wm [list button $name.k12frame.signal_1.b_signal_netsend -image i.signal_netsend \ + -command [concat put_K12_objects $name signal_netsend]] + match_linux_wm [list button $name.k12frame.signal_1.b_signal_netreceive -image i.signal_netreceive \ + -command [concat put_K12_objects $name signal_netreceive]] + + match_linux_wm [list button $name.k12frame.signal_1.b_signal_sampler -image i.signal_sampler \ + -command [concat put_K12_objects $name signal_sampler]] + match_linux_wm [list button $name.k12frame.signal_1.b_signal_player -image i.signal_player \ + -command [concat put_K12_objects $name signal_player]] + pack $name.k12frame.signal_1.b_signal_microphone $name.k12frame.signal_1.b_signal_netsend $name.k12frame.signal_1.b_signal_netreceive $name.k12frame.signal_1.b_signal_sampler $name.k12frame.signal_1.b_signal_player -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.signal_1.b_signal_microphone "Microphone: Use this to capture and monitor microphone input" + setTooltip $name.k12frame.signal_1.b_signal_netsend "Netsend Sound: Use this to send your sound over network to another computer" + setTooltip $name.k12frame.signal_1.b_signal_netreceive "Netreceive Sound: Use this to receive sound from another computer over network" + setTooltip $name.k12frame.signal_1.b_signal_sampler "Sampler: Use this to record audio from microphone and play it back in various ways" + setTooltip $name.k12frame.signal_1.b_signal_player "Player: Use this to play WAV files in various ways" + pdtk_k12panel_standardkeybindings $name.k12frame.signal_1.b_signal_microphone + pdtk_k12panel_standardkeybindings $name.k12frame.signal_1.b_signal_netsend + pdtk_k12panel_standardkeybindings $name.k12frame.signal_1.b_signal_netreceive + pdtk_k12panel_standardkeybindings $name.k12frame.signal_1.b_signal_sampler + pdtk_k12panel_standardkeybindings $name.k12frame.signal_1.b_signal_player + + # ---------------------------------- SIGNAL ROW 2 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.signal_2 -relief flat] + match_linux_wm [list button $name.k12frame.signal_2.b_signal_sine -image i.signal_sine \ + -command [concat put_K12_objects $name signal_sine]] + match_linux_wm [list button $name.k12frame.signal_2.b_signal_saw -image i.signal_saw \ + -command [concat put_K12_objects $name signal_saw]] + match_linux_wm [list button $name.k12frame.signal_2.b_signal_square -image i.signal_square \ + -command [concat put_K12_objects $name signal_square]] + match_linux_wm [list button $name.k12frame.signal_2.b_signal_triangle -image i.signal_triangle \ + -command [concat put_K12_objects $name signal_triangle]] + match_linux_wm [list button $name.k12frame.signal_2.b_signal_envelope -image i.signal_envelope \ + -command [concat put_K12_objects $name signal_envelope]] + pack $name.k12frame.signal_2.b_signal_sine $name.k12frame.signal_2.b_signal_saw $name.k12frame.signal_2.b_signal_square $name.k12frame.signal_2.b_signal_triangle $name.k12frame.signal_2.b_signal_envelope -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.signal_2.b_signal_sine "Sine: Use this to generate sine tone" + setTooltip $name.k12frame.signal_2.b_signal_saw "Sawtooth: Use this to generate sawtooth tone" + setTooltip $name.k12frame.signal_2.b_signal_square "Square: Use this to generate square tone" + setTooltip $name.k12frame.signal_2.b_signal_triangle "Triangle: Use this to generate triangle tone" + setTooltip $name.k12frame.signal_2.b_signal_envelope "Envelope: Use this to shape sound loudness" + pdtk_k12panel_standardkeybindings $name.k12frame.signal_2.b_signal_sine + pdtk_k12panel_standardkeybindings $name.k12frame.signal_2.b_signal_saw + pdtk_k12panel_standardkeybindings $name.k12frame.signal_2.b_signal_square + pdtk_k12panel_standardkeybindings $name.k12frame.signal_2.b_signal_triangle + pdtk_k12panel_standardkeybindings $name.k12frame.signal_2.b_signal_envelope + + # ---------------------------------- SIGNAL ROW 3 ----------------------------------------- + match_linux_wm [list frame $name.k12frame.signal_3 -relief flat] + match_linux_wm [list button $name.k12frame.signal_3.b_signal_noise -image i.signal_noise \ + -command [concat put_K12_objects $name signal_noise]] + match_linux_wm [list button $name.k12frame.signal_3.b_signal_pink -image i.signal_pink \ + -command [concat put_K12_objects $name signal_pink]] + match_linux_wm [list button $name.k12frame.signal_3.b_signal_add -image i.signal_add \ + -command [concat put_K12_objects $name signal_add]] + match_linux_wm [list button $name.k12frame.signal_3.b_signal_multiply -image i.signal_multiply \ + -command [concat put_K12_objects $name signal_multiply]] + pack $name.k12frame.signal_3.b_signal_noise $name.k12frame.signal_3.b_signal_pink $name.k12frame.signal_3.b_signal_add $name.k12frame.signal_3.b_signal_multiply -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.signal_3.b_signal_noise "Noise: Use this to generate white (harsh) noise" + setTooltip $name.k12frame.signal_3.b_signal_pink "Pink: Use this to generate pink (softer) noise" + setTooltip $name.k12frame.signal_3.b_signal_add "Signal Add: Use this to add two sounds (signals)" + setTooltip $name.k12frame.signal_3.b_signal_multiply "Signal Multiply: Use this to multiply two sounds (signals)" + pdtk_k12panel_standardkeybindings $name.k12frame.signal_3.b_signal_noise + pdtk_k12panel_standardkeybindings $name.k12frame.signal_3.b_signal_pink + pdtk_k12panel_standardkeybindings $name.k12frame.signal_3.b_signal_add + pdtk_k12panel_standardkeybindings $name.k12frame.signal_3.b_signal_multiply + + # ---------------------------------- INSTRUMENTS ----------------------------------------- + match_linux_wm [list frame $name.k12frame.instr -relief flat] + match_linux_wm [list button $name.k12frame.instr.b_instr_short1 -image i.instr_short1 \ + -command [concat put_K12_objects $name instr_short1]] + match_linux_wm [list button $name.k12frame.instr.b_instr_short2 -image i.instr_short2 \ + -command [concat put_K12_objects $name instr_short2]] + match_linux_wm [list button $name.k12frame.instr.b_instr_sustained1 -image i.instr_sustained1 \ + -command [concat put_K12_objects $name instr_sustained1]] + match_linux_wm [list button $name.k12frame.instr.b_instr_sustained2 -image i.instr_sustained2 \ + -command [concat put_K12_objects $name instr_sustained2]] + pack $name.k12frame.instr.b_instr_short1 $name.k12frame.instr.b_instr_short2 $name.k12frame.instr.b_instr_sustained1 $name.k12frame.instr.b_instr_sustained2 -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.instr.b_instr_short1 "Bass Drum: Use this to produce short sounds like a single bass drum hit" + setTooltip $name.k12frame.instr.b_instr_short2 "Snare Drum: Use this to produce short sounds like a single snare drum hit" + setTooltip $name.k12frame.instr.b_instr_sustained1 "Air Instrument: Use this to produce long sustained sound like a sound of a woodwind instrument" + setTooltip $name.k12frame.instr.b_instr_sustained2 "Brass Instrument: Use this to produce long sustained sound like a sound of brass instrument" + pdtk_k12panel_standardkeybindings $name.k12frame.instr.b_instr_short1 + pdtk_k12panel_standardkeybindings $name.k12frame.instr.b_instr_short2 + pdtk_k12panel_standardkeybindings $name.k12frame.instr.b_instr_sustained1 + pdtk_k12panel_standardkeybindings $name.k12frame.instr.b_instr_sustained2 + + # ---------------------------------- F/X ----------------------------------------- + match_linux_wm [list frame $name.k12frame.fx -relief flat] + match_linux_wm [list button $name.k12frame.fx.b_fx_filter -image i.fx_filter \ + -command [concat put_K12_objects $name fx_filter]] + match_linux_wm [list button $name.k12frame.fx.b_fx_multitap -image i.fx_multitap \ + -command [concat put_K12_objects $name fx_multitap]] + match_linux_wm [list button $name.k12frame.fx.b_fx_reverb -image i.fx_reverb \ + -command [concat put_K12_objects $name fx_reverb]] + pack $name.k12frame.fx.b_fx_filter $name.k12frame.fx.b_fx_multitap $name.k12frame.fx.b_fx_reverb -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.fx.b_fx_filter "Filter: Use this to make sound appear muffled or brighter" + setTooltip $name.k12frame.fx.b_fx_multitap "Echo: Use this to make sound echo" + setTooltip $name.k12frame.fx.b_fx_reverb "Reverb: Use this to make sound appear as if it is being played in a large space" + pdtk_k12panel_standardkeybindings $name.k12frame.fx.b_fx_filter + pdtk_k12panel_standardkeybindings $name.k12frame.fx.b_fx_multitap + pdtk_k12panel_standardkeybindings $name.k12frame.fx.b_fx_reverb + + # ---------------------------------- OUTPUT/OTHER ----------------------------------------- + + match_linux_wm [list frame $name.k12frame.output -relief flat] + match_linux_wm [list button $name.k12frame.output.b_output -image i.output \ + -command [concat put_K12_objects $name output]] + pack $name.k12frame.output.b_output -side left -expand 0 -padx 1 -pady 1 + setTooltip $name.k12frame.output.b_output "Output: Use this to send audio from computer into speakers" + pdtk_k12panel_standardkeybindings $name.k12frame.output.b_output + + # ---------------------------------------- NOW PACK THEM ALL ----------------------------------------- + pack $name.k12frame.edit $name.k12frame.datasound $name.k12frame.wii $name.k12frame.wii2 $name.k12frame.arduino $name.k12frame.math_1 $name.k12frame.math_2 $name.k12frame.math_3 $name.k12frame.logic $name.k12frame.other -side top -expand 0 -fill x + } + + if { $k12_mode == 0 } { + wm minsize $name 50 20 + } else { + wm minsize $name 580 407 + } +*/ + + + +// net stuff +var net = require('net'); + +var HOST = '127.0.0.1'; +var PORT; +var client; + +exports.set_port = function (port_no) { + PORT = port_no; +} + + +function connect () { + client = new net.Socket(); + client.setNoDelay(true); + client.connect(PORT, HOST, function() { + console.log('CONNECTED TO: ' + HOST + ':' + PORT); + // Write a test message to the socket as soon as the client is connected, + //the server will receive it as message from the client. This can be removed + // once it's obvious it works... + client.write('I am Chuck Norris!;'); + }); +} + +exports.connect = connect; + +// Add a 'data' event handler for the client socket +// data parameter is what the server sent to this socket + +// Pd can send us different types of data: +// 1) The old style tcl commands with "\n" at end (or "\\\n" for continuation) +// 2) new style commands: "nw selector { param1: 'value', param2: 42, etc. };\n" +// 3) raw javascript (not implemented yet) +// Below we separate the wheat from chaff, eval'ing the new commands and just +// printing the old ones in blue to the console + +// This wheat/chaff setup has the side-effect of stripping all newline +// characters from pd->gui messages. Because of this a newline is added in +// gui_post. Once all the old tcl messages are removed we can parse solely +// on ";", and the side effect can be removed. + +// can be removed. + +var nextCmd = ""; // Build up a command across lines (or buffers) + +function init_socket_events () { + client.on('data', function(data) { + // console.log('DATA: ' + data); + var dataStr = data.toString('utf-8'); +// console.log("The whole buffer is " + dataStr); + var arr = dataStr.split("\n"); + var arrLen = arr.length; + var cmdHeader = 0; + for (var i = 0; i < arrLen; i++) { + var prefix = arr[i].substring(0, 2); + if (prefix == 'nw' || prefix == 'nn') { + nextCmd = arr[i].substring(3); +// console.log("nextCmd is " + nextCmd); + cmdHeader = 1; + } else if (cmdHeader) { + nextCmd += arr[i]; + // console.log("2nd part of cmd is " + arr[i]); + } else { +// gui_post(arr[i], "blue"); + } + // check if we end with a semicolon followed by a newline + if (nextCmd.slice(-1) === ";" && nextCmd.slice(-2) !== '\\') { +// console.log("raw cmd is: " + nextCmd); + nextCmd = nextCmd.replace(/\n/g, "\\n"); +// nextCmd = nextCmd.replace(/'/g, "\\\'"); + var selector = nextCmd.slice(0, nextCmd.indexOf(" ")); + var args = nextCmd.slice(selector.length + 1, -1); +// console.log(selector + '(' + args + ');'); + eval(selector + '(' + args + ');'); + nextCmd = ""; + cmdHeader = 0; + } + + } + // Close the client socket completely + // client.destroy(); + // console.log('Connection closed'); + + }); + + // Add a 'close' event handler for the client socket + client.on('close', function() { + //console.log('Connection closed'); + //client.destroy(); + nw_app_quit(); // set a timeout here if you need to debug + }); +} + +exports.init_socket_events = init_socket_events; + +// Send commands to Pd +function pdsend(string) { + client.write(string + ';'); + // for now, let's reprint the outgoing string to the pdwindow +// gui_post(string + ';', "red"); +} + +exports.pdsend = pdsend; + +// Send a ping message back to Pd +function gui_ping() { + pdsend("pd ping"); +} + +// Send a message to Pd to ping the "watchdog", which is a program +// that supervises Pd when run with -rt flag on some OSes +function gui_ping_watchdog() { + pdsend("pd watchdog"); +} + +// Schedule watchdog pings for the life of the GUI +function gui_watchdog() { + setInterval(gui_ping_watchdog, 2000); +} + +// Text drawing stuff + +// Here's the main API, structured to make an easier (inital) transition +// from tcl/tk to javascript + +// Gobj container, so that all drawn items are contained in a <g> which +// handles displacing (and in the future, possibly clicks and other events) +function get_gobj(cid, object) { + return patchwin[cid].window.document.getElementById(object + 'gobj'); +} + +// Convenience function to get a drawn item of gobj +function get_item(cid,item_id) { + return patchwin[cid].window.document.getElementById(item_id); +} + +// Similar to [canvas create] in tk +function create_item(cid,type,args) { + var item = patchwin[cid].window.document.createElementNS('http://www.w3.org/2000/svg', type); + if (args !== null) { + configure_item(item, args); + } + return item; +} + +// Similar to [canvas itemconfigure], without the need for a reference to the canvas +function configure_item(item, attributes) { + // draw_vis from g_template sends attributes as a ['attr1',val1, 'attr2', val2, etc.] array, + // so we check for that here + if (Array.isArray(attributes)) { + // we should check to make sure length is even here... + for (var i = 0; i < attributes.length; i+=2) { + item.setAttributeNS(null, attributes[i], attributes[i+1]); + } + } else { + for (var attr in attributes) { + if (attributes.hasOwnProperty(attr)) { + item.setAttributeNS(null, attr, attributes[attr]); + } + } + } +} + +// Most of these map either to pd.tk procs, or in some cases Tk canvas subcommands +function gui_text_create_gobj(cid, tag, xpos, ypos) { + var svg = get_item(cid, "patchsvg"); // "patchsvg" is id for the svg in the DOM + // Put objects on half-pixels to make them crisp (look in to the difference between + // this and the object-rendering 'crispEdges' attribute) + xpos += 0.5; + ypos += 0.5; + var transform_string = 'translate(' + xpos + ',' + ypos + ')'; + var g = create_item(cid, 'g', { + id: tag + 'gobj', + transform: transform_string + }); + svg.appendChild(g); + return g; +} + +function gui_text_drawborder(cid, tag, isbroken, x1, y1, x2, y2) { + var g = get_gobj(cid, tag); + // isbroken means either + // a) the object couldn't create or + // b) the box is empty + var rect = create_item(cid, 'rect', { + width: x2 - x1, + height: y2 - y1, + stroke: 'black', + fill: 'none', + 'shape-rendering': 'optimizeSpeed', + id: tag + 'border', + class: (isbroken ? 'broken_border' : '') + }); + g.appendChild(rect); +} + +function gui_canvas_drawio(cid, parenttag, tag, x1, y1, x2, y2, basex, basey) { + var g = get_gobj(cid, parenttag); + // probably need to add an id for xlets below + var rect = create_item(cid, 'rect', { + width: x2 - x1, + height: y2 - y1, + x: x1 - basex, + y: y1 - basey, + class: 'xlet' + }); + g.appendChild(rect); +} + +function gui_message_drawborder(cid,tag,width,height) { + var g = get_gobj(cid, tag); + var p_array = [0,0, + width+4, 0, + width, 4, + width, height-4, + width+4, height, + 0, height, + 0, 0]; + var polygon = create_item(cid, 'polygon', { + points: p_array.join(), + fill: 'none', + stroke: 'black', + 'stroke-width': 1, + id: tag + 'border' + }); + g.appendChild(polygon); +} + +function gui_message_flash(cid, tag, state) { + var b = get_item(cid, tag + 'border'); + var w; + if (state != 0) { w = 4; } else { w = 1; } + configure_item(b, { 'stroke-width': w }); +} + +function gui_message_redraw_border(cid,tag,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14) { + var b = get_item(cid, tag + 'border'); + var p_array = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14]; + configure_item(b, { + points: p_array.join(" "), + }); +} + + +function gui_atom_drawborder(cid,tag,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12) { + var p_array = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12]; + var g = get_gobj(cid, tag); + var polygon = create_item(cid, 'polygon', { + points: p_array.join(" "), + fill: 'none', + stroke: 'gray', + 'stroke-width': 1, + id: tag + 'border' + }); + g.appendChild(polygon); +} + +// draw a patch cord +function gui_canvas_line(cid,tag,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10) { + var d_array = ['M', p1 + 0.5, p2 + 0.5, + 'Q', p3 + 0.5, p4 + 0.5, p5 + 0.5, p6 + 0.5, + 'Q', p7 + 0.5, p8 + 0.5 ,p9 + 0.5, p10 + 0.5]; + var svg = get_item(cid, "patchsvg"); + var path = create_item(cid, 'path', { + d: d_array.join(" "), + fill: 'none', + stroke: 'gray', + 'stroke-width': 1, + 'shape-rendering': 'optimizeSpeed', + id: tag + }); + svg.appendChild(path); +} + +function gui_canvas_select_line(cid, tag) { + var line = get_item(cid, tag); + if (line !== null) { + configure_item(line, { class: 'selected_line' }); + } else { + gui_post("gui_canvas_select_line: can't find line"); + } +} + +function gui_canvas_deselect_line(cid, tag) { + var line = get_item(cid, tag); + if (line !== null) { + configure_item(line, { class: '' }); + } else { + gui_post("gui_canvas_select_line: can't find line"); + } +} + +// rename to erase_line (or at least standardize with gobj_erase) +function gui_canvas_delete_line(cid, tag) { + var line = get_item(cid, tag); + if (line !== null) { + line.parentNode.removeChild(line); + } else { + gui_post("canvas_delete_line: something is fucked up because the line doesn't exist"); + } +} + +function gui_canvas_updateline(cid,tag,x1,y1,x2,y2,yoff) { +// console.log("cord tag in gui_canvas_updateline is " + tag); + var halfx = parseInt((x2 - x1)/2); + var halfy = parseInt((y2 - y1)/2); + var d_array = ['M',x1,y1, + 'Q',x1,y1+yoff,x1+halfx,y1+halfy, + 'Q',x2,y2-yoff,x2,y2]; +// gui_post(d_array.toString()); + var cord = get_item(cid, tag); + configure_item(cord, { d: d_array.join(" ") }); +} + +function gui_text_new(canvasname, myname, type, isselected, x, y, text, font) { +// gui_post("font is " + font); + + var g = get_gobj(canvasname, myname); + var svg_text = create_item(canvasname, 'text', { + // x and y are fudge factors. Text on the tk canvas used an anchor + // at the top-right corner of the text's bbox. SVG uses the baseline. + // There's probably a programmatic way to do this, but for now-- fudge factors + // based on the DejaVu Sans Mono font. :) + x: 1, + y: 13, + 'shape-rendering': 'optimizeSpeed', + 'font-size': font + 'px', + id: myname + 'text' + }); + + // find a way to abstract away the canvas array and the DOM here + var text_node = patchwin[canvasname].window.document.createTextNode(text); + svg_text.appendChild(text_node); + if (g !== null) { + g.appendChild(svg_text); + } else { + gui_post("gui_text_new: can't find parent group"); + } + + if (isselected) { + gui_text_select(canvasname, myname); + } +} + +function gui_gobj_erase(cid, tag) { + var g = get_gobj(cid, tag); + if (g !== null) { + g.parentNode.removeChild(g); + } else { + gui_post("gui_gobj_erase: gobj " + tag + " didn't exist in the first place!"); + } +} + +function gui_text_set (cid, tag, text) { + var svg_text = get_item(cid, tag + 'text'); + if (svg_text !== null) { + svg_text.textContent = text; + } else { + gui_post("gui_text_set: svg_text doesn't exist!"); + } +} + +// Not sure whether this is even used anymore +function gui_text_redraw_border(cid, tag, x1, y1, x2, y2) { + var b = get_item(cid, tag + 'border'); + configure_item(b, { + width: x2 - x1, + height: y2 - y1 + }); +} + +function gui_text_select(cid, tag) { + var g = get_gobj(cid, tag); + var b = get_item(cid, tag + 'border'); + if (g !== null) { + configure_item(g, { class: 'selected' }); + } else { + console.log("text_select: something wrong with group tag: " + tag); + } + if (b !== null) { + configure_item(b, { class: 'selected_border' }); + } +} + +function gui_text_deselect(cid, tag) { + gui_post("deselecting text with tag..." + tag); + var gobj = get_gobj(cid, tag) + var border = get_item(cid, tag + 'border'); + if (gobj !== null) { + configure_item(gobj, { class: "" }); + } else { + console.log("text_deselect: something wrong with tag: " + tag + 'gobj'); + } + if (border !== null) { + configure_item(border, { class: "" }); + } else { + console.log("text_select: something wrong with tag: " + tag + 'border'); + } +} + +function gui_text_select_color(cid, tag) { +// nb: this is handled in css now +return; + var rect = get_item(cid, tag + 'border'); + if (rect !== null) { + configure_item(rect, { + stroke: 'blue', + 'stroke-width': 1, + 'stroke-dasharray': 'none' + }); + } else { + gui_post("select_color: something wrong with tag: " + tag + 'border'); + } +} + +function gui_canvas_displace_withtag(name, dx, dy) { + var pwin = patchwin[name]; + var ol = pwin.window.document.getElementsByClassName('selected'); + for (var i = 0; i < ol.length; i++) { + var new_tx = dx + ol[i].transform.baseVal.getItem(0).matrix.e; + var new_ty = dy + ol[i].transform.baseVal.getItem(0).matrix.f; + ol[i].setAttributeNS(null, 'transform', + 'translate(' + new_tx + ',' + new_ty + ')'); + } +} + +function gui_create_selection_rectangle(cid, x1, y1, x2, y2) { + var svg = get_item(cid, "patchsvg"); + var points_array = [x1 + 0.5, y1 + 0.5, + x2 + 0.5, y1 + 0.5, + x2 + 0.5, y2 + 0.5, + x1 + 0.5, y2 + 0.5 + ]; + var rect = create_item(cid, 'polygon', { + points: points_array.join(" "), + fill: 'none', + stroke: 'black', + 'shape-rendering': 'optimizeSpeed', + 'stroke-width': 1, + id: 'selection_rectangle', + display: 'inline' + }); + svg.appendChild(rect); +} + +function gui_move_selection_rectangle(cid, x1, y1, x2, y2) { + var points_array = [x1 + 0.5, y1 + 0.5, x2 + 0.5, y1 + 0.5, + x2 + 0.5, y2 + 0.5, x1 + 0.5, y2 + 0.5]; + var rect = get_item(cid, 'selection_rectangle'); + configure_item(rect, { points: points_array }); +} + +function gui_hide_selection_rectangle(cid) { +// gui_post("hiding selection"); + var rect = get_item(cid, 'selection_rectangle'); + rect.parentElement.removeChild(rect); +} + +// iemguis + +function gui_create_bng(cid, tag, cx, cy, radius) { + var g = get_gobj(cid, tag); + var circle = create_item(cid, 'circle', { + cx: cx, + cy: cy, + r: radius, + fill: 'none', + stroke: 'black', + 'stroke-width': 1, + id: tag + 'button' + }); + g.appendChild(circle); +} + +function gui_bng_update(cid, tag, flashed) { + var button = get_item(cid, tag + 'button'); + var fill = flashed ? 'red' : 'none'; + configure_item(button, { fill: fill }); +} + +function gui_create_toggle(cid, tag, color, width, p1,p2,p3,p4,p5,p6,p7,p8,basex,basey) { + var g = get_gobj(cid, tag); + var points_array = [p1 - basex, p2 - basey, + p3 - basex, p4 - basey + ]; + var cross1 = create_item(cid, 'polyline', { + points: points_array.join(" "), + stroke: color, + fill: 'none', + id: tag + 'cross1', + display: 'none', + 'stroke-width': width + }); + + points_array = [p5 - basex, p6 - basey, + p7 - basex, p8 - basey + ]; + var cross2 = create_item(cid, 'polyline', { + points: points_array.join(" "), + stroke: color, + fill: 'none', + id: tag + 'cross2', + display: 'none', + 'stroke-width': width + }); + g.appendChild(cross1); + g.appendChild(cross2); +} + +function gui_toggle_update(cid, tag, state) { + var cross1 = get_item(cid, tag + 'cross1'); + var cross2 = get_item(cid, tag + 'cross2'); + if (state) { + configure_item(cross1, { display: 'inline' }); + configure_item(cross2, { display: 'inline' }); + } else { + configure_item(cross1, { display: 'none' }); + configure_item(cross2, { display: 'none' }); + } +} + +// Todo: send fewer parameters from c +function gui_create_numbox(cid,tag,bgcolor,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,basex,basey,half) { + // numbox doesn't have a standard iemgui border, so we must create its gobj manually + var g = gui_text_create_gobj(cid, tag, basex, basey) + var data_array = ['M', p1 - basex, p2 - basey, + 'L', p3 - basex, p4 - basey, + p5 - basex, p6 - basey, + p7 - basex, p8 - basey, + p9 - basex, p10 - basey, + 'z', + 'L', basex - basex, basey - basey, + half, half, + p9 - basex, p10 - basey]; + var border = create_item(cid, 'path', { + d: data_array.join(" "), + fill: bgcolor, + stroke: 'black', + 'stroke-width': 1, + id: (tag + 'border') + }); + g.appendChild(border); +} + +function gui_numbox_drawtext(cid,tag,text,color,xpos,ypos,basex,basey) { + var g = get_gobj(cid, tag); + var svg_text = create_item(cid, 'text', { + x: xpos - basex, + y: ypos - basey + 5, + 'font-size': font, + id: tag + 'text' + }); + + var text_node = patchwin[cid].window.document.createTextNode(text); + svg_text.appendChild(text_node); + g.appendChild(svg_text); +} + +function gui_create_slider(cid,tag,color,p1,p2,p3,p4,basex, basey) { + var g = get_gobj(cid, tag); + var indicator = create_item(cid, 'line', { + x1: p1 - basex, + y1: p2 - basey, + x2: p3 - basex, + y2: p4 - basey, + stroke: color, + 'stroke-width': 3, + fill: 'none', + id: tag + 'indicator' + }); + g.appendChild(indicator); + +} + +function gui_slider_update(cid,tag,p1,p2,p3,p4,basex,basey) { + var indicator = get_item(cid, tag + 'indicator'); + configure_item(indicator, { + x1: p1 - basex, + y1: p2 - basey, + x2: p3 - basex, + y2: p4 - basey + }); +} + +function gui_create_radio(cid,tag,p1,p2,p3,p4,i,basex,basey) { + var g = get_gobj(cid, tag); + var cell = create_item(cid, 'line', { + x1: p1 - basex, + y1: p2 - basey, + x2: p3 - basex, + y2: p4 - basey, + // stroke is just black for now + stroke: 'black', + 'stroke-width': 1, + fill: 'none', + id: tag + 'cell_' + i + }); + g.appendChild(cell); +} + +function gui_create_radio_buttons(cid,tag,color,p1,p2,p3,p4,basex,basey,i,state) { + var g = get_gobj(cid, tag); + var b = create_item(cid, 'rect', { + x: p1 - basex, + y: p2 -basey, + width: p3 - p1, + height: p4 - p2, + stroke: color, + fill: color, + id: tag + 'button_' + i, + display: state ? 'inline' : 'none' + }); + g.appendChild(b); +} + +function gui_radio_update(cid,tag,prev,next) { + var prev = get_item(cid, tag + 'button_' + prev); + var next = get_item(cid, tag + 'button_' + next); + configure_item(prev, { display: 'none' }); + configure_item(next, { display: 'inline' }); +} + +function gui_create_vumeter_text(cid,tag,color,xpos,ypos,text,index,basex,basey) { + var g = get_gobj(cid, tag); + var svg_text = create_item(cid, 'text', { + x: xpos - basex, + y: ypos - basey, + // font-size: font); + id: tag + 'text_' + index + }); + + var text_node = patchwin[cid].window.document.createTextNode(text); + svg_text.appendChild(text_node); + g.appendChild(svg_text); +} + +function gui_create_vumeter_steps(cid,tag,color,p1,p2,p3,p4,width,index,basex,basey) { + var g = get_gobj(cid, tag); + var l = create_item(cid, 'line', { + x1: p1 - basex, + y1: p2 - basey, + x2: p3 - basex, + y2: p4 - basey, + stroke: color, + 'stroke-width': width, + 'id': tag + 'led_' + i + }); + g.appendChild(l); +} + +function gui_create_vumeter_rect(cid,tag,color,p1,p2,p3,p4,basex,basey) { + var g = get_gobj(cid, tag); + var rect = create_item(cid, 'rect', { + x: p1 - basex, + y: p2 - basey, + width: p3 - p1, + height: p4 + 1 - p2, + stroke: color, + fill: color, + id: tag + 'rect' + }); + g.appendChild(rect); +} + +function gui_create_vumeter_peak(cid,tag,color,p1,p2,p3,p4,width,basex,basey) { + var g = get_gobj(cid, tag); + var line = create_item(cid, 'line', { + x1: p1 - basex, + y1: p2 - basey, + x2: p3 - basex, + y2: p4 - basey, + stroke: color, + 'stroke-width': width, + id: tag + 'peak' + }); + g.appendChild(line); +} + +// change tag from "rect" to "rms" +function gui_vumeter_update_rms(cid,tag,p1,p2,p3,p4,basex,basey) { + rect = get_item(cid, tag + 'rect'); + configure_item(rect, { + x: p1 - basex, + y: p2 - basey, + width: p3 - p1, + height: p4 - p2 + 1 + }); +} + +function gui_vumeter_update_peak(cid,tag,color,p1,p2,p3,p4,basex,basey) { + line = get_item(cid, tag + 'peak'); + configure_item(line, { + x1: p1 - basex, + y1: p2 - basey, + x2: p3 - basex, + y2: p4 - basey, + stroke: color + }); +} + +// Think about merging with gui_text_drawborder +function gui_iemgui_drawborder(cid, tag, bgcolor, x1, y1, x2, y2) { + var g = get_gobj(cid, tag); + var rect = create_item(cid, 'rect', { + width: x2 - x1, + height: y2 - y1, + fill: bgcolor, + stroke: 'black', + 'shape-rendering': 'optimizeSpeed', + 'stroke-width': 1, + id: tag + 'border' + }); + g.appendChild(rect); +} + + +function gui_create_mycanvas(cid,tag,color,x1,y1,x2_vis,y2_vis,x2,y2) { + var rect_vis = create_item(cid,'rect', { + width: x2_vis - x1, + height: y2_vis - y1, + fill: color, + stroke: color + } + ); + + // we use a drag_handle-- unlike a 'border' it takes + // the same color as the visible rectangle when deselected + var rect = create_item(cid,'rect', { + width: x2 - x1, + height: y2 - y1, + fill: color, + stroke: color, + id: tag + 'drag_handle' + } + ); + var g = get_gobj(cid,tag); + g.appendChild(rect_vis); + g.appendChild(rect); +} + +function gui_mycanvas_select_color(cid,tag,color) { + item = get_item(cid,tag + 'drag_handle'); + configure_item(item, {stroke: color}); +} + +// This should be merged with gui_create_gobj somehow +function gui_create_scalar(cid, tag, isselected, t1, t2, t3, t4, t5, t6) { + var svg = get_item(cid, "patchsvg"); // "patchsvg" is id for the svg in the DOM + // Normally put objects on half-pixels to make them crisp, but if we create a + // scalar in an object box we already did that. This unfortunately creates a 0.5 + // pix discrepancy between scalars created in object boxes and ones created with + // [append]. Think about just using shape-rendering value of 'crispEdges' in the + // places where it matters... + t5 += 0.5; + t6 += 0.5; + var matrix = [t1,t2,t3,t4,t5,t6]; + var transform_string = 'matrix(' + matrix.join() + ')'; + var g = create_item(cid, 'g', { + id: tag + 'gobj', + transform: transform_string, + class: (isselected ? 'selected' : '') + }); + // Let's make a selection rect... but we can't make it + // a child of the gobj group because the getrect fn gives + // us a bbox in the canvas coord system + var selection_rect = create_item(cid, 'rect', { + id: tag + 'selection_rect', + display: 'none', + fill: 'none', + 'pointer-events': 'none' + }); + g.appendChild(selection_rect); + svg.appendChild(g); + gui_post("made a scalar..."); + return g; +} + +function gui_scalar_erase(cid, tag) { + var g = get_gobj(cid, tag); + g.parentNode.removeChild(g); + // selection rect... +// var sr = get_item(cid, tag + 'selection_rect'); +// sr.parentNode.removeChild(sr); +} + +function gui_scalar_draw_select_rect(cid, tag, state, x1, y1, x2, y2, basex, basey) { + // This is unnecessarily complex-- the select rect is a child of the parent + // scalar group, but in the initial Tkpath API the rect was free-standing. This + // means all the coordinate parameters are in the screen position. But we need + // the coords relative to the scalar's x/y-- hence we subtract the scalar's basex/basey + // from the coords below + //gui_post("drawselectrect: " + x1 + " " + y1 + " " + x2 + " " + y2 + " " + basex + " " + basey); + var r = get_item(cid, tag + 'selection_rect'); + configure_item(r, { + display: (state ? 'inline' : 'none'), + x: (x1 - basex), + y: (y1 - basey), + width: x2 - x1, + height: y2 - y1, + stroke: 'blue', + }); +} + +function gui_create_scalar_group(cid, tag, parent_tag, attr_array) { + var parent = get_item(cid, parent_tag); + if (attr_array === undefined) { + attr_array = []; + } + attr_array.push("id", tag); + var g = create_item(cid, 'g', attr_array); + parent.appendChild(g); + gui_post("made an innder scalar group"); + return g; +} + +function gui_scalar_configure_gobj(cid, tag, isselected, t1, t2, t3, t4, t5, t6) { + var gobj = get_gobj(cid, tag); + var matrix = [t1,t2,t3,t4,t5,t6]; + var transform_string = 'matrix(' + matrix.join() + ')'; + configure_item(gobj, { transform: transform_string }); +} + +function gui_draw_vis(cid, type, coords, attr_array, tag_array) { + gui_post("inside gui_draw_vis"); + for(var i = 0; i < arguments.length; i++) { + gui_post("arg1 is " + arguments[i]); + } + gui_post("coords is " + coords); + gui_post("coords is array: " + Array.isArray(coords)); + gui_post("arguments[2] is " + arguments[2]); + gui_post("type of coords is " + typeof coords); + gui_post("type of arguments[2] is " + typeof arguments[2]); + gui_post("arguments[2] is array: " + Array.isArray(arguments[2])); + var g = get_item(cid, tag_array[0]); + if (g !== null) { + gui_post("our parent exists."); + } else { + gui_post("our parent doe not exists."); + } + //var ca = coords; + switch(type) { + case 'rect': + attr_array.push('x', coords[0]); + attr_array.push('y', coords[1]); + attr_array.push('width', coords[2]); + attr_array.push('height',coords[3]); + break; + // we originally treated circle as an ellipse because we were manually changing the + // aspect ratio using coordinates (with glist_xtopixels/ytopixels). That can probably + // be changed now that we're applying that in the parent group transform... + case 'circle': + type = 'ellipse'; + case 'ellipse': + attr_array.push('cx',coords[0]); + attr_array.push('cy',coords[1]); + attr_array.push('rx',coords[2]); + attr_array.push('ry',coords[3]); + break; + case 'line': + attr_array.push('x1',coords[0]); + attr_array.push('y1',coords[1]); + attr_array.push('x2',coords[2]); + attr_array.push('y2',coords[3]); + break; + case 'polyline': + case 'polygon': + attr_array.push('points',coords.join(" ")); + break; + case 'path': + attr_array.push('d',coords.join(" ")); + break; + } + attr_array.push('id', tag_array[1]); + gui_post("create is " + tag_array[1]); + var item = create_item(cid, type, attr_array); + if (item !== null) { + gui_post("we got create."); + } else { + gui_post("we doe not got creat."); + } + g.appendChild(item); +} + +function gui_draw_erase_item(cid, tag) { + gui_post("baleting... tag is " + tag); + var item = get_item(cid, tag); + if (item !== null) { + item.parentNode.removeChild(item); + } else { + gui_post("uh oh... gui_draw_erase_item couldn't find the item..."); + } +} + +// Configure one attr/val pair at a time, received from Pd +function gui_draw_configure(cid, tag, attr, val) { + var item = get_item(cid, tag); + var obj = {}; + if (Array.isArray(val)) { + obj[attr] = val.join(" "); + } else { + // strings or numbers + obj[attr] = val; + } + configure_item(item, obj); +} + +// Configure multiple attr/val pairs (this should be merged with gui_draw_configure at some point +function gui_draw_configure_all(cid, tag, attr_array) { + var item = get_item(cid, tag); + configure_item(item, attr_array); +} + +function add_popup(cid, popup) { + popup_menu[cid] = popup; +} + +exports.add_popup = add_popup; + +function gui_canvas_popup(cid, xpos, ypos, canprop, canopen, isobject) { + gui_post("canvas_popup called... " + JSON.stringify(arguments)); + // Set the global popup x/y so they can be retrieved by the relevant doc's event handler + popup_coords[0] = xpos; + popup_coords[1] = ypos; + popup_menu[cid].items[0].enabled = canprop; + popup_menu[cid].items[1].enabled = canopen; + + // We'll use "isobject" to enable/disable "To Front" and "To Back" + //isobject; + + // Get page coords for top of window, in case we're scrolled + var left = patchwin[cid].window.document.body.scrollLeft; + var top = patchwin[cid].window.document.body.scrollTop; + + popup_menu[cid].popup(xpos - left, ypos - top); +} + +function popup_action(cid, index) { + pdsend(cid + " done-popup " + index + " " + popup_coords.join(" ")); +} + +exports.popup_action = popup_action; + + +// Graphs and Arrays + +function gui_graph_drawborder(cid, tag, x1, y1, x2, y2) { + var svgelem = get_item(cid, 'patchsvg'); + var b = create_item(cid, 'rect', { + x: x1, + y: y1, + width: x2 - x1, + height: y2 - y1, + stroke: 'black', + fill: 'none', + id: tag + }); + svgelem.appendChild(b); +} + +function gui_graph_deleteborder(cid, tag) { + var b = get_item(cid, tag); + b.parentNode.removeChild(b); +} + +function gui_canvas_drawredrect(cid, x1, y1, x2, y2) { + var svgelem = get_item(cid, 'patchsvg'); + var b = create_item(cid, 'rect', { + x: x1, + y: y1, + width: x2 - x1, + height: y2 - y1, + stroke: 'red', + id: 'GOP' + }); + svgelem.appendChild(b); +} + +function gui_canvas_deleteredrect(cid) { + var r = get_item(cid, 'GOP'); + r.parentNode.removeChild(r); +} + +// Magic Glass (aka Cord Inspector) + +// For clarity, this probably shouldn't be a gobj. Also, it might be easier to +// make it a div that lives on top of the patchsvg +function gui_create_cord_inspector(cid) { + var g = get_gobj(cid, 'cord_inspector'); + var ci_rect = create_item(cid, 'rect', { id: 'cord_inspector_rect' }); + var ci_poly = create_item(cid, 'polygon', { id: 'cord_inspector_polygon' }); + var ci_text = create_item(cid, 'text', { id: 'cord_inspector_text' }); + var text_node = patchwin[cid].window.document.createTextNode(''); + ci_text.appendChild(text_node); + g.appendChild(ci_rect); + g.appendChild(ci_poly); + g.appendChild(ci_text); +} + +function gui_cord_inspector_update(cid, text, basex, basey, bg_size, y1, y2, moved) { + var gobj = get_gobj(cid, 'cord_inspector'); + gobj.setAttributeNS(null, 'transform', + 'translate(' + (basex + 10.5) + ',' + (basey + 0.5) + ')'); + gobj.setAttributeNS(null, 'pointer-events', 'none'); + var rect = get_item(cid, 'cord_inspector_rect'); + var poly = get_item(cid, 'cord_inspector_polygon'); + var svg_text = get_item(cid, 'cord_inspector_text'); + // Lots of fudge factors here, tailored to the current default font size + configure_item(rect, { + x: 13, + y: y1 - basey, + width: bg_size - basex, + height: y2 - basey + 10, + fill: 'none', + stroke: 'black' + }); + var polypoints_array = [8,0,13,5,13,-5]; + configure_item(poly, { + points: polypoints_array.join() + }); + configure_item(svg_text, { + x: 20, + y: 5, + fill: 'black' + }); + // set the text + svg_text.textContent = text; +} + +function gui_erase_cord_inspector(cid) { + var ci = get_gobj(cid, 'cord_inspector'); + if (ci !== null) { + ci.parentNode.removeChild(ci); + } else { + gui_post("oops, trying to erase cord inspector that doesn't exist!"); + } +} + +function gui_cord_inspector_flash(cid) { + var ct = get_item(cid, 'cord_inspector_text'); + if (ct !== null) { + configure_item(ct, { fill: 'red' }); + } else { + gui_post("gui_cord_inspector_flash: trying to flash a non-existent cord inspector!"); + } +} + + +// Window functions + +function gui_raise_window(cid) { + patchwin[cid].focus(); +} diff --git a/pd/nw/todo.txt b/pd/nw/todo.txt new file mode 100644 index 000000000..9946e7abf --- /dev/null +++ b/pd/nw/todo.txt @@ -0,0 +1,80 @@ +Problems to put off until all (or most) sys_vgui calls are eliminated: +1) gui-side parser inside -- pdgui.js. Currently we're splitting on newlines so we can separate + gui_vmess from sys_vgui calls. This makes it very difficult to handle multi-line msg and text + boxes. +2) Semicolons -- currently the parser can't tell the difference between semicolons inside symbols + and semicolons that end statements. Again, this will be easy to solve once we eliminate sys_gui. + +HTML5 which may not be standard yet: +1) mouse.pageX/pageY -- exist in Chromium but maybe not in FF et al. +2) svg 'overflow' attribute -- probably doesn't work in other browsers +3) document.body.scrollTop (might be Chromium-specific, not sure) +3) document.body.scrollLeft (might be Chromium-specific, not sure) + +Node-webkit stuff: +1) popup API +2) new window API +3) window menus +4) (probably) present working directory +5) command line argv + +Everything else: +* packaging as app, setting correct appname, etc +* get -unique to work (relied on tcl [send] command) +* check if patch windows with screenposition (0,0) get stuck underneath Ubuntu/OSX menu. If so, + Node-webkit has a "screen" interface to retrieve the "workable" area of the screen +* choosing the same directory multiple times (see dialog API page) +* figure out why there is a "pd_opendir" global var +* pass k12 mode arg +* implement recent files (using Pd's prefs loading mechanism instead of reimplementing gui prefs) +* implement verifyquit +* save and saveas dialogs aren't defaulting to the present working directory +* create a loop (maybe every second) to check bbox of patchsvg, and set the height/width to that + bbox for the svg. That should trigger the correct scrollbar behavior. +* change canvas string to a single int (and investigate any side-effects) +* destroy (or, more likely, hide) selection rectangle when not needed +* change gui_text_select to gui_gobj_select +* make it possible to have the inner cells of hradio change color with the selection, as the border currently does. Tk just uses the non-hierarchical tags and appends the word "BASE". (Maybe use an inner <g> to do this.) +* make mycnv use its own selection logic +* abstract away appendChild +* font-size should be set as css property for a class of text, rather than per each gobj in svg +* remove the "fudge_factor" kludge in g_rtext.c, and handle fonts in a sane manner. In doing so + we must decide whether or not we want to be able to fetch the bounding box of objects from + within a Pd patch. (Currently [canvasinfo] and [objectinfo] are the only objects that can + do this, though there might also be) +* replace things like gui_select_color with css +* find a better approach to escaping characters for the gui than escape_double_quotes kludge (and handle any other problematic chars) +* look into using <def> and <use> for scalars. +* use Atom's selectors for standard OSX behavior (cut, paste, about, etc.) +* in draw_vis, make circle and ellipse radii attr floats instead of ints +* should stroke-dasharray values be floats? +* once garrays are drawn inside a <g> we won't have to individually erase each child of a scalar +* clean up svg_sendupdate -- put a single gui_vmess at the end +* svg_sendupdate -- make sure there aren't arbitrary %d's that should actually be %g's +* svg_sendupdate -- need a gui interface for stuff like stroke-dasharray (and garrays) +* ibid., for path data, points +* make pdgui function names more consistent +* in draw_vis, move tags to front of function call so they don't have to be an ugly array +* in draw_vis, remove all the coords logic and let svg_togui do that work. In svg_new, + leverage the "d", "points", etc. methods to do the same. +* remove the draw_vis warning/code about needing 2 points to draw +* might want to clean up dead windows inside patchwin object (on close) +* make gui_menu_close filename less hacky (currently includes patch args in the middle) +* figure out why -nrt flag causes Pd to bail on the GUI (it wasn't doing this + on the amd_64 virtual Jessie machine) +* make dialogs with [yes/no] instead of [cancel/ok] +* make a gui_mess interface for the edge cases that don't require args (similar to sys_gui) +* make sure we're breaking down the socket properly from the GUI side on quit +* nwworkingdir isn't working with the saveas dialog in pdcanvas.html +* nwworkingdir only works on the second file open +* implement the stuff at the end of saveas_callback (recentfiles et al); +* make an "export" menu command for max patch saving. That way we can accept a single extension + for saving (.pd), and the native save dialog will warn us on potential file overwrites (even when + the user neglects to type an extension). +* draw graph inside gobj group +* merge gui_text_select and gui_text_deselect +* in function gui_cord_inspector_update, use parameter "moved" to flash text +* cord_inspector_flash doesn't seem to be deterministic-- if you move among several cords very fast + it will try to flash a non-existent svg item. (Probably want to either make a permanent item in + the pdcanvas.html for it, or hard-code a separate div.) +* for data structures, change "" to 'none' diff --git a/pd/src/g_all_guis.c b/pd/src/g_all_guis.c index 2194b67c8..312d1e51c 100644 --- a/pd/src/g_all_guis.c +++ b/pd/src/g_all_guis.c @@ -496,7 +496,9 @@ void iemgui_displace_withtag(t_gobj *z, t_glist *glist, int dx, int dy) void iemgui_select(t_gobj *z, t_glist *glist, int selected) { + char tagbuf[MAXPDSTRING]; t_iemgui *x = (t_iemgui *)z; + sprintf(tagbuf, "x%lx", (long unsigned int)x); t_canvas *canvas=glist_getcanvas(glist); if (selected) x->x_selected = canvas; @@ -504,6 +506,7 @@ void iemgui_select(t_gobj *z, t_glist *glist, int selected) x->x_selected = NULL; sys_vgui(".x%lx.c itemconfigure {x%lx&&border} -stroke %s\n", canvas, x, x->x_selected && x->x_glist == canvas ? selection_color : border_color); + gui_vmess("gui_text_select_color", "ss", canvas_string(canvas), tagbuf); x->x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_SELECT); if (selected < 2) { @@ -941,11 +944,19 @@ static void scalehandle_check_and_redraw(t_iemgui *x) // IEMGUI refactor (by Mathieu) void iemgui_tag_selected(t_iemgui *x) { + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); t_canvas *canvas=glist_getcanvas(x->x_glist); if(x->x_selected) + { sys_vgui(".x%lx.c addtag selected withtag x%lx\n", canvas, x); + gui_vmess("gui_text_select", "ss", canvas_string(canvas), tagbuf); + } else + { sys_vgui(".x%lx.c dtag x%lx selected\n", canvas, x); + gui_vmess("gui_text_deselect", "ss", canvas_string(canvas), tagbuf); + } } void iemgui_label_draw_new(t_iemgui *x) { @@ -1023,12 +1034,18 @@ void iemgui_draw_io(t_iemgui *x, int old_sr_flags) //fprintf(stderr,"%lx SND: old_sr_flags=%d SND_FLAG=%d || OUTCOME: OLD_SND_FLAG=%d not_empty=%d\n", (t_int)x, old_sr_flags, IEM_GUI_OLD_SND_FLAG, a, b); if(a && !b) for (i=0; i<n; i++) + { sys_vgui(".x%lx.c create prect %d %d %d %d " "-stroke $pd_colors(iemgui_nlet) " "-tags {%so%d x%lx outlet %s}\n", canvas, x1+i*k, y2-1, x1+i*k + IOWIDTH, y2, iem_get_tag(canvas, x), i, x, x->x_selected == x->x_glist ? "iemgui selected" : "iemgui"); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_canvas_drawio", "sssiiiiii", canvas_string(canvas), tagbuf, + iem_get_tag(canvas, x), x1+i*k, y2-1, x1+i*k + IOWIDTH, y2, x1, y1); + } if(!a && b) for (i=0; i<n; i++) sys_vgui(".x%lx.c delete %so%d\n", canvas, iem_get_tag(canvas, x), i); @@ -1036,12 +1053,18 @@ void iemgui_draw_io(t_iemgui *x, int old_sr_flags) b=x->x_rcv!=s_empty; //fprintf(stderr,"%lx RCV: old_sr_flags=%d RCV_FLAG=%d || OUTCOME: OLD_RCV_FLAG=%d not_empty=%d\n", (t_int)x, old_sr_flags, IEM_GUI_OLD_RCV_FLAG, a, b); if(a && !b) for (i=0; i<n; i++) + { sys_vgui(".x%lx.c create prect %d %d %d %d " "-stroke $pd_colors(iemgui_nlet) " "-tags {%si%d x%lx inlet %s}\n", canvas, x1+i*k, y1, x1+i*k + IOWIDTH, y1+1, iem_get_tag(canvas, x), i, x, x->x_selected == x->x_glist ? "iemgui selected" : "iemgui"); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_canvas_drawio", "sssiiiiii", canvas_string(canvas), tagbuf, + iem_get_tag(canvas, x), x1+i*k, y1, x1+i*k + IOWIDTH, y1+1, x1, y1); + } if(!a && b) for (i=0; i<n; i++) sys_vgui(".x%lx.c delete %si%d\n", canvas, iem_get_tag(canvas, x), i); } @@ -1061,6 +1084,8 @@ void iemgui_io_draw_move(t_iemgui *x) { } void iemgui_base_draw_new(t_iemgui *x) { + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); t_canvas *canvas=glist_getcanvas(x->x_glist); t_class *c = pd_class((t_pd *)x); int x1,y1,x2,y2,gr=gop_redraw; gop_redraw=0; @@ -1070,6 +1095,12 @@ void iemgui_base_draw_new(t_iemgui *x) { "-stroke $pd_colors(iemgui_border) -fill #%6.6x " "-tags {%lxBASE x%lx text iemgui border}\n", canvas, x1,y1,x2,y2, x->x_bcol, x, x); + gui_vmess("gui_text_create_gobj", "ssii", canvas_string(canvas), tagbuf, + x1, y1); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_bcol); + gui_vmess("gui_iemgui_drawborder", "sssiiii", canvas_string(canvas), tagbuf, + colorbuf, x1, y1, x2, y2); } void iemgui_base_draw_move(t_iemgui *x) { @@ -1114,6 +1145,9 @@ void iemgui_draw_move(t_iemgui *x) { void iemgui_draw_erase(t_iemgui *x) { t_canvas *canvas=glist_getcanvas(x->x_glist); sys_vgui(".x%lx.c delete x%lx\n", canvas, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_gobj_erase", "ss", canvas_string(canvas), tagbuf); scalehandle_draw_erase2(x); } diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c index 4370ebe4b..3ca7b2e71 100644 --- a/pd/src/g_bang.c +++ b/pd/src/g_bang.c @@ -24,18 +24,24 @@ static t_class *bng_class; void bng_draw_update(t_gobj *xgobj, t_glist *glist) { + char tagbuf[MAXPDSTRING]; t_bng *x = (t_bng *)xgobj; + sprintf(tagbuf, "x%lx", (long unsigned int)&x->x_gui); if (x->x_gui.x_changed != x->x_flashed && glist_isvisible(glist)) { - sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", - glist_getcanvas(glist), x, - x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol); +// sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", +// glist_getcanvas(glist), x, +// x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol); + gui_vmess("gui_bng_update", "ssi", + canvas_string(glist_getcanvas(glist)), tagbuf, x->x_flashed); } x->x_gui.x_changed = x->x_flashed; } void bng_draw_new(t_bng *x, t_glist *glist) { + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)&x->x_gui); t_canvas *canvas=glist_getcanvas(glist); int x1=text_xpix(&x->x_gui.x_obj, glist); int y1=text_ypix(&x->x_gui.x_obj, glist); @@ -49,6 +55,8 @@ void bng_draw_new(t_bng *x, t_glist *glist) "-tags {%lxBUT x%lx text iemgui border}\n", canvas, cx, cy, cr, x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol, x, x); + gui_vmess("gui_create_bng", "ssfff", canvas_string(canvas), tagbuf, + cx - x1 - 0.5, cy - y1 - 0.5, cr); } void bng_draw_move(t_bng *x, t_glist *glist) diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 4c6d9372d..10a16bc1e 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -248,6 +248,13 @@ void canvas_makefilename(t_canvas *x, char *file, char *result, int resultsize) //fprintf(stderr,"resulting file = <%s>\n", result); } +char *canvas_string(t_canvas *x) +{ + static char s[MAXPDSTRING]; + sprintf(s, ".x%lx", (long unsigned int)x); + return s; +} + void canvas_rename(t_canvas *x, t_symbol *s, t_symbol *dir) { canvas_unbind(x); @@ -650,9 +657,32 @@ t_symbol *canvas_makebindsym(t_symbol *s) return (gensym(buf)); } +void canvas_args_to_string(char *namebuf, t_canvas *x) +{ + t_canvasenvironment *env = canvas_getenv(x); + if (env->ce_argc) + { + int i; + strcpy(namebuf, " ("); + for (i = 0; i < env->ce_argc; i++) + { + if (strlen(namebuf) > MAXPDSTRING/2 - 5) + break; + if (i != 0) + strcat(namebuf, " "); + atom_string(&env->ce_argv[i], namebuf + strlen(namebuf), + MAXPDSTRING/2); + } + strcat(namebuf, ")"); + } + else namebuf[0] = 0; +} + void canvas_reflecttitle(t_canvas *x) { char namebuf[MAXPDSTRING]; + canvas_args_to_string(namebuf, x); +/* t_canvasenvironment *env = canvas_getenv(x); if (env->ce_argc) { @@ -670,6 +700,7 @@ void canvas_reflecttitle(t_canvas *x) strcat(namebuf, ")"); } else namebuf[0] = 0; +*/ #ifdef __APPLE__ sys_vgui("wm attributes .x%lx -modified %d -titlepath {%s/%s}\n", x, x->gl_dirty, canvas_getdir(x)->s_name, x->gl_name->s_name); @@ -681,9 +712,11 @@ void canvas_reflecttitle(t_canvas *x) x->gl_isgraph && x->gl_havewindow, x->gl_loading, x->gl_dirty);*/ - sys_vgui("wm title .x%lx {%s%c%s - %s}\n", - x, x->gl_name->s_name, (x->gl_dirty? '*' : ' '), namebuf, - canvas_getdir(x)->s_name); + //sys_vgui("wm title .x%lx {%s%c%s - %s}\n", + // x, x->gl_name->s_name, (x->gl_dirty? '*' : ' '), namebuf, + // canvas_getdir(x)->s_name); + gui_vmess("gui_canvas_set_title", "ssssi", canvas_string(x), x->gl_name->s_name, + namebuf, canvas_getdir(x)->s_name, x->gl_dirty); //} #endif } @@ -753,14 +786,22 @@ void canvas_drawredrect(t_canvas *x, int doit) { int x1=x->gl_xmargin, y1=x->gl_ymargin; int x2=x1+x->gl_pixwidth, y2=y1+x->gl_pixheight; - sys_vgui(".x%lx.c create line\ - %d %d %d %d %d %d %d %d %d %d -fill #ff8080 -tags GOP\n", - glist_getcanvas(x), x1, y1, x2, y1, x2, y2, x1, y2, x1, y1); + //sys_vgui(".x%lx.c create line " + // "%d %d %d %d %d %d %d %d %d %d -fill #ff8080 -tags GOP\n", + // glist_getcanvas(x), x1, y1, x2, y1, x2, y2, x1, y2, x1, y1); + gui_vmess("gui_canvas_drawredrect", "siiii", + canvas_string(glist_getcanvas(x)), + x1, y1, x2, y2); //dpsaha@vt.edu for drawing the GOP_blobs if (x->gl_goprect && x->gl_edit) canvas_draw_gop_resize_hooks(x); } - else sys_vgui(".x%lx.c delete GOP\n", glist_getcanvas(x)); + else + { + //sys_vgui(".x%lx.c delete GOP\n", glist_getcanvas(x)); + gui_vmess("gui_canvas_deleteredrect", "s", + canvas_string(glist_getcanvas(x))); + } } /* the window becomes "mapped" (visible and not miniaturized) or @@ -1008,8 +1049,12 @@ void canvas_eraselinesfor(t_canvas *x, t_text *text) { if (x->gl_editor) { - sys_vgui(".x%lx.c delete l%lx\n", - glist_getcanvas(x), oc); + //sys_vgui(".x%lx.c delete l%lx\n", + // glist_getcanvas(x), oc); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "l%lx", (long unsigned int)oc); + gui_vmess("gui_canvas_delete_line", "ss", + canvas_string(glist_getcanvas(x)), tagbuf); } } } diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h index 90574b3de..d6bdecee1 100644 --- a/pd/src/g_canvas.h +++ b/pd/src/g_canvas.h @@ -480,6 +480,7 @@ EXTERN void text_drawborder(t_text *x, t_glist *glist, char *tag, int width, int height, int firsttime); EXTERN void text_drawborder_withtag(t_text *x, t_glist *glist, char *tag, int width, int height, int firsttime); +EXTERN void text_erase_gobj(t_text *x, t_glist *glist, char *tag); EXTERN void text_eraseborder(t_text *x, t_glist *glist, char *tag); EXTERN int text_xcoord(t_text *x, t_glist *glist); EXTERN int text_ycoord(t_text *x, t_glist *glist); @@ -561,6 +562,7 @@ EXTERN t_gobj *canvas_findhitbox(t_canvas *x, int xpos, int ypos, int *x1p, int *y1p, int *x2p, int *y2p); EXTERN int canvas_setdeleting(t_canvas *x, int flag); EXTERN int canvas_hasarray(t_canvas *x); +EXTERN char *canvas_string(t_canvas *x); /* canvas as string to send to gui */ /* ---- for parsing @pd_extra and other sys paths in filenames --------------------- */ diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index 58ff2c21c..0bacbb29b 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -430,10 +430,13 @@ void glist_selectline(t_glist *x, t_outconnect *oc, int index1, x->gl_editor->e_selectline_index2 = index2; x->gl_editor->e_selectline_inno = inno; x->gl_editor->e_selectline_tag = oc; - sys_vgui(".x%lx.c itemconfigure l%lx -stroke $pd_colors(selection)\n", - x, x->gl_editor->e_selectline_tag); - sys_vgui(".x%lx.c addtag selected withtag l%lx\n", - glist_getcanvas(x), x->gl_editor->e_selectline_tag); + //sys_vgui(".x%lx.c itemconfigure l%lx -stroke $pd_colors(selection)\n", + // x, x->gl_editor->e_selectline_tag); + //sys_vgui(".x%lx.c addtag selected withtag l%lx\n", + // glist_getcanvas(x), x->gl_editor->e_selectline_tag); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "l%lx", (long unsigned int)oc); + gui_vmess("gui_canvas_select_line", "ss", canvas_string(x), tagbuf); c_selection = x; canvas_draw_gop_resize_hooks(x); } @@ -455,14 +458,18 @@ void glist_deselectline(t_glist *x) issignal = 1; else issignal = 0; - sys_vgui(".x%lx.c itemconfigure l%lx -stroke %s\n", - x, x->gl_editor->e_selectline_tag, - (issignal ? - "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")); - sys_vgui(".x%lx.c dtag l%lx selected\n", - glist_getcanvas(x), - glist_getcanvas(x)->gl_editor->e_selectline_tag); + //sys_vgui(".x%lx.c itemconfigure l%lx -stroke %s\n", + // x, x->gl_editor->e_selectline_tag, + // (issignal ? + // "$pd_colors(signal_cord)" : "$pd_colors(control_cord)")); + //sys_vgui(".x%lx.c dtag l%lx selected\n", + // glist_getcanvas(x), + // glist_getcanvas(x)->gl_editor->e_selectline_tag); canvas_draw_gop_resize_hooks(x); + + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "l%lx", (long unsigned int)x->gl_editor->e_selectline_tag); + gui_vmess("gui_canvas_deselect_line", "ss", canvas_string(x), tagbuf); } } @@ -858,7 +865,11 @@ void canvas_disconnect(t_canvas *x, if (srcno == index1 && t.tr_outno == outno && sinkno == index2 && t.tr_inno == inno) { - sys_vgui(".x%lx.c delete l%lx\n", x, oc); + //sys_vgui(".x%lx.c delete l%lx\n", x, oc); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "l%lx", (long unsigned int)oc); + gui_vmess("gui_canvas_delete_line", "ss", + canvas_string(x), tagbuf); // jsarlo if(x->gl_editor && x->gl_editor->gl_magic_glass) { @@ -2177,16 +2188,16 @@ void canvas_undo_font(t_canvas *x, void *z, int action) /* ------------------------ event handling ------------------------ */ static char *cursorlist[] = { - "$cursor_runmode_nothing", - "$cursor_runmode_clickme", - "$cursor_runmode_thicken", - "$cursor_runmode_addpoint", - "$cursor_editmode_nothing", - "$cursor_editmode_connect", - "$cursor_editmode_disconnect", - "$cursor_editmode_resize", - "$cursor_editmode_resize_bottom_right", - "$cursor_scroll" + "cursor_runmode_nothing", + "cursor_runmode_clickme", + "cursor_runmode_thicken", + "cursor_runmode_addpoint", + "cursor_editmode_nothing", + "cursor_editmode_connect", + "cursor_editmode_disconnect", + "cursor_editmode_resize", + "cursor_editmode_resize_bottom_right", + "cursor_scroll" }; void canvas_setcursor(t_canvas *x, unsigned int cursornum) @@ -2203,7 +2214,9 @@ void canvas_setcursor(t_canvas *x, unsigned int cursornum) } if (xwas != x || cursorwas != cursornum) { - sys_vgui(".x%lx configure -cursor %s\n", x, cursorlist[cursornum]); + //sys_vgui(".x%lx configure -cursor %s\n", x, cursorlist[cursornum]); + gui_vmess("gui_canvas_cursor", "ss", canvas_string(x), + cursorlist[cursornum]); xwas = x; cursorwas = cursornum; } @@ -2305,8 +2318,10 @@ static void canvas_rightclick(t_canvas *x, int xpos, int ypos, t_gobj *y_sel) isobject = 1; } else isobject = 0; - sys_vgui("pdtk_canvas_popup .x%lx %d %d %d %d %d\n", - x, xpos, ypos, canprop, canopen, isobject); + //sys_vgui("pdtk_canvas_popup .x%lx %d %d %d %d %d\n", + // x, xpos, ypos, canprop, canopen, isobject); + gui_vmess("gui_canvas_popup", "siiiii", + canvas_string(x), xpos, ypos, canprop, canopen, isobject); } /* ---- editors -- perhaps this and "vis" should go to g_editor.c ------- */ @@ -2380,7 +2395,11 @@ void canvas_destroy_editor(t_glist *x) } } -void canvas_reflecttitle(t_canvas *x); + +// void canvas_reflecttitle(t_canvas *x); +// This should replace canvas_reflecttitle above +extern void canvas_args_to_string(char *namebuf, t_canvas *x); + void canvas_map(t_canvas *x, t_floatarg f); /* we call this when we want the window to become visible, mapped, and @@ -2394,6 +2413,10 @@ void canvas_map(t_canvas *x, t_floatarg f); void canvas_vis(t_canvas *x, t_floatarg f) { //fprintf(stderr,"canvas_vis .x%lx %f\n", (t_int)x, f); + char geobuf[MAXPDSTRING]; + char argsbuf[MAXPDSTRING]; + sprintf(geobuf, "+%d+%d", + (int)(x->gl_screenx1), (int)(x->gl_screeny1)); t_gobj *g; t_int properties; @@ -2408,21 +2431,38 @@ void canvas_vis(t_canvas *x, t_floatarg f) if (x->gl_editor && x->gl_havewindow && glist_isvisible(x)) { /* just put us in front */ //fprintf(stderr,"existing\n"); - sys_vgui("raise .x%lx\n", x); - sys_vgui("focus .x%lx.c\n", x); - sys_vgui("wm deiconify .x%lx\n", x); + //sys_vgui("raise .x%lx\n", x); + //sys_vgui("focus .x%lx.c\n", x); + //sys_vgui("wm deiconify .x%lx\n", x); + gui_vmess("gui_raise_window", "s", canvas_string(x)); } else { //fprintf(stderr,"new\n"); canvas_create_editor(x); - sys_vgui("pdtk_canvas_new .x%lx %d %d +%d+%d %d\n", x, +// sys_vgui("pdtk_canvas_new .x%lx %d %d +%d+%d %d\n", x, +// (int)(x->gl_screenx2 - x->gl_screenx1), +// (int)(x->gl_screeny2 - x->gl_screeny1), +// (int)(x->gl_screenx1), (int)(x->gl_screeny1), +// x->gl_edit); + + canvas_args_to_string(argsbuf, x); + + gui_vmess("gui_canvas_new", "siisissis", + canvas_string(x), (int)(x->gl_screenx2 - x->gl_screenx1), (int)(x->gl_screeny2 - x->gl_screeny1), - (int)(x->gl_screenx1), (int)(x->gl_screeny1), - x->gl_edit); + geobuf, + x->gl_edit, + x->gl_name->s_name, + canvas_getdir(x)->s_name, + x->gl_dirty, + argsbuf); + + + sys_vgui("pdtk_canvas_set_font .x%lx %d\n", x, x->gl_font); - canvas_reflecttitle(x); +// canvas_reflecttitle(x); x->gl_havewindow = 1; // check if this is a subpatch with an array @@ -2507,7 +2547,7 @@ void canvas_vis(t_canvas *x, t_floatarg f) if (glist_isvisible(x)) canvas_map(x, 0); canvas_destroy_editor(x); - sys_vgui("destroy .x%lx\n", x); + gui_vmess("gui_close_window", "s", canvas_string(x)); // delete properties windows of objects in the patcher we're closing g = x->gl_list; while (g) @@ -3289,6 +3329,9 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"), (issignal ? "signal" : "control")); + gui_vmess("gui_canvas_line", "ssiiiiiiiiii", + canvas_string(x), "newcord", + xpos, ypos, xpos, ypos, xpos, ypos, xpos, ypos, xpos, ypos); } else // jsarlo @@ -3309,7 +3352,6 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, "-strokewidth $highlight_width\n", x, x->gl_editor->canvas_cnct_outlet_tag); - //sys_vgui(".x%x.c raise %s\n", // x, // x->gl_editor->canvas_cnct_outlet_tag); @@ -3591,6 +3633,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, sys_vgui(".x%lx.c create prect %d %d %d %d -tags x " "-stroke $pd_colors(selection_rectangle)\n", x, xpos, ypos, xpos, ypos); + gui_vmess("gui_create_selection_rectangle", "siiii", canvas_string(x), + xpos, ypos, xpos, ypos); x->gl_editor->e_xwas = xpos; x->gl_editor->e_ywas = ypos; x->gl_editor->e_onmotion = MA_REGION; @@ -3686,6 +3730,7 @@ void canvas_sort_selection_according_to_location(t_canvas *x) void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_int tag, int issignal) { + char tagbuf[MAXPDSTRING]; int ymax = 0; int halfx = (lx2 - lx1)/2; int halfy = (ly2 - ly1)/2; @@ -3727,11 +3772,16 @@ void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, "$pd_colors(signal_cord_width)" : "$pd_colors(control_cord_width)"), tag, (issignal ? "signal" : "control")); + sprintf(tagbuf, "l%lx", (long unsigned int)tag); + gui_vmess("gui_canvas_line", "ssiiiiiiiiii", + canvas_string(x), tagbuf, lx1, ly1, lx1, ly1 + yoff, + lx1 + halfx, ly1 + halfy, lx2, ly2 - yoff, lx2, ly2); } void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, t_int tag) { + char cord_tag[MAXPDSTRING]; if (glist_isvisible(x) && glist_istoplevel(x)) { int ymax = 0; @@ -3768,6 +3818,11 @@ void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, x, tag, lx1, ly1, lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy, lx2, ly2 - yoff, lx2, ly2); + sprintf(cord_tag, "l%lx", (long unsigned int)tag); + gui_vmess("gui_canvas_updateline", "ssiiiii", canvas_string(x), cord_tag, + lx1, ly1, lx2, ly2, yoff); +// lx1, ly1, lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy, +// lx2, ly2 - yoff, lx2, ly2); } else { @@ -3777,6 +3832,10 @@ void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2, x, lx1, ly1, lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy, lx2, ly2 - yoff, lx2, ly2); + gui_vmess("gui_canvas_updateline", "ssiiiii", canvas_string(x), "newcord", + lx1, ly1, lx2, ly2, yoff); +// lx1, ly1, lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy, lx2, ly2 - yoff, +// lx2, ly2); } } } @@ -4371,7 +4430,10 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit) int xwas = x->gl_editor->e_xwas, ywas = x->gl_editor->e_ywas; if (doit && !glob_shift) + { sys_vgui(".x%lx.c delete x\n", x); + gui_vmess("gui_canvas_delete_line", "ss", canvas_string(x), "newcord"); + } else { canvas_updateconnection(x, x->gl_editor->e_xwas, x->gl_editor->e_ywas, @@ -4514,11 +4576,17 @@ static void canvas_doregion(t_canvas *x, int xpos, int ypos, int doit) else hiy = x->gl_editor->e_ywas, loy = ypos; canvas_selectinrect(x, lox, loy, hix, hiy); sys_vgui(".x%lx.c delete x\n", x); + gui_vmess("gui_hide_selection_rectangle", "s", canvas_string(x)); x->gl_editor->e_onmotion = MA_NONE; } - else sys_vgui(".x%lx.c coords x %d %d %d %d\n", + else + { + sys_vgui(".x%lx.c coords x %d %d %d %d\n", x, x->gl_editor->e_xwas, x->gl_editor->e_ywas, xpos, ypos); + gui_vmess("gui_move_selection_rectangle", "siiii", + canvas_string(x), x->gl_editor->e_xwas, x->gl_editor->e_ywas, xpos, ypos); + } } /* @@ -4744,6 +4812,7 @@ void canvas_displaceselection(t_canvas *x, int dx, int dy) if (dx || dy) { sys_vgui("pdtk_canvas_displace_withtag .x%lx.c %d %d\n", x, dx, dy); + gui_vmess("gui_canvas_displace_withtag", "sii", canvas_string(x), dx, dy); if (resortin) canvas_resortinlets(x); if (resortout) canvas_resortoutlets(x); //scrollbar_update(x); @@ -5254,13 +5323,21 @@ void glob_verifyquit(void *dummy, t_floatarg f) if (!glist_istoplevel(g2) && g->gl_env) { /* if this is an abstraction */ - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;}\n", - g2, g2); + //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;}\n", + // g2, g2); + gui_vmess("gui_canvas_menuclose", "ssi", + canvas_string(g2), + canvas_string(g2), + 3); } else { - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;}\n", - canvas_getrootfor(g2), g2); + //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;}\n", + // canvas_getrootfor(g2), g2); + gui_vmess("gui_canvas_menuclose", "ssi", + canvas_string(canvas_getrootfor(g2)), + canvas_string(g2), + 3); } //canvas_vis(g2, 1); //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;\n}\n", @@ -5268,8 +5345,15 @@ void glob_verifyquit(void *dummy, t_floatarg f) return; } if (f == 0 && sys_perf) - sys_vgui("pdtk_check . {really quit?} {pd quit;\n} yes\n"); - else glob_quit(0); + { + //sys_vgui("pdtk_check . {really quit?} {pd quit;\n} yes\n"); + gui_vmess("gui_pd_quit_dialog", ""); + } + else + { + gui_vmess("gui_post", "s", "about to quite seresly dood"); + glob_quit(0); + } } //void canvas_dofree(t_gobj *dummy, t_glist *x) @@ -5305,6 +5389,7 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce) /* first open window */ if (!glist_istoplevel(g) && g->gl_env) { + post("opening menu"); /* if this is an abstraction */ vmess(&g->gl_pd, gensym("menu-open"), ""); } @@ -5316,13 +5401,21 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce) if (!glist_istoplevel(g) && g->gl_env) { /* if this is an abstraction */ - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", - g, g); + //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", + // g, g); + gui_vmess("gui_canvas_menuclose", "ssi", + canvas_string(g), + canvas_string(g), + 2); } else { - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", - canvas_getrootfor(g), g); + //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", + // canvas_getrootfor(g), g); + gui_vmess("gui_canvas_menuclose", "ssi", + canvas_string(canvas_getrootfor(g)), + canvas_string(g), + 2); } return; } @@ -5359,6 +5452,7 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce) { if (!glist_istoplevel(g) && g->gl_env) { +post("opening up the motherfucker x%lx", g); /* if this is an abstraction */ vmess(&g->gl_pd, gensym("menu-open"), ""); } @@ -5366,18 +5460,29 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce) { /* is this even necessary? */ canvas_vis(g, 1); +post("fuck you canvas_vis x%lx", g); } //vmess(&g->gl_pd, gensym("menu-open"), ""); if (!glist_istoplevel(g) && g->gl_env) { +post("farging..."); /* if this is an abstraction */ - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", - g, g); + //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", + // g, g); + gui_vmess("gui_canvas_menuclose", "ssi", + canvas_string(g), + canvas_string(g), + 2); } else { - sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", - canvas_getrootfor(g), g); +post("dildo"); + //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n", + // canvas_getrootfor(g), g); + gui_vmess("gui_canvas_menuclose", "ssi", + canvas_string(canvas_getrootfor(g)), + canvas_string(g), + 2); } //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;\n}\n", // canvas_getrootfor(x), g); diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c index 6c1b05bdf..b5771002a 100644 --- a/pd/src/g_graph.c +++ b/pd/src/g_graph.c @@ -881,14 +881,32 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis) //} //fprintf(stderr,"tgt=.x%lx %d\n", (t_int)tgt, exception); - if (vis && canvas_showtext(x) && gobj_shouldvis(gr, parent_glist)) - rtext_draw(glist_findrtext(parent_glist, &x->gl_obj)); + sprintf(tag, "%s", rtext_gettag(glist_findrtext(parent_glist, &x->gl_obj))); +//post("before rtext_draw: %s", tag); + + if (vis & gobj_shouldvis(gr, parent_glist)) + { + int xpix, ypix; + xpix = text_xpix(&x->gl_obj, parent_glist); + ypix = text_ypix(&x->gl_obj, parent_glist); + gui_vmess("gui_text_create_gobj", "ssii", + canvas_string(glist_getcanvas(x->gl_owner)), + tag, xpix, ypix); + if (canvas_showtext(x)) + rtext_draw(glist_findrtext(parent_glist, &x->gl_obj)); + } + +// sprintf(tag, "%s", rtext_gettag(glist_findrtext(parent_glist, &x->gl_obj))); +//post("after rtext_draw: %s", tag); + + // need the rect to create the gobj, so this should perhaps be above the + // conditional graph_getrect(gr, parent_glist, &x1, &y1, &x2, &y2); //fprintf(stderr,"%d %d %d %d\n", x1, y1, x2, y2); + if (!vis) rtext_erase(glist_findrtext(parent_glist, &x->gl_obj)); - sprintf(tag, "%s", rtext_gettag(glist_findrtext(parent_glist, &x->gl_obj))); //sprintf(tag, "graph%lx", (t_int)x); //fprintf(stderr, "gettag=%s, tag=graph%lx\n", // rtext_gettag(glist_findrtext(parent_glist, &x->gl_obj)),(t_int)x); @@ -898,19 +916,30 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis) { if (vis && gobj_shouldvis(gr, parent_glist)) { - sys_vgui(".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d " - "-tags {%sfill graph} -fill $pd_colors(graph_border) " - "-stroke $pd_colors(graph_border)\n", - glist_getcanvas(x->gl_owner), - //parent_glist, - x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag); + //sys_vgui(".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d " + // "-tags {%sfill graph} -fill $pd_colors(graph_border) " + // "-stroke $pd_colors(graph_border)\n", + // glist_getcanvas(x->gl_owner), + ////parent_glist, + // x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "%sfill", tag); + gui_vmess("gui_text_drawborder", "ssiiiii", + canvas_string(glist_getcanvas(x->gl_owner)), + tag, + 0, x1, y1, x2, y2); glist_noselect(x->gl_owner); } else if (gobj_shouldvis(gr, parent_glist)) { - sys_vgui(".x%lx.c delete %sfill\n", - glist_getcanvas(x->gl_owner), tag); - //parent_glist, tag); + //sys_vgui(".x%lx.c delete %sfill\n", + // glist_getcanvas(x->gl_owner), tag); + ////parent_glist, tag); + char tagbuf2[MAXPDSTRING]; + sprintf(tagbuf2, "%sfill", tag); + gui_vmess("gui_graph_deleteborder", "ss", + canvas_string(glist_getcanvas(x->gl_owner)), + tagbuf2); } return; } @@ -926,12 +955,17 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis) "-stroke $pd_colors(graph_border) -tags {%sR %s graph}\n", glist_getcanvas(x->gl_owner), x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag, tag);*/ - sys_vgui(".x%lx.c create prect %d %d %d %d " - "-stroke $pd_colors(graph_border) -tags {%sR graph}\n", - //REMOVED: -fill $pd_colors(graph) - glist_getcanvas(x->gl_owner), - x1, y1, x2, y2, tag); // -fill $pd_colors(graph) - + //sys_vgui(".x%lx.c create prect %d %d %d %d " + // "-stroke $pd_colors(graph_border) -tags {%sR graph}\n", + // //REMOVED: -fill $pd_colors(graph) + // glist_getcanvas(x->gl_owner), + // x1, y1, x2, y2, tag); // -fill $pd_colors(graph) + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "%sR", tag); + gui_vmess("gui_text_drawborder", "ssiiiii", + canvas_string(glist_getcanvas(x->gl_owner)), + tag, + 0, x1, y1, x2, y2); /* write garrays' names along the top */ for (i = (y1 < y2 ? y1 : y2)-1, g = x->gl_list; g; g = g->g_next) { @@ -1380,6 +1414,12 @@ static void graph_select(t_gobj *z, t_glist *glist, int state) canvas, rtext_gettag(y), (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"), (state? "$pd_colors(selection)" : "$pd_colors(graph_border)")); + if (state) + gui_vmess("gui_text_select", "ss", + canvas_string(canvas), rtext_gettag(y)); + else + gui_vmess("gui_text_deselect", "ss", + canvas_string(canvas), rtext_gettag(y)); } t_gobj *g; diff --git a/pd/src/g_magicglass.c b/pd/src/g_magicglass.c index bdde53081..22cd07fe0 100644 --- a/pd/src/g_magicglass.c +++ b/pd/src/g_magicglass.c @@ -5,6 +5,7 @@ #include "m_imp.h" #include "s_stuff.h" #include "g_magicglass.h" +#include "g_canvas.h" #define MG_CLOCK_CLEAR_DELAY 500.5 #define MG_CLOCK_FLASH_DELAY 50 @@ -116,6 +117,12 @@ void magicGlass_updateText(t_magicGlass *x, int moved) x->x_y - (int)(sys_fontheight(x->x_display_font)/2) - 3, bgSize, x->x_y + (int)(sys_fontheight(x->x_display_font)/2) + 3); + gui_vmess("gui_cord_inspector_update", "ssiiiiii", + canvas_string(x->x_c), x->x_string, + x->x_x, x->x_y, bgSize, + x->x_y - (int)(sys_fontheight(x->x_display_font)/2) - 3, + x->x_y + (int)(sys_fontheight(x->x_display_font)/2) + 3, + moved); } } @@ -137,6 +144,10 @@ void magicGlass_drawNew(t_magicGlass *x) x->x_c); sys_vgui(".x%x.c raise magicGlassText\n", x->x_c); + gui_vmess("gui_text_create_gobj", "ssii", + canvas_string(x->x_c), "cord_inspector", 0, 0); + gui_vmess("gui_create_cord_inspector", "s", + canvas_string(x->x_c)); magicGlass_updateText(x, 0); clock_delay(x->x_flashClock, MG_CLOCK_FLASH_DELAY); } @@ -147,6 +158,8 @@ void magicGlass_undraw(t_magicGlass *x) sys_vgui(".x%x.c delete magicGlassBg\n", x->x_c); sys_vgui(".x%x.c delete magicGlassLine\n", x->x_c); sys_vgui(".x%x.c delete magicGlassText\n", x->x_c); + gui_vmess("gui_erase_cord_inspector", "s", + canvas_string(x->x_c)); } void magicGlass_flashText(t_magicGlass *x) @@ -155,6 +168,8 @@ void magicGlass_flashText(t_magicGlass *x) sys_vgui(".x%x.c itemconfigure magicGlassText " "-fill $pd_colors(magic_glass_text)\n", x->x_c); + gui_vmess("gui_cord_inspector_flash", "s", + canvas_string(x->x_c)); } void magicGlass_clearText(t_magicGlass *x) diff --git a/pd/src/g_mycanvas.c b/pd/src/g_mycanvas.c index c3254df71..bb1389865 100644 --- a/pd/src/g_mycanvas.c +++ b/pd/src/g_mycanvas.c @@ -33,6 +33,15 @@ void my_canvas_draw_new(t_my_canvas *x, t_glist *glist) "-tags {%lxBASE x%lx text iemgui}\n", canvas, x1, y1, x1+x->x_gui.x_w, y1+x->x_gui.x_h, x->x_gui.x_bcol, x, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol); + gui_vmess("gui_text_create_gobj", "ssii", canvas_string(canvas), + tagbuf, x1, y1); + gui_vmess("gui_create_mycanvas", "sssiiiiii", canvas_string(canvas), + tagbuf, colorbuf, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h, + x1+x->x_gui.x_w, y1+x->x_gui.x_h); } void my_canvas_draw_move(t_my_canvas *x, t_glist *glist) @@ -67,6 +76,11 @@ void my_canvas_draw_select(t_my_canvas* x, t_glist* glist) sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x, x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ? "$pd_colors(selection)" : bcol); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_mycanvas_select_color", "sss", canvas_string(canvas), + tagbuf, x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ? + "blue" : bcol); } static void my_canvas__clickhook(t_scalehandle *sh, int newstate) diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c index b120354e5..6459ba4d1 100644 --- a/pd/src/g_numbox.c +++ b/pd/src/g_numbox.c @@ -140,6 +140,11 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist) sys_vgui( ".x%lx.c itemconfigure %lxNUMBER -fill #%6.6x -text {%s}\n", glist_getcanvas(glist), x, IEM_GUI_COLOR_EDITED, cp); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_text_set", "sss", canvas_string(glist_getcanvas(glist)), + tagbuf, cp); + x->x_buf[sl] = 0; } else @@ -153,6 +158,10 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist) glist_getcanvas(glist), x, x->x_gui.x_selected == glist_getcanvas(glist) && !x->x_gui.x_change ? selection_color : fcol, x->x_buf); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_text_set", "sss", canvas_string(glist_getcanvas(glist)), + tagbuf, x->x_buf); x->x_buf[0] = 0; } } @@ -171,7 +180,10 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist) canvas, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x->x_hide_frame <= 1 ? "$pd_colors(iemgui_border)" : bcol, bcol, x, x); - + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_create_numbox", "sssiiiiiiiiiiiii", canvas_string(canvas), + tagbuf, bcol, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1, half); if (!x->x_hide_frame || x->x_hide_frame == 2) sys_vgui(".x%lx.c create polyline %d %d %d %d %d %d -stroke #%6.6x " "-tags {%lxBASE2 x%lx text iemgui}\n", @@ -182,6 +194,10 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist) "-font %s -fill #%6.6x -tags {%lxNUMBER x%lx noscroll text iemgui}\n", canvas, x1+half+2, y1+half+d, x->x_buf, iemgui_font(&x->x_gui), x->x_gui.x_fcol, x, x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol); + gui_vmess("gui_numbox_drawtext", "ssssiiii", canvas_string(canvas), tagbuf, + x->x_buf, colorbuf, x1+half+2, y1+half+d, x1, y1); } static void my_numbox_draw_move(t_my_numbox *x, t_glist *glist) diff --git a/pd/src/g_radio.c b/pd/src/g_radio.c index ca476b526..aa9fb81f2 100644 --- a/pd/src/g_radio.c +++ b/pd/src/g_radio.c @@ -32,6 +32,10 @@ void radio_draw_update(t_gobj *client, t_glist *glist) canvas, x, x->x_drawn, x->x_gui.x_bcol, x->x_gui.x_bcol); sys_vgui(".x%lx.c itemconfigure %lxBUT%d -fill #%6.6x -stroke #%6.6x\n", canvas, x, x->x_on, x->x_gui.x_fcol, x->x_gui.x_fcol); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_radio_update", "ssii", canvas_string(canvas), + tagbuf, x->x_drawn, x->x_on); x->x_drawn = x->x_on; } @@ -44,29 +48,55 @@ void radio_draw_new(t_radio *x, t_glist *glist) iemgui_base_draw_new(&x->x_gui); for(i=0; i<n; i++) if (x->x_orient) { - if (i) sys_vgui(".x%lx.c create prect %d %d %d %d " + if (i) + { + sys_vgui(".x%lx.c create prect %d %d %d %d " "-stroke $pd_colors(iemgui_border) " "-tags {%lxBASE%d %lxBASE x%lx text iemgui border}\n", canvas, x1, yi, x1+d, yi, x, i, x, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_create_radio", "ssiiiiiii", + canvas_string(canvas), tagbuf, x1, yi, x1+d, yi, i, x1, y1); + } sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x " "-stroke #%6.6x -tags {%lxBUT%d x%lx text iemgui}\n", canvas, x1+s, yi+s, x1+d-s, yi+d-s, (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, i, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol); + gui_vmess("gui_create_radio_buttons", "sssiiiiiiii", canvas_string(canvas), + tagbuf, colorbuf, x1+s, yi+s, x1+d-s, yi+d-s, x1, y1, i, x->x_on==i); yi += d; x->x_drawn = x->x_on; } else { - if (i) sys_vgui(".x%lx.c create prect %d %d %d %d " + if (i) + { + sys_vgui(".x%lx.c create prect %d %d %d %d " "-stroke $pd_colors(iemgui_border) " "-tags {%lxBASE%d %lxBASE x%lx text iemgui border}\n", canvas, xi, y1, xi, y1+d, x, i, x, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_create_radio", "ssiiiiiii", canvas_string(canvas), + tagbuf, xi, y1, xi, y1+d, i, x1, y1); + } sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x " "-stroke #%6.6x -tags {%lxBUT%d x%lx text iemgui}\n", canvas, xi+s, y1+s, xi+d-s, y1+d-s, (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol, x, i, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol); + gui_vmess("gui_create_radio_buttons", "sssiiiiiiii", canvas_string(canvas), + tagbuf, colorbuf, xi+s, y1+s, xi+d-s, yi+d-s, x1, y1, i, x->x_on==i); xi += d; x->x_drawn = x->x_on; } diff --git a/pd/src/g_readwrite.c b/pd/src/g_readwrite.c index 6d31a8a2a..5dd095180 100644 --- a/pd/src/g_readwrite.c +++ b/pd/src/g_readwrite.c @@ -776,8 +776,9 @@ static void canvas_savetofile(t_canvas *x, t_symbol *filename, t_symbol *dir) static void canvas_menusaveas(t_canvas *x) { t_canvas *x2 = canvas_getrootfor(x); - sys_vgui("pdtk_canvas_saveas .x%lx \"%s\" \"%s\"\n", x2, - x2->gl_name->s_name, canvas_getdir(x2)->s_name); + gui_vmess("gui_canvas_saveas", "sss", canvas_string(x2), x2->gl_name->s_name, canvas_getdir(x2)->s_name); +// sys_vgui("pdtk_canvas_saveas .x%lx \"%s\" \"%s\"\n", x2, +// x2->gl_name->s_name, canvas_getdir(x2)->s_name); } static void canvas_menusave(t_canvas *x) diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c index 4e7ba86b7..961e07918 100644 --- a/pd/src/g_rtext.c +++ b/pd/src/g_rtext.c @@ -330,7 +330,12 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp, // add a null character at the end of the string (for u8_charnum) tempbuf[outchars_b++] = '\0'; - pixwide = ncolumns * fontwidth + (LMARGIN + RMARGIN); + // The following is an enormous hack to get the box width to match size 12px + // DejaVu as closely as possible. A better solution would require a fuller + // understanding of the font logic here and in s_main. + //pixwide = ncolumns * fontwidth + (LMARGIN + RMARGIN); + float fudge_factor = 0.2; + pixwide = (int)(ncolumns * (fontwidth + fudge_factor) + (LMARGIN + RMARGIN)); pixhigh = nlines * fontheight + (TMARGIN + BMARGIN); //printf("outchars_b=%d bufsize=%d %d\n", outchars_b, x->x_bufsize, x->x_buf[outchars_b]); @@ -357,11 +362,20 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp, dispx + LMARGIN, dispy + TMARGIN, outchars_b, tempbuf, sys_hostfontsize(font), (glist_isselected(x->x_glist, ((t_gobj*)x->x_text)) ? "$pd_colors(selection)" : "$pd_colors(text)")); + gui_vmess("gui_text_new", "sssiffsi", + canvas_string(canvas), x->x_tag, rtext_gettype(x)->s_name, + glist_isselected(x->x_glist, ((t_gobj*)x->x_text)), + dispx + LMARGIN, + dispy + TMARGIN, + tempbuf, + sys_hostfontsize(font)); + } else if (action == SEND_UPDATE) { sys_vgui("pdtk_text_set .x%lx.c %s {%.*s}\n", canvas, x->x_tag, outchars_b, tempbuf); + gui_vmess("gui_text_set", "sss", canvas_string(canvas), x->x_tag, tempbuf); if (pixwide != x->x_drawnwidth || pixhigh != x->x_drawnheight) text_drawborder(x->x_text, x->x_glist, x->x_tag, diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c index 02d2e78b1..baebc17ae 100644 --- a/pd/src/g_scalar.c +++ b/pd/src/g_scalar.c @@ -412,45 +412,56 @@ static void scalar_getrect(t_gobj *z, t_glist *owner, void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state) { + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec); + //fprintf(stderr,"scalar_drawselecterect%d\n", state); if (state) { int x1, y1, x2, y2; - + t_float basex, basey; + scalar_getbasexy(x, &basex, &basey); + scalar_getrect(&x->sc_gobj, glist, &x1, &y1, &x2, &y2); x1--; x2++; y1--; y2++; if (glist_istoplevel(glist)) + { sys_vgui(".x%lx.c create prect %d %d %d %d " "-strokewidth 1 -stroke $pd_colors(selection) " "-tags {select%lx selected}\n", glist_getcanvas(glist), x1, y1, x2, y2, x); + gui_vmess("gui_scalar_draw_select_rect", "ssiiiiiff", + canvas_string(glist_getcanvas(glist)), tagbuf, + state, + x1, y1, x2, y2, basex, basey); + } } else { if (glist_istoplevel(glist)) sys_vgui(".x%lx.c delete select%lx\n", glist_getcanvas(glist), x); + gui_vmess("gui_scalar_draw_select_rect", "ssiiiiiii", + canvas_string(glist_getcanvas(glist)), tagbuf, + state, + 0, 0, 0, 0, 0, 0); } } -/* This is a workaround. Since scalars are contained within a tkpath - group, and since tkpath groups don't have coords, we can't just use - the same "selected" tag that is used to move all other Pd objects. That - would move scalars in their local coordinate system, which is wrong - for transformed objects. For example, if a rectangle is rotated 45 and - we try to do a [canvas move 10 0] command on it, it would get moved to - the northeast instead of to the right! +/* This is greatly simplified with Node-Webkit-- we just need to get the + basex/basey for the scalar, in addition to the bbox of the scalar. - Instead, we tag selected scalars with the "scalar_selected" tag. Then in - the GUI we use that tag to loop through and change each scalar's group - matrix, and add (dx,dy) to its current translation values. The scalar - group matrix .scalar%lx isn't accessible by the user, so it will only - ever contain these translation values. + This can be simplified further by using a single function on the GUI + side, and sending it the "state" parameter. */ void scalar_select(t_gobj *z, t_glist *owner, int state) { //fprintf(stderr,"scalar_select %d\n", state); t_scalar *x = (t_scalar *)z; + + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec); + t_template *tmpl; t_symbol *templatesym = x->sc_template; t_atom at; @@ -473,6 +484,8 @@ void scalar_select(t_gobj *z, t_glist *owner, int state) glist_getcanvas(owner), x); sys_vgui(".x%lx.c addtag scalar_selected withtag {.scalar%lx}\n", glist_getcanvas(owner), x->sc_vec); + gui_vmess("gui_text_select", "ss", + canvas_string(glist_getcanvas(owner)), tagbuf); } else { @@ -481,6 +494,8 @@ void scalar_select(t_gobj *z, t_glist *owner, int state) glist_getcanvas(owner), x); sys_vgui(".x%lx.c dtag .scalar%lx scalar_selected\n", glist_getcanvas(owner), x->sc_vec); + gui_vmess("gui_text_deselect", "ss", + canvas_string(glist_getcanvas(owner)), tagbuf); } //sys_vgui("pdtk_select_all_gop_widgets .x%lx %lx %d\n", // glist_getcanvas(owner), owner, state); @@ -617,6 +632,112 @@ static void scalar_delete(t_gobj *z, t_glist *glist) extern void svg_grouptogui(t_glist *g, t_template *template, t_word *data); +extern void svg_parentwidgettogui(t_gobj *z, t_glist *owner, t_word *data, + t_template *template); + +static void scalar_group_configure(t_scalar *x, t_glist *owner, + t_template *template, t_glist *gl, t_glist *parent) +{ + t_gobj *y; + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "dgroup%lx.%lx", (long unsigned int)gl, + (long unsigned int)x->sc_vec); + char parentbuf[MAXPDSTRING]; + sprintf(parentbuf, "dgroup%lx.%lx", (long unsigned int)parent, + (long unsigned int)x->sc_vec); + gui_start_vmess("gui_draw_configure_all", "ss", + canvas_string(glist_getcanvas(owner)), tagbuf); + svg_grouptogui(gl, template, x->sc_vec); + gui_end_vmess(); + for (y = gl->gl_list; y; y = y->g_next) + { + if (pd_class(&y->g_pd) == canvas_class && + ((t_glist *)y)->gl_svg) + { + scalar_group_configure(x, owner, template, (t_glist *)y, gl); + } + t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd); + if (!wb) continue; + //(*wb->w_parentvisfn)(y, owner, gl, x, x->sc_vec, template, + // 0, 0, vis); + svg_parentwidgettogui(y, owner, x->sc_vec, template); + } +} + +void scalar_configure(t_scalar *x, t_glist *owner) +{ + int vis = glist_isvisible(owner); + if (vis) + { + //fprintf(stderr,"scalar_vis %d %lx\n", vis, (t_int)z); + x->sc_bboxcache = 0; + + t_template *template = template_findbyname(x->sc_template); + t_canvas *templatecanvas = template_findcanvas(template); + t_gobj *y; + t_float basex, basey; + scalar_getbasexy(x, &basex, &basey); + /* if we don't know how to draw it, make a small rectangle */ + + t_float xscale = glist_xtopixels(owner, 1) - glist_xtopixels(owner, 0); + t_float yscale = glist_ytopixels(owner, 1) - glist_ytopixels(owner, 0); + + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec); + gui_vmess("gui_scalar_configure_gobj", "ssiffffii", + canvas_string(glist_getcanvas(owner)), + tagbuf, + glist_isselected(owner, &x->sc_gobj), + xscale, 0.0, 0.0, yscale, + (int)glist_xtopixels(owner, basex), + (int)glist_ytopixels(owner, basey)); + + char groupbuf[MAXPDSTRING]; + // Quick hack to make gui_create_scalar_group more general (so we + // don't have to tack on "gobj" manually) + + + //Not sure if we need this here... + //sprintf(tagbuf, "scalar%lxgobj", (long unsigned int)x->sc_vec); + //sprintf(groupbuf, "dgroup%lx.%lx", (long unsigned int)templatecanvas, + // (long unsigned int)x->sc_vec); + //gui_vmess("gui_create_scalar_group", "sss", + // canvas_string(glist_getcanvas(owner)), groupbuf, tagbuf); + //sys_vgui("pdtk_bind_scalar_mouseover " + // ".x%lx.c .x%lx.x%lx.template%lx {.x%lx}\n", + // glist_getcanvas(owner), glist_getcanvas(owner), + // owner, x->sc_vec, x); + + for (y = templatecanvas->gl_list; y; y = y->g_next) + { + t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd); + if (!wb) + { + /* check subpatches for more drawing commands. + (Optimized to only search [group] subpatches) */ + if (pd_class(&y->g_pd) == canvas_class && + ((t_glist *)y)->gl_svg) + { + scalar_group_configure(x, owner, template, + (t_glist *)y, templatecanvas); + } + continue; + } + //(*wb->w_parentvisfn)(y, owner, 0, x, x->sc_vec, template, + // basex, basey, vis); + svg_parentwidgettogui(y, owner, x->sc_vec, template); + } + if (glist_isselected(owner, &x->sc_gobj)) + { + // we removed this because it caused infinite recursion + // in the scalar-help.pd example + //scalar_select(z, owner, 1); + scalar_drawselectrect(x, owner, 0); + scalar_drawselectrect(x, owner, 1); + } + } +} + static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template, t_glist *gl, t_glist *parent, int vis) { @@ -627,8 +748,17 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template, "-parent {.dgroup%lx.%lx}\\\n", glist_getcanvas(owner), gl, x->sc_vec, parent, x->sc_vec); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "dgroup%lx.%lx", (long unsigned int)gl, + (long unsigned int)x->sc_vec); + char parentbuf[MAXPDSTRING]; + sprintf(parentbuf, "dgroup%lx.%lx", (long unsigned int)parent, + (long unsigned int)x->sc_vec); + gui_start_vmess("gui_create_scalar_group", "sss", + canvas_string(glist_getcanvas(owner)), tagbuf, parentbuf); svg_grouptogui(gl, template, x->sc_vec); - sys_gui("\n"); + gui_end_vmess(); + //sys_gui("\n"); } for (y = gl->gl_list; y; y = y->g_next) @@ -727,9 +857,26 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis) xscale, 0.0, 0.0, yscale, (int)glist_xtopixels(owner, basex), (int)glist_ytopixels(owner, basey) ); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec); + gui_vmess("gui_create_scalar", "ssiffffii", + canvas_string(glist_getcanvas(owner)), + tagbuf, + glist_isselected(owner, &x->sc_gobj), + xscale, 0.0, 0.0, yscale, + (int)glist_xtopixels(owner, basex), + (int)glist_ytopixels(owner, basey)); sys_vgui(".x%lx.c create group -tags {.dgroup%lx.%lx} " "-parent {.scalar%lx}\n", glist_getcanvas(owner), templatecanvas, x->sc_vec, x->sc_vec); + char groupbuf[MAXPDSTRING]; + // Quick hack to make gui_create_scalar_group more general (so we + // don't have to tack on "gobj" manually) + sprintf(tagbuf, "scalar%lxgobj", (long unsigned int)x->sc_vec); + sprintf(groupbuf, "dgroup%lx.%lx", (long unsigned int)templatecanvas, + (long unsigned int)x->sc_vec); + gui_vmess("gui_create_scalar_group", "sss", + canvas_string(glist_getcanvas(owner)), groupbuf, tagbuf); sys_vgui("pdtk_bind_scalar_mouseover " ".x%lx.c .x%lx.x%lx.template%lx {.x%lx}\n", glist_getcanvas(owner), glist_getcanvas(owner), @@ -742,8 +889,8 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis) t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd); if (!wb) { - /* check subpatches for more drawing commands. This - can be optimized to only search [group] subpatches */ + /* check subpatches for more drawing commands. + (Optimized to only search [group] subpatches) */ if (pd_class(&y->g_pd) == canvas_class && ((t_glist *)y)->gl_svg) { @@ -756,8 +903,14 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis) basex, basey, vis); } if (!vis) + { sys_vgui(".x%lx.c delete .scalar%lx\n", glist_getcanvas(owner), x->sc_vec); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec); + gui_vmess("gui_scalar_erase", "ss", + canvas_string(glist_getcanvas(owner)), tagbuf); + } sys_unqueuegui(x); if (glist_isselected(owner, &x->sc_gobj)) diff --git a/pd/src/g_slider.c b/pd/src/g_slider.c index 08fc5c511..1be19a1e2 100644 --- a/pd/src/g_slider.c +++ b/pd/src/g_slider.c @@ -33,10 +33,20 @@ static void slider_draw_update(t_gobj *client, t_glist *glist) r=y2-3 - (x->x_val+50)/100; sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n", canvas, x, x1+2, r, x2-2, r); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_slider_update", "ssiiiiii", + canvas_string(canvas), tagbuf, x1+2, r, x2-2, r, + x1, y1); } else { r=x1+3 + (x->x_val+50)/100; sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n", canvas, x, r, y1+2, r, y2-2); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_slider_update", "ssiiiiii", + canvas_string(canvas), tagbuf, r, y1+2, r, y2-2, + x1, y1); } int t = x->x_thick; x->x_thick = x->x_val == x->x_center; @@ -59,10 +69,22 @@ static void slider_draw_new(t_slider *x, t_glist *glist) sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 " "-stroke #%6.6x -tags {%lxKNOB x%lx text iemgui}\n", canvas, x1+2, r, x2-2, r, x->x_gui.x_fcol, x, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol); + gui_vmess("gui_create_slider", "sssiiiiii", canvas_string(canvas), tagbuf, + colorbuf, x1+2, r, x2-2, r, x1, y1); } else { sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 " "-stroke #%6.6x -tags {%lxKNOB x%lx text iemgui}\n", canvas, r, y1+2, r, y2-2, x->x_gui.x_fcol, x, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol); + gui_vmess("gui_create_slider", "sssiiiiii", canvas_string(canvas), tagbuf, + colorbuf, r, y1+2, r, y2-2, x1, y1); } } diff --git a/pd/src/g_template.c b/pd/src/g_template.c index 08fba1d1e..32c415f50 100644 --- a/pd/src/g_template.c +++ b/pd/src/g_template.c @@ -1472,13 +1472,13 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s, if (x->x_type == gensym("group")) { sprintf(tag, "%s%lx.%lx", - (in_array ? ".scelem" : ".dgroup"), + (in_array ? "scelem" : "dgroup"), (long unsigned int)x->x_parent, (long unsigned int)data); } else { - sprintf(tag, ".draw%lx.%lx", + sprintf(tag, "draw%lx.%lx", (long unsigned int)x->x_parent, (long unsigned int)data); } @@ -1499,8 +1499,10 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s, } else fill = &s_; - sys_vgui(".x%lx.c itemconfigure %s -fill %s\n", - glist_getcanvas(c), tag, fill->s_name); + //sys_vgui(".x%lx.c itemconfigure %s -fill %s\n", + // glist_getcanvas(c), tag, fill->s_name); + gui_vmess("gui_draw_configure", "ssss", + canvas_string(glist_getcanvas(c)), tag, s->s_name, fill->s_name); } else if (s == gensym("stroke")) { @@ -1516,79 +1518,120 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s, (int)fielddesc_getfloat(fd+2, template, data, 1))); } else stroke = &s_; - sys_vgui(".x%lx.c itemconfigure %s -stroke %s\n", - glist_getcanvas(c), tag, stroke->s_name); + //sys_vgui(".x%lx.c itemconfigure %s -stroke %s\n", + // glist_getcanvas(c), tag, stroke->s_name); + gui_vmess("gui_draw_configure", "ssss", + canvas_string(glist_getcanvas(c)), tag, s->s_name, stroke->s_name); } else if (s == gensym("fill-opacity")) - sys_vgui(".x%lx.c itemconfigure %s -fillopacity %g\n", - glist_getcanvas(c), tag, + //sys_vgui(".x%lx.c itemconfigure %s -fillopacity %g\n", + // glist_getcanvas(c), tag, + // fielddesc_getcoord(&x->x_fillopacity.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_string(glist_getcanvas(c)), tag, "fill-opacity", fielddesc_getcoord(&x->x_fillopacity.a_attr, template, data, 1)); else if (s == gensym("fill-rule")) - sys_vgui(".x%lx.c itemconfigure %s -fillrule %s\n", - glist_getcanvas(c), tag, (int)fielddesc_getcoord( + //sys_vgui(".x%lx.c itemconfigure %s -fillrule %s\n", + // glist_getcanvas(c), tag, (int)fielddesc_getcoord( + // &x->x_fillrule.a_attr, template, data, 1) ? + // "evenodd" : "nonzero"); + gui_vmess("gui_draw_configure", "sssi", + canvas_string(glist_getcanvas(c)), tag, "fill-rule", (int)fielddesc_getcoord( &x->x_fillrule.a_attr, template, data, 1) ? "evenodd" : "nonzero"); else if (s == gensym("pointer-events")) *predraw_bbox = 1; else if (s == gensym("stroke-linecap")) - sys_vgui(".x%lx.c itemconfigure %s -strokelinecap %s\n", - glist_getcanvas(c), tag, get_strokelinecap( + //sys_vgui(".x%lx.c itemconfigure %s -strokelinecap %s\n", + // glist_getcanvas(c), tag, get_strokelinecap( + // (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, + // template, data, 1))); + gui_vmess("gui_draw_configure", "ssss", + canvas_string(glist_getcanvas(c)), tag, "stroke-linecap", get_strokelinecap( (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, template, data, 1))); else if (s == gensym("stroke-linejoin")) - sys_vgui(".x%lx.c itemconfigure %s -strokelinejoin %s\n", - glist_getcanvas(c), tag, get_strokelinejoin( + //sys_vgui(".x%lx.c itemconfigure %s -strokelinejoin %s\n", + // glist_getcanvas(c), tag, get_strokelinejoin( + // (int)fielddesc_getcoord(&x->x_strokelinejoin.a_attr, + // template, data, 1))); + gui_vmess("gui_draw_configure", "ssss", + canvas_string(glist_getcanvas(c)), tag, "stroke-linejoin", get_strokelinejoin( (int)fielddesc_getcoord(&x->x_strokelinejoin.a_attr, template, data, 1))); else if (s == gensym("stroke-miterlimit")) - sys_vgui(".x%lx.c itemconfigure %s -strokemiterlimit %g\n", - glist_getcanvas(c), tag, fielddesc_getcoord( + //sys_vgui(".x%lx.c itemconfigure %s -strokemiterlimit %g\n", + // glist_getcanvas(c), tag, fielddesc_getcoord( + // &x->x_strokemiterlimit.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_string(glist_getcanvas(c)), tag, "stroke-miterlimit", fielddesc_getcoord( &x->x_strokemiterlimit.a_attr, template, data, 1)); else if (s == gensym("stroke-opacity")) - sys_vgui(".x%lx.c itemconfigure %s -strokeopacity %g\n", - glist_getcanvas(c), tag, fielddesc_getcoord( + //sys_vgui(".x%lx.c itemconfigure %s -strokeopacity %g\n", + // glist_getcanvas(c), tag, fielddesc_getcoord( + // &x->x_strokeopacity.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssg", + canvas_string(glist_getcanvas(c)), tag, "stroke-opacity", fielddesc_getcoord( &x->x_strokeopacity.a_attr, template, data, 1)); else if (s == gensym("stroke-width")) { - sys_vgui(".x%lx.c itemconfigure %s -strokewidth %g\n", - glist_getcanvas(c), tag, fielddesc_getcoord( + //sys_vgui(".x%lx.c itemconfigure %s -strokewidth %g\n", + // glist_getcanvas(c), tag, fielddesc_getcoord( + // &x->x_strokewidth.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_string(glist_getcanvas(c)), tag, "stroke-width", fielddesc_getcoord( &x->x_strokewidth.a_attr, template, data, 1)); *predraw_bbox = 1; } else if (s == gensym("r")) { - sys_vgui(".x%lx.c itemconfigure %s -rx %g -ry %g\n", - glist_getcanvas(c), tag, - fielddesc_getcoord(x->x_vec+2, template, data, 1), - fielddesc_getcoord(x->x_vec+2, template, data, 1)); + //sys_vgui(".x%lx.c itemconfigure %s -rx %g -ry %g\n", + //glist_getcanvas(c), tag, + //fielddesc_getcoord(x->x_vec+2, template, data, 1), + //fielddesc_getcoord(x->x_vec+2, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_string(glist_getcanvas(c)), tag, s->s_name, + fielddesc_getcoord(x->x_vec+2, template, data, 1)); *predraw_bbox = 1; } else if (s == gensym("rx")) { if (x->x_type == gensym("rect")) - sys_vgui(".x%lx.c itemconfigure %s -rx %d\n", - glist_getcanvas(c), tag, (int)fielddesc_getcoord( + //sys_vgui(".x%lx.c itemconfigure %s -rx %d\n", + // glist_getcanvas(c), tag, (int)fielddesc_getcoord( + // &x->x_rx.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssi", + canvas_string(glist_getcanvas(c)), tag, s->s_name, (int)fielddesc_getcoord( &x->x_rx.a_attr, template, data, 1)); else { - sys_vgui(".x%lx.c itemconfigure %s -rx %g\n", - glist_getcanvas(c), tag, fielddesc_getcoord( - x->x_vec+2, template, data, 1)); + //sys_vgui(".x%lx.c itemconfigure %s -rx %g\n", + // glist_getcanvas(c), tag, fielddesc_getcoord( + // x->x_vec+2, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_string(glist_getcanvas(c)), tag, s->s_name, fielddesc_getcoord( + x->x_vec+2, template, data, 1)); *predraw_bbox = 1; } } else if (s == gensym("ry")) { if (x->x_type == gensym("rect")) - sys_vgui(".x%lx.c itemconfigure %s -ry %d\n", - glist_getcanvas(c), tag, (int)fielddesc_getcoord( - &x->x_ry.a_attr, template, data, 1)); + //sys_vgui(".x%lx.c itemconfigure %s -ry %d\n", + // glist_getcanvas(c), tag, (int)fielddesc_getcoord( + // &x->x_ry.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssi", + canvas_string(glist_getcanvas(c)), tag, s->s_name, (int)fielddesc_getcoord( + &x->x_ry.a_attr, template, data, 1)); else { - sys_vgui(".x%lx.c itemconfigure %s -ry %g\n", - glist_getcanvas(c), tag, fielddesc_getcoord( - x->x_vec+3, template, data, 1)); - *predraw_bbox = 1; + //sys_vgui(".x%lx.c itemconfigure %s -ry %g\n", + // glist_getcanvas(c), tag, fielddesc_getcoord( + // x->x_vec+3, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_string(glist_getcanvas(c)), tag, fielddesc_getcoord( + x->x_vec+3, template, data, 1)); + *predraw_bbox = 1; } } else if (s == gensym("transform")) @@ -1607,39 +1650,57 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s, x->x_pathrect_cache = 0; } svg_parsetransform(x, template, data, &m1, &m2, &m3, &m4, &m5, &m6); - sys_vgui(".x%lx.c itemconfigure %s -matrix " - "{ {%g %g} {%g %g} {%g %g} }\n", - glist_getcanvas(c), tag, - m1, m2, m3, m4, m5, m6); + //sys_vgui(".x%lx.c itemconfigure %s -matrix " + // "{ {%g %g} {%g %g} {%g %g} }\n", + // glist_getcanvas(c), tag, + // m1, m2, m3, m4, m5, m6); + char mbuf[MAXPDSTRING]; + sprintf(mbuf, "matrix(%g %g %g %g %g %g)", m1, m2, m3, m4, m5, m6); + gui_vmess("gui_draw_configure", "ssss", + canvas_string(glist_getcanvas(c)), tag, s->s_name, + mbuf); *predraw_bbox = 1; - } else if (s == gensym("vis")) { - sys_vgui(".x%lx.c itemconfigure %s -state %s\n", - glist_getcanvas(c), tag, (int)fielddesc_getcoord( - &x->x_vis.a_attr, template, data, 1) ? "normal" : "hidden"); + //sys_vgui(".x%lx.c itemconfigure %s -state %s\n", + // glist_getcanvas(c), tag, (int)fielddesc_getcoord( + // &x->x_vis.a_attr, template, data, 1) ? "normal" : "hidden"); + gui_vmess("gui_draw_configure", "ssss", + canvas_string(glist_getcanvas(c)), tag, "visibility", (int)fielddesc_getcoord( + &x->x_vis.a_attr, template, data, 1) ? "visible" : "hidden"); *predraw_bbox = 1; } else if (s == gensym("stroke-dasharray")) { + // not ready yet... need a gui interface for variable size attrs if (x->x_ndash) { t_fielddesc *fd = x->x_strokedasharray; int i; - sys_vgui(".x%lx.c itemconfigure %s -strokedasharray {", - glist_getcanvas(c), tag); + //sys_vgui(".x%lx.c itemconfigure %s -strokedasharray {", + // glist_getcanvas(c), tag); + gui_start_vmess("gui_draw_configure", "sss", + canvas_string(glist_getcanvas(c)), tag, s->s_name); + gui_start_array(); for (i = 0; i < x->x_ndash; i++) { - sys_vgui(" %g ", fielddesc_getcoord(fd+i, template, data, 1)); + //sys_vgui(" %g ", fielddesc_getcoord(fd+i, template, data, 1)); + gui_float_elem(fielddesc_getcoord(fd+i, template, data, 1)); } - sys_gui("}\n"); + //sys_gui("}\n"); + gui_end_array(); + gui_end_vmess(); } } else if (s == gensym("data")) { - sys_vgui(".x%lx.c coords .draw%lx.%lx {\\\n", - glist_getcanvas(c), parent, data); + //sys_vgui(".x%lx.c coords .draw%lx.%lx {\\\n", + // glist_getcanvas(c), parent, data); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)parent, (long unsigned int)data); + gui_start_vmess("gui_draw_configure", "sss", + canvas_string(glist_getcanvas(c)), tagbuf, "d"); /* let's turn off bbox caching so we can recalculate the bbox */ if (x->x_pathrect_cache != -1) x->x_pathrect_cache = 0; @@ -1648,19 +1709,28 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s, char *cmd; t_fielddesc *f; int totalpoints = 0; /* running tally */ + /* start an array parameter */ + char cmdbuf[2]; + gui_start_array(); /* path parser: no error checking yet */ for (i = 0, cmd = x->x_pathcmds; i < x->x_npathcmds; i++, cmd++) { int j; int cargs = x->x_nargs_per_cmd[i]; f = (x->x_vec)+totalpoints; - sys_vgui("%c\\\n", *(cmd)); + //sys_vgui("%c\\\n", *(cmd)); + sprintf(cmdbuf, "%c", *(cmd)); + gui_string_elem(cmdbuf); for (j = 0; j < x->x_nargs_per_cmd[i]; j++) - sys_vgui("%g\\\n", fielddesc_getcoord( - f+j, template, data, 1)); + //sys_vgui("%g\\\n", fielddesc_getcoord( + // f+j, template, data, 1)); + gui_float_elem(fielddesc_getcoord( + f+j, template, data, 0)); totalpoints += x->x_nargs_per_cmd[i]; } - sys_gui("}\n"); + //sys_gui("}\n"); + gui_end_array(); + gui_end_vmess(); } else if (s == gensym("index")) { @@ -2421,16 +2491,16 @@ void svg_parsetransform(t_svg *x, t_template *template, t_word *data, } else if (type == gensym("skewx")) { - t_float a = fielddesc_getfloat(fd++, template, data, 0) * - 3.14159 / 180; + t_float a = fielddesc_getfloat(fd++, template, data, 0); // * + // 3.14159 / 180; argc--; mset(m2, 1, 0, tan(a), 1, 0, 0); mmult(m, m2, m); } else if (type == gensym("skewy")) { - t_float a = fielddesc_getfloat(fd++, template, data, 0) * - 3.14159 / 180; + t_float a = fielddesc_getfloat(fd++, template, data, 0); // * + // 3.14159 / 180; argc--; mset(m2, 1, tan(a), 0, 1, 0, 0); mmult(m, m2, m); @@ -3429,6 +3499,10 @@ static void draw_activate(t_gobj *z, t_glist *glist, static void svg_togui(t_svg *x, t_template *template, t_word *data) { + // Hack to send parameter as an object to the GUI. Not sure yet if + // we want to generalize that... + //sys_gui(",{ "); + gui_start_array(); if (x->x_type != gensym("line")) { if (x->x_filltype) @@ -3437,24 +3511,60 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) if (x->x_filltype == 1) { t_symbol *f = fielddesc_getsymbol(fd, template, data, 1); - sys_vgui("-fill %s ", f->s_name); + //sys_vgui("-fill %s ", f->s_name); + //sys_vgui("fill: '%s',", f->s_name); + gui_string_elem("fill"); + gui_string_elem(f->s_name); } else if (x->x_filltype == 2) - sys_vgui("-fill %s ", rgb_to_hex( + { + //sys_vgui("-fill %s ", rgb_to_hex( + // (int)fielddesc_getfloat(fd, + // template, data, 1), + // (int)fielddesc_getfloat(fd+1, + // template, data, 1), + // (int)fielddesc_getfloat(fd+2, + // template, data, 1))); + + //sys_vgui("fill: '%s',", rgb_to_hex( + // (int)fielddesc_getfloat(fd, + // template, data, 1), + // (int)fielddesc_getfloat(fd+1, + // template, data, 1), + // (int)fielddesc_getfloat(fd+2, + // template, data, 1))); + gui_string_elem("fill"); + gui_string_elem(rgb_to_hex( (int)fielddesc_getfloat(fd, template, data, 1), (int)fielddesc_getfloat(fd+1, template, data, 1), (int)fielddesc_getfloat(fd+2, template, data, 1))); + } } if (x->x_fillopacity.a_flag) - sys_vgui("-fillopacity %g ", - fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); + { + //sys_vgui("-fillopacity %g ", + // fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); + //sys_vgui("fill-opacity: %g,", + // fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); + gui_string_elem("fill-opacity"); + gui_float_elem(fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); + } if (x->x_fillrule.a_flag) - sys_vgui("-fillrule %s ", (int)fielddesc_getfloat( + { + //sys_vgui("-fillrule %s ", (int)fielddesc_getfloat( + // &x->x_fillrule.a_attr, template, data, 1) ? + // "evenodd" : "nonzero"); + //sys_vgui("'fill-rule': '%s',", (int)fielddesc_getfloat( + // &x->x_fillrule.a_attr, template, data, 1) ? + // "evenodd" : "nonzero"); + gui_string_elem("fill-rule"); + gui_string_elem((int)fielddesc_getfloat( &x->x_fillrule.a_attr, template, data, 1) ? "evenodd" : "nonzero"); + } } if (x->x_stroketype) { @@ -3462,46 +3572,124 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) if (x->x_stroketype == 1) { t_symbol *s = fielddesc_getsymbol(fd, template, data, 1); - sys_vgui("-stroke %s ", s->s_name); + //sys_vgui("-stroke %s ", s->s_name); + //sys_vgui("stroke: '%s',", s->s_name); + gui_string_elem("stroke"); + gui_string_elem(s->s_name); } else if (x->x_stroketype == 2) - sys_vgui("-stroke %s ", rgb_to_hex( + { + //sys_vgui("-stroke %s ", rgb_to_hex( + // (int)fielddesc_getfloat(fd, + // template, data, 1), + // (int)fielddesc_getfloat(fd+1, + // template, data, 1), + // (int)fielddesc_getfloat(fd+2, + // template, data, 1))); + //sys_vgui("stroke: '%s',", rgb_to_hex( + // (int)fielddesc_getfloat(fd, + // template, data, 1), + // (int)fielddesc_getfloat(fd+1, + // template, data, 1), + // (int)fielddesc_getfloat(fd+2, + // template, data, 1))); + + gui_string_elem("stroke"); + gui_string_elem(rgb_to_hex( (int)fielddesc_getfloat(fd, template, data, 1), (int)fielddesc_getfloat(fd+1, template, data, 1), (int)fielddesc_getfloat(fd+2, template, data, 1))); + } } if (x->x_strokewidth.a_flag) - sys_vgui("-strokewidth %g\\\n", - fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); + { + //sys_vgui("-strokewidth %g\\\n", + // fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); + //sys_vgui("stroke-width: %g,", + // fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); + gui_string_elem("stroke-width"); + gui_float_elem(fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); + } + if (x->x_type == gensym("circle")) + { + if (x->x_nargs > 0) + { + gui_string_elem("cx"); + gui_float_elem(fielddesc_getfloat(&x->x_vec[0], template, data, 1)); + } + } if (x->x_strokeopacity.a_flag) - sys_vgui("-strokeopacity %g ", - fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); + { + //sys_vgui("-strokeopacity %g ", + // fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); + //sys_vgui("'stroke-opacity': %g,", + // fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); + + gui_string_elem("stroke-opacity"); + gui_float_elem(fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); + } if (x->x_strokelinecap.a_flag) - sys_vgui("-strokelinecap %s ", get_strokelinecap( + { + //sys_vgui("-strokelinecap %s ", get_strokelinecap( + // (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, + // template, data, 1))); + //sys_vgui("'stroke-linecap': '%s',", get_strokelinecap( + // (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, + // template, data, 1))); + + gui_string_elem("stroke-linecap"); + gui_string_elem(get_strokelinecap( (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, template, data, 1))); + } if (x->x_strokelinejoin.a_flag) - sys_vgui("-strokelinejoin %s ", get_strokelinejoin( + { + //sys_vgui("-strokelinejoin %s ", get_strokelinejoin( + // (int)fielddesc_getfloat(&x->x_strokelinejoin.a_attr, + //template, data, 1))); + //sys_vgui("'stroke-linejoin': '%s',", get_strokelinejoin( + // (int)fielddesc_getfloat(&x->x_strokelinejoin.a_attr, + //template, data, 1))); + + gui_string_elem("stroke-linejoin"); + gui_string_elem(get_strokelinejoin( (int)fielddesc_getfloat(&x->x_strokelinejoin.a_attr, template, data, 1))); + } if (x->x_strokemiterlimit.a_flag) - sys_vgui("-strokemiterlimit %g ", - fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, + { + //sys_vgui("-strokemiterlimit %g ", + // fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, + // template, data, 1)); + //sys_vgui("'stroke-miterlimit': %g,", + // fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, + // template, data, 1)); + gui_string_elem("stroke-miterlimit"); + gui_float_elem(fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, template, data, 1)); + } if (x->x_ndash) { int i; t_fielddesc *fd; - sys_gui(" -strokedasharray {\\\n"); + // inner array... + //sys_gui(" -strokedasharray {\\\n"); + //sys_gui("'stroke-dasharray': \""); + gui_string_elem("stroke-dasharray"); + gui_start_array(); for (i = 0, fd = x->x_strokedasharray; i < x->x_ndash; i++) { - sys_vgui("%d\\\n", (int)fielddesc_getfloat(fd+i, + // Should this be a float? + //sys_vgui("%d ", (int)fielddesc_getfloat(fd+i, + //template, data, 1)); + gui_int_elem((int)fielddesc_getfloat(fd+i, template, data, 1)); } - sys_gui("}\\\n"); + //sys_gui("\","); + gui_end_array(); } if (x->x_transform_n > 0) { @@ -3509,24 +3697,48 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) t_float m1, m2, m3, m4, m5, m6; svg_parsetransform(x, template, data, &m1, &m2, &m3, &m4, &m5, &m6); - sys_vgui("-matrix { {%g %g} {%g %g} {%g %g} }\\\n", + //sys_vgui("-matrix { {%g %g} {%g %g} {%g %g} }\\\n", + // m1, m2, m3, m4, m5, m6); + gui_string_elem("transform"); + char transbuf[MAXPDSTRING]; + sprintf(transbuf, "matrix(%g,%g,%g,%g,%g,%g)", m1, m2, m3, m4, m5, m6); + gui_string_elem(transbuf); } if (x->x_vis.a_flag) { - sys_vgui("-state %s ", fielddesc_getfloat(&x->x_vis.a_attr, - template, data, 1) ? "normal" : "hidden"); + //sys_vgui("-state %s ", fielddesc_getfloat(&x->x_vis.a_attr, + // template, data, 1) ? "normal" : "hidden"); + //sys_vgui("visibility: '%s',", fielddesc_getfloat(&x->x_vis.a_attr, + // template, data, 1) ? "visible" : "hidden"); + gui_string_elem("visibility"); + gui_string_elem(fielddesc_getfloat(&x->x_vis.a_attr, + template, data, 1) ? "visible" : "hidden"); } if (x->x_rx.a_flag) { - sys_vgui("-rx %d ", (int)fielddesc_getfloat(&x->x_rx.a_attr, + //sys_vgui("-rx %d ", (int)fielddesc_getfloat(&x->x_rx.a_attr, + // template, data, 1)); + //sys_vgui("rx: %d,", (int)fielddesc_getfloat(&x->x_rx.a_attr, + // template, data, 1)); + gui_string_elem("rx"); + gui_int_elem((int)fielddesc_getfloat(&x->x_rx.a_attr, template, data, 1)); } if (x->x_ry.a_flag) { - sys_vgui("-ry %d ", (int)fielddesc_getfloat(&x->x_ry.a_attr, + //sys_vgui("-ry %d ", (int)fielddesc_getfloat(&x->x_ry.a_attr, + // template, data, 1)); + //sys_vgui("ry: %d,", (int)fielddesc_getfloat(&x->x_ry.a_attr, + // template, data, 1)); + gui_string_elem("ry"); + gui_float_elem((int)fielddesc_getfloat(&x->x_ry.a_attr, template, data, 1)); } + gui_string_elem("display"); + gui_string_elem("inline"); + //sys_gui("display: 'inline'},"); + gui_end_array(); } void svg_grouptogui(t_glist *g, t_template *template, t_word *data) @@ -3535,6 +3747,23 @@ void svg_grouptogui(t_glist *g, t_template *template, t_word *data) svg_togui(x, template, data); } +void svg_parentwidgettogui(t_gobj *z, t_glist *owner, t_word *data, + t_template *template) +{ + if (pd_class(&z->g_pd) == draw_class) + { + t_draw *x = (t_draw *)z; + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x, + (long unsigned int)data); + gui_start_vmess("gui_draw_configure_all", "ss", + canvas_string(glist_getcanvas(owner)), tagbuf); + svg_togui((t_svg *)x->x_attr, template, data); + gui_end_vmess(); + } +} + + static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, t_scalar *sc, t_word *data, t_template *template, t_float basex, t_float basey, int vis) @@ -3608,6 +3837,15 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, sys_vgui(".x%lx.c create path {\\\n", glist_getcanvas(glist)); else if (sa->x_type == gensym("circle")) sys_vgui(".x%lx.c create ellipse\\\n", glist_getcanvas(glist)); + + /* cheap hack... there should instead be a gui_vmess style function + for incrementally building a message to the GUI (possibly with atom + arrays) */ + //sys_vgui("nn gui_draw_vis \".x%lx\",\"%s\",\"", glist_getcanvas(glist), + // sa->x_type->s_name); + gui_start_vmess("gui_draw_vis", "ss", canvas_string(glist_getcanvas(glist)), + sa->x_type->s_name); + /* next send the gui drawing arguments: commands and points for paths, points for everything else */ if (sa->x_type == gensym("path")) @@ -3616,75 +3854,142 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, the bbox */ if (sa->x_pathrect_cache != -1) sa->x_pathrect_cache = 0; - char *cmd; + char *cmd, cmdbuf[2]; int totalpoints = 0; /* running tally */ + gui_start_array(); /* path parser: no error checking yet */ for (i = 0, cmd = sa->x_pathcmds; i < sa->x_npathcmds; i++, cmd++) { int j; int cargs = sa->x_nargs_per_cmd[i]; f = (sa->x_vec)+totalpoints; - sys_vgui("%c\\\n", *(cmd)); + //sys_vgui("%c\\\n", *(cmd)); + //sys_vgui("%c ", *(cmd)); + sprintf(cmdbuf, "%c", *(cmd)); + gui_string_elem(cmdbuf); for (j = 0; j < sa->x_nargs_per_cmd[i]; j++) - sys_vgui("%g\\\n", fielddesc_getcoord( - f+j, template, data, 1)); + //sys_vgui("%g\\\n", fielddesc_getcoord( + // f+j, template, data, 1)); + //sys_vgui("%g ", fielddesc_getcoord(f+j, template, data, 1)); + gui_float_elem(fielddesc_getcoord(f+j, template, data, 0)); totalpoints += sa->x_nargs_per_cmd[i]; } - sys_gui("}\\\n"); + //sys_gui("}\\\n"); + //sys_gui("\","); + gui_end_array(); } else /* all other shapes */ { + gui_start_array(); int nxy = n >> 1; for (i = 0; i < nxy; i++) { - sys_vgui("%g %g\\\n", pix[2*i], pix[2*i+1]); + //sys_vgui("%g %g\\\n", pix[2*i], pix[2*i+1]); + //sys_vgui("%g %g ", pix[2*i], pix[2*i+1]); + gui_float_elem(pix[2*i]); + gui_float_elem(pix[2*i+1]); if ((sa->x_type == gensym("ellipse") || sa->x_type == gensym("circle")) && n > 1) { - sys_vgui("-rx %d -ry %d\\\n", - (int)(fielddesc_getcoord(sa->x_vec+2, - template, data, 1)), - (int)(fielddesc_getcoord(sa->x_vec + + //sys_vgui("-rx %d -ry %d\\\n", + // (int)(fielddesc_getcoord(sa->x_vec+2, + // template, data, 1)), + // (int)(fielddesc_getcoord(sa->x_vec + + // (sa->x_type == gensym("ellipse")? + // 3 : 2), + // template, data, 1))); + // These should be floats... + //sys_vgui("%d %d ", + // (int)(fielddesc_getcoord(sa->x_vec+2, + // template, data, 1)), + // (int)(fielddesc_getcoord(sa->x_vec + + // (sa->x_type == gensym("ellipse")? + // 3 : 2), + // template, data, 1))); + + gui_float_elem(fielddesc_getcoord(sa->x_vec+2, + template, data, 0)); + gui_float_elem(fielddesc_getcoord(sa->x_vec + (sa->x_type == gensym("ellipse")? 3 : 2), - template, data, 1))); + template, data, 1)); break; } else if (sa->x_type == gensym("rect") && n > 1) { - sys_vgui("%g %g\\\n", - fielddesc_getcoord(sa->x_vec, - template, data, 1) + - fielddesc_getcoord(sa->x_vec+2, - template, data, 1), - fielddesc_getcoord(sa->x_vec+1, - template, data, 1) + - fielddesc_getcoord(sa->x_vec+3, - template, data, 1)); + //sys_vgui("%g %g\\\n", + // fielddesc_getcoord(sa->x_vec, + // template, data, 1) + + // fielddesc_getcoord(sa->x_vec+2, + // template, data, 1), + // fielddesc_getcoord(sa->x_vec+1, + // template, data, 1) + + // fielddesc_getcoord(sa->x_vec+3, + // template, data, 1)); + + //sys_vgui("%g %g ", + // fielddesc_getcoord(sa->x_vec+2, + // template, data, 1), + // fielddesc_getcoord(sa->x_vec+3, + // template, data, 1)); + + gui_float_elem(fielddesc_getcoord(sa->x_vec+2, + template, data, 0)); + gui_float_elem(fielddesc_getcoord(sa->x_vec+3, + template, data, 0)); break; } else if (sa->x_type == gensym("circle")) { - sys_vgui("-r %d\\\n", - (t_int)fielddesc_getcoord(sa->x_vec+2, - template, data, 1)); + //sys_vgui("-r %d\\\n", + // (t_int)fielddesc_getcoord(sa->x_vec+2, + // template, data, 1)); + //sys_vgui("%d ", + // (t_int)fielddesc_getcoord(sa->x_vec+2, + // template, data, 1)); + gui_int_elem((t_int)fielddesc_getcoord(sa->x_vec+2, + template, data, 1)); break; } } + //sys_gui("\","); + gui_end_array(); } svg_togui(sa, template, data); + + gui_start_array(); + char parent_tagbuf[MAXPDSTRING]; if (in_array) - sys_vgui(" -parent .scelem%lx.%lx \\\n", parentglist, data); + { + //sys_vgui(" -parent .scelem%lx.%lx \\\n", parentglist, data); + //sys_vgui("\"scelem%lx.%lx\",", parentglist, data); + sprintf(parent_tagbuf, "scelem%lx.%lx", (long unsigned int)parentglist, + (long unsigned int)data); + gui_string_elem(parent_tagbuf); + } else - sys_vgui(" -parent .dgroup%lx.%lx \\\n", - x->x_canvas, data); + { + //sys_vgui(" -parent .dgroup%lx.%lx \\\n", + //sys_vgui("\"dgroup%lx.%lx\",", + // x->x_canvas, data); + sprintf(parent_tagbuf, "dgroup%lx.%lx", (long unsigned int)x->x_canvas, + (long unsigned int)data); + gui_string_elem(parent_tagbuf); + } /* tags - one for this scalar (not sure why the double glist thingy) one for this specific draw item */ - sys_vgui("-tags {.x%lx.x%lx.template%lx .draw%lx.%lx}\n", - glist_getcanvas(glist), glist, data, x, data); + //sys_vgui("-tags {.x%lx.x%lx.template%lx .draw%lx.%lx}\n", + // glist_getcanvas(glist), glist, data, x, data); + + // Let's try to get rid of Ico's tag + //sys_vgui("\"draw%lx.%lx\"", x, data); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x, + (long unsigned int)data); + gui_string_elem(tagbuf); if (!glist_istoplevel(glist)) { t_canvas *gl = glist_getcanvas(glist); @@ -3696,14 +4001,25 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist, canvas_restore_original_position(gl, (t_gobj *)glist, objtag, -1); } + //sys_gui(";\n"); + gui_end_array(); + gui_end_vmess(); } else post("warning: draws need at least two points to be graphed"); } else { if (n > 1) - sys_vgui(".x%lx.c delete .x%lx.x%lx.template%lx\n", - glist_getcanvas(glist), glist_getcanvas(glist), glist, data); + { +// sys_vgui(".x%lx.c delete .x%lx.x%lx.template%lx\n", +// glist_getcanvas(glist), glist_getcanvas(glist), glist, data); + char itemtagbuf[MAXPDSTRING]; + sprintf(itemtagbuf, "draw%lx.%lx", (long unsigned int)x, + (long unsigned int)data); + gui_vmess("gui_draw_erase_item", "ss", canvas_string(glist_getcanvas(glist)), + itemtagbuf); + } + } } diff --git a/pd/src/g_text.c b/pd/src/g_text.c index 84a72926c..51ab8316f 100644 --- a/pd/src/g_text.c +++ b/pd/src/g_text.c @@ -709,6 +709,9 @@ static void message_click(t_message *x, t_rtext *y = glist_findrtext(x->m_glist, &x->m_text); sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 5\n", glist_getcanvas(x->m_glist), rtext_gettag(y)); + gui_vmess("gui_message_flash", "ssi", + canvas_string(glist_getcanvas(x->m_glist)), + rtext_gettag(y), 1); clock_delay(x->m_clock, 120); } } @@ -720,6 +723,9 @@ static void message_tick(t_message *x) t_rtext *y = glist_findrtext(x->m_glist, &x->m_text); sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 1\n", glist_getcanvas(x->m_glist), rtext_gettag(y)); + gui_vmess("gui_message_flash", "ssi", + canvas_string(glist_getcanvas(x->m_glist)), + rtext_gettag(y), 0); } } @@ -1559,6 +1565,8 @@ static void text_select(t_gobj *z, t_glist *glist, int state) sys_vgui(".x%lx.c itemconfigure %sR -stroke %s\n", glist_getcanvas(glist), rtext_gettag(y), (state? "$pd_colors(selection)" : outline)); + gui_vmess("gui_text_select_color", "ss", + canvas_string(glist_getcanvas(glist)), rtext_gettag(y)); if (z->g_pd == gatom_class) { sys_vgui(".x%lx.c itemconfigure %lx.l -fill %s\n", @@ -1578,6 +1586,8 @@ static void text_select(t_gobj *z, t_glist *glist, int state) } sys_vgui(".x%lx.c addtag selected withtag %sR \n", glist_getcanvas(glist), rtext_gettag(y)); + gui_vmess("gui_text_select", "ss", + canvas_string(glist_getcanvas(glist)), rtext_gettag(y)); if (pd_class(&x->te_pd) == text_class && x->te_type != T_TEXT && glist_istoplevel(glist)) sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 1 -strokedasharray {} " @@ -1608,6 +1618,9 @@ static void text_select(t_gobj *z, t_glist *glist, int state) } sys_vgui(".x%lx.c dtag %sR selected\n", glist_getcanvas(glist), rtext_gettag(y)); + gui_vmess("gui_text_deselect", "ss", + canvas_string(glist_getcanvas(glist)), + rtext_gettag(y)); if (pd_class(&x->te_pd) == text_class && x->te_type != T_TEXT) sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 2 -strokelinecap projecting -strokedasharray {2 3} " @@ -1651,6 +1664,7 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis) { //fprintf(stderr,"text_vis %d\n", vis); t_text *x = (t_text *)z; + int x1, y1, x2, y2; #ifdef PDL2ORK //if we are in k12 mode and this is hub with level 1 (global) @@ -1675,6 +1689,12 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis) { //fprintf(stderr," draw it\n"); t_rtext *y = glist_findrtext(glist, x); + + // make a group + text_getrect(&x->te_g, glist, &x1, &y1, &x2, &y2); + gui_vmess("gui_text_create_gobj", "ssii", + canvas_string(glist), rtext_gettag(y), x1, y1); + if (x->te_type == T_ATOM) glist_retext(glist, x); text_drawborder(x, glist, rtext_gettag(y), @@ -1688,8 +1708,9 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis) if (gobj_shouldvis(&x->te_g, glist)) { //fprintf(stderr," erase it %lx %lx\n", x, glist); - text_eraseborder(x, glist, rtext_gettag(y)); - rtext_erase(y); + text_erase_gobj(x, glist, rtext_gettag(y)); + //text_eraseborder(x, glist, rtext_gettag(y)); + //rtext_erase(y); } } #ifdef PDL2ORK @@ -1860,6 +1881,7 @@ static t_widgetbehavior gatom_widgetbehavior = void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, char *tag, int x1, int y1, int x2, int y2) { + t_rtext *y = glist_findrtext(glist, ob); //if this is a comment or we are drawing inside gop on one of //our parents return if (pd_class(&ob->te_pd) == text_class || glist_getcanvas(glist) != glist) @@ -1886,8 +1908,12 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, tag, i, tag, (issignal ? "signal" : "control"), (selected ? "selected" : "")); + gui_vmess("gui_canvas_drawio", "sssiiiiii", + canvas_string(glist_getcanvas(glist)), rtext_gettag(y), tag, + onset, y2 - 2, onset + IOWIDTH, y2, x1, y1); } - else { + else + { //fprintf(stderr,"glist_drawiofor o redraw\n"); sys_vgui(".x%lx.c coords %so%d %d %d %d %d\n", glist_getcanvas(glist), tag, i, @@ -1921,8 +1947,12 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, tag, i, tag, (issignal ? "signal" : "control"), (selected ? "selected" : "")); + gui_vmess("gui_canvas_drawio", "sssiiiiii", + canvas_string(glist_getcanvas(glist)), rtext_gettag(y), tag, + onset, y1, onset + IOWIDTH, y1 + EXTRAPIX, x1, y1); } - else { + else + { //fprintf(stderr,"glist_drawiofor i firsttime\n"); sys_vgui(".x%lx.c coords %si%d %d %d %d %d\n", glist_getcanvas(glist), tag, i, @@ -2018,6 +2048,7 @@ void text_drawborder(t_text *x, t_glist *glist, t_object *ob; int x1, y1, x2, y2; + int broken; int selected = glist_isselected(glist, (t_gobj*)x); @@ -2052,6 +2083,7 @@ void text_drawborder(t_text *x, t_glist *glist, outline = "$pd_colors(dash_outline) -strokewidth 2 -strokelinecap projecting -strokedasharray {2 3}"; //-strokedasharray {4 1} fill = invalid_fill; box_tag = "broken box"; + broken = 1; } else { @@ -2059,9 +2091,11 @@ void text_drawborder(t_text *x, t_glist *glist, outline = "$pd_colors(box_border)"; fill = "$pd_colors(box)"; box_tag = "box"; + broken = 0; } if (firsttime) { + /* sys_vgui(".x%lx.c create ppolygon %d %d %d %d %d %d %d %d %d %d \ -stroke %s -fill %s -tags {%sR %lx text %s %s}\n", glist_getcanvas(glist), @@ -2069,6 +2103,10 @@ void text_drawborder(t_text *x, t_glist *glist, (selected ? "$pd_colors(selection)" : outline), fill, tag, tag, box_tag, (selected ? "selected" : "")); + */ + gui_vmess("gui_text_drawborder", "ssiiiii", + canvas_string(glist_getcanvas(glist)), tag, broken, x1, y1, x2, y2); + //-dash %s -> pattern disabled for tkpath } else @@ -2078,6 +2116,8 @@ void text_drawborder(t_text *x, t_glist *glist, sys_vgui(".x%lx.c coords %sR %d %d %d %d %d %d %d %d %d %d\n", glist_getcanvas(glist), tag, x1, y1, x2, y1, x2, y2, x1, y2, x1, y1); + gui_vmess("gui_text_redraw_border", "ssiiii", + canvas_string(glist_getcanvas(glist)), tag, x1, y1, x2, y2); /* this seems to be totally extraneous hans@at.or.at sys_vgui(".x%lx.c itemconfigure %sR -dash %s -outline %s\n", glist_getcanvas(glist), tag, pattern, outline); */ @@ -2086,6 +2126,8 @@ void text_drawborder(t_text *x, t_glist *glist, else if (x->te_type == T_MESSAGE) { if (firsttime) + { + /* sys_vgui(".x%lx.c create ppolygon " "%d %d %d %d %d %d %d %d %d %d %d %d %d %d " "-stroke %s -fill $pd_colors(msg) " @@ -2095,16 +2137,32 @@ void text_drawborder(t_text *x, t_glist *glist, x1, y2, x1, y1, (selected ? "$pd_colors(selection)" : "$pd_colors(msg_border)"), tag, tag, (selected ? "selected" : "")); + */ + + // coords are a quick hack to separate gobj's x/y from the polygon's coords + // which of course can be greatly simplified + gui_vmess("gui_message_drawborder", "ssii", + canvas_string(glist_getcanvas(glist)), tag, x2 - x1, y2 - y1); +// x1-x1, y1-y1, x2+4-x1, y1-y1, x2-x1, +// y1+4-y1, x2-x1, y2-4-y1, x2+4-x1, y2-y1, x1-x1, y2-y1, x1-x1, y1-y1); + } else + { sys_vgui(".x%lx.c coords %sR " "%d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", glist_getcanvas(glist), tag, x1, y1, x2+4, y1, x2, y1+4, x2, y2-4, x2+4, y2, x1, y2, x1, y1); + gui_vmess("gui_message_redraw_border", "ssiiiiiiiiiiiiii", + canvas_string(glist_getcanvas(glist)), tag, + x1-x1, y1-y1, x2+4-x1, y1-y1, x2-x1, y1+4-y1, x2-x1, y2-4-y1, x2+4-x1, y2-y1, + x1-x1, y2-y1, x1-x1, y1-y1); + } } else if (x->te_type == T_ATOM) { if (firsttime) + { sys_vgui(".x%lx.c create ppolygon " "%d %d %d %d %d %d %d %d %d %d %d %d " "-stroke %s " @@ -2114,11 +2172,19 @@ void text_drawborder(t_text *x, t_glist *glist, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1, (selected ? "$pd_colors(selection)" : "$pd_colors(atom_box_border)"), tag, tag, (selected ? "selected" : "")); + + gui_vmess("gui_atom_drawborder", "ssiiiiiiiiiiii", + canvas_string(glist_getcanvas(glist)), tag, + x1-x1, y1-y1, x2-4-x1, y1-y1, x2-x1, + y1+4-y1, x2-x1, y2-y1, x1-x1, y2-y1, x1-x1, y1-y1); + } else + { sys_vgui(".x%lx.c coords %sR " "%d %d %d %d %d %d %d %d %d %d %d %d\n", glist_getcanvas(glist), tag, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1); + } } /* for comments, just draw a dotted rectangle unlocked; when a visible canvas is unlocked we have to call this anew on all comments, and when @@ -2274,6 +2340,13 @@ void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag) glist_getcanvas(glist), tag, i); } +// erase the whole gobj in the gui one go +void text_erase_gobj(t_text *x, t_glist *glist, char *tag) +{ + if (x->te_type == T_TEXT && !glist->gl_edit) return; + gui_vmess("gui_gobj_erase", "ss", canvas_string(glist_getcanvas(glist)), tag); +} + void text_eraseborder(t_text *x, t_glist *glist, char *tag) { if (x->te_type == T_TEXT && !glist->gl_edit) return; diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c index bb8b3beb1..f91af52f4 100644 --- a/pd/src/g_toggle.c +++ b/pd/src/g_toggle.c @@ -30,6 +30,10 @@ void toggle_draw_update(t_gobj *xgobj, t_glist *glist) (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol); sys_vgui(".x%lx.c itemconfigure %lxX2 -stroke #%6.6x\n", canvas, x, (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_toggle_update", "ssi", canvas_string(canvas), + tagbuf, x->x_on != 0.0); } x->x_gui.x_changed = 0; } @@ -37,12 +41,15 @@ void toggle_draw_update(t_gobj *xgobj, t_glist *glist) void toggle_draw_new(t_toggle *x, t_glist *glist) { + char tagbuf[MAXPDSTRING], colorbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); t_canvas *canvas=glist_getcanvas(glist); int w=(x->x_gui.x_w+29)/30; int x1=text_xpix(&x->x_gui.x_obj, glist); int y1=text_ypix(&x->x_gui.x_obj, glist); int x2=x1+x->x_gui.x_w, y2=y1+x->x_gui.x_h; int col = (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol); iemgui_base_draw_new(&x->x_gui); sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d " @@ -51,6 +58,10 @@ void toggle_draw_new(t_toggle *x, t_glist *glist) sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d " "-stroke #%6.6x -tags {%lxX2 x%lx text iemgui}\n", canvas, x1+w+1, y2-w-1, x2-w-1, y1+w+1, w, col, x, x); + gui_vmess("gui_create_toggle", "sssiiiiiiiiiii", canvas_string(canvas), tagbuf, + colorbuf, w, + x1+w+1, y1+w+1, x2-w-1, y2-w-1, + x1+w+1, y2-w-1, x2-w-1, y1+w+1, x1, y1); } void toggle_draw_move(t_toggle *x, t_glist *glist) diff --git a/pd/src/g_traversal.c b/pd/src/g_traversal.c index 49488dd16..4a29f7416 100644 --- a/pd/src/g_traversal.c +++ b/pd/src/g_traversal.c @@ -582,6 +582,8 @@ static void set_set(t_set *x, t_symbol *templatesym, t_symbol *field) } } +static void scalar_configure(t_scalar *x, t_glist *owner); + static void set_bang(t_set *x) { int nitems = x->x_nin, i; @@ -618,7 +620,7 @@ static void set_bang(t_set *x) else for (i = 0, vp = x->x_variables; i < nitems; i++, vp++) template_setfloat(template, vp->gv_sym, vec, vp->gv_w.w_float, 1); if (gs->gs_which == GP_GLIST) - scalar_redraw((t_scalar *)(gp->gp_un.gp_gobj), gs->gs_un.gs_glist); + scalar_configure((t_scalar *)(gp->gp_un.gp_gobj), gs->gs_un.gs_glist); else { t_array *owner_array = gs->gs_un.gs_array; diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c index fd42b1e0b..d86fbc31f 100644 --- a/pd/src/g_vumeter.c +++ b/pd/src/g_vumeter.c @@ -71,11 +71,18 @@ static void vu_update_rms(t_vu *x, t_glist *glist) { int w4 = x->x_gui.x_w / 4, off=text_ypix(&x->x_gui.x_obj, glist) - 1; int x1 = text_xpix(&x->x_gui.x_obj, glist), + y1 = text_ypix(&x->x_gui.x_obj, glist), quad1 = x1 + w4 + 1, quad3 = x1 + x->x_gui.x_w-w4 - 1; sys_vgui(".x%lx.c coords %lxRCOVER %d %d %d %d\n", glist_getcanvas(glist), x, quad1 + 1, off + 2, quad3 + 1, off + (x->x_led_size + 1) * (IEM_VU_STEPS - x->x_rms) + 2); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + gui_vmess("gui_vumeter_update_rms", "ssiiiiii", + canvas_string(glist_getcanvas(glist)), + tagbuf, quad1 + 1, off + 2, quad3 + 1, off + (x->x_led_size + 1) * + (IEM_VU_STEPS - x->x_rms) + 2, x1, y1); } } @@ -96,6 +103,12 @@ static void vu_update_peak(t_vu *x, t_glist *glist) sys_vgui(".x%lx.c coords %lxPLED %d %d %d %d\n", canvas, x, x1 + 1, j + 2, x1 + x->x_gui.x_w + 2, j + 2); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", iemgui_color_hex[i]); + gui_vmess("gui_vumeter_update_peak", "sssiiiiii", canvas_string(canvas), + tagbuf, colorbuf, x1 + 1, j + 2, x1 + x->x_gui.x_w + 2, j + 2, x1, y1); sys_vgui(".x%lx.c itemconfigure %lxPLED -stroke #%6.6x\n", canvas, x, iemgui_color_hex[i]); } @@ -141,28 +154,56 @@ static void vu_draw_new(t_vu *x, t_glist *glist) { yyy = k4 + k1 * (k2-i); if((i&3)==1 && (x->x_scale)) + { sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w " "-font %s -fill #%6.6x " "-tags {%lxSCALEN %lxSCALE%d x%lx text iemgui}\n", canvas, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4], iemgui_font(&x->x_gui), x->x_gui.x_lcol, x, x, i, x); - + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_lcol); + // not handling font size yet + gui_vmess("gui_create_vumeter_text", "sssiisiii", canvas_string(canvas), + tagbuf, colorbuf, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4], + i, x1, y1); + } led_col = iemgui_vu_col[i]; - if (i<=IEM_VU_STEPS) sys_vgui(".x%lx.c create polyline %d %d %d %d " + if (i<=IEM_VU_STEPS) + { + sys_vgui(".x%lx.c create polyline %d %d %d %d " "-strokewidth %d -stroke #%6.6x " "-tags {%lxRLED%d x%lx text iemgui}\n", canvas, quad1+1, yyy+2, quad3, yyy+2, x->x_led_size, iemgui_color_hex[led_col], x, i, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", iemgui_color_hex[led_col]); + gui_vmess("gui_create_vumeter_steps", "sssiiiiiiii", + canvas_string(canvas), tagbuf, colorbuf, quad1+1, + yyy+2, quad3, yyy+2, x->x_led_size, index, x1, y1); + } } sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x " "-stroke #%6.6x -tags {%lxRCOVER x%lx text iemgui}\n", canvas, quad1+1, y1+1, quad3, y1+1 + k1*IEM_VU_STEPS, x->x_gui.x_bcol, x->x_gui.x_bcol, x, x); + char tagbuf[MAXPDSTRING]; + sprintf(tagbuf, "x%lx", (long unsigned int)x); + char colorbuf[MAXPDSTRING]; + sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol); + gui_vmess("gui_create_vumeter_rect", "sssiiiiii", canvas_string(canvas), + tagbuf, colorbuf, quad1+1, y1+1, quad3, y1+1 + k1*IEM_VU_STEPS, x1, y1); sys_vgui(".x%lx.c create polyline %d %d %d %d " "-strokewidth %d -fill #%6.6x " "-tags {%lxPLED x%lx text iemgui}\n", canvas, mid+1, y1+12, mid+1, y1+12, x->x_led_size, x->x_gui.x_bcol, x, x); + sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol); + gui_vmess("gui_create_vumeter_peak", "sssiiiiiii", canvas_string(canvas), + tagbuf, colorbuf, mid+1, y1+12, mid+1, y1+12, x->x_led_size, x1, y1); x->x_updaterms = x->x_updatepeak = 1; sys_queuegui(x, x->x_gui.x_glist, vu_draw_update); } diff --git a/pd/src/m_pd.h b/pd/src/m_pd.h index d36eee4e0..1d939d6c4 100644 --- a/pd/src/m_pd.h +++ b/pd/src/m_pd.h @@ -667,6 +667,15 @@ EXTERN void sys_vvguid(const char *file, int line, const char *fmt, va_list); EXTERN void sys_gui(const char *s); #define sys_vgui(args...) sys_vguid(__FILE__,__LINE__,args) #define sys_gui(s) sys_vguid(__FILE__,__LINE__,"%s",s) +EXTERN void gui_vmess(const char *sel, char *fmt, ...); +/* some more gui interfaces for building incremental messages */ +EXTERN void gui_start_vmess(const char *sel, char *fmt, ...); +EXTERN void gui_start_array(void); +EXTERN void gui_float_elem(t_float f); +EXTERN void gui_int_elem(int i); +EXTERN void gui_string_elem(const char *s); +EXTERN void gui_end_array(void); +EXTERN void gui_end_vmess(void); EXTERN void sys_pretendguibytes(int n); EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f); diff --git a/pd/src/s_audio.c b/pd/src/s_audio.c index 1d6588000..33586c2b2 100644 --- a/pd/src/s_audio.c +++ b/pd/src/s_audio.c @@ -501,7 +501,7 @@ void sys_reopen_audio( void) sys_audioapiopened = sys_audioapi; audio_callback_is_open = callback; } - sys_vgui("set pd_whichapi %d\n", (outcome == 0 ? sys_audioapi : 0)); + gui_vmess("set_audioapi", "i", (outcome == 0 ? sys_audioapi : 0)); } int sys_send_dacs(void) diff --git a/pd/src/s_inter.c b/pd/src/s_inter.c index 78f115ee8..2ae0a9912 100644 --- a/pd/src/s_inter.c +++ b/pd/src/s_inter.c @@ -752,6 +752,124 @@ void sys_gui(const char *s) sys_vgui("%s", s); } +char *escape_double_quotes(const char *src) { + static char ret[MAXPDSTRING*2+1]; + char *escaped = ret; + int i, len = MAXPDSTRING*2; + for (i = 0; i < len-1 && src[i] != 0; i++) + { + if (src[i] == '\"') + *(escaped++) = '\\'; + *(escaped++) = src[i]; + } + *escaped = '\0'; + if (i >= len) fprintf(stderr, "oops, you caught me statically allocating a string " + "in a lazy attempt to escape double-quotes for the gui. " + "Please call me out publicly for this regression, and/or revise this " + "so it doesn't arbitrarily limit the size of the strings " + "we can send to the gui."); + return ret; +} + +/* quick hack to send a parameter list for use as a function call in + Node-Webkit */ +void gui_do_vmess(const char *sel, char *fmt, int end, va_list ap) +{ + //va_list ap; + int nargs = 0; + char *fp = fmt; + + //va_start(ap, end); + sys_vgui("nn %s ", sel); + while (*fp) + { + // stop-gap-- increase to 20 until we find a way to pass a list or array + if (nargs >= 20) + { + error("sys_gui_vmess: only 10 named parameters allowed"); + break; + } + if (nargs > 0) sys_gui(","); + switch(*fp++) + { + case 'f': sys_vgui("%g", va_arg(ap, double)); break; + case 's': sys_vgui("\"%s\"", escape_double_quotes(va_arg(ap, const char *))); break; + case 'i': sys_vgui("%d", va_arg(ap, t_int)); break; + //case 'p': SETPOINTER(at, va_arg(ap, t_gpointer *)); break; + default: goto done; + } + nargs++; + } +done: + va_end(ap); + if (end) + sys_gui(";\n"); +} + +void gui_vmess(const char *sel, char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + gui_do_vmess(sel, fmt, 1, ap); +} + +void gui_start_vmess(const char *sel, char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + gui_do_vmess(sel, fmt, 0, ap); +} + +static int gui_array_head; +void gui_start_array(void) +{ + gui_array_head = 1; + sys_gui(",["); +} + +void gui_float_elem(t_float f) +{ + if (gui_array_head) + { + gui_array_head = 0; + sys_vgui("%g", f); + } + else + sys_vgui(",%g", f); +} + +void gui_int_elem(int i) +{ + if (gui_array_head) + { + gui_array_head = 0; + sys_vgui("%d", i); + } + else + sys_vgui(",%d", i); +} + +void gui_string_elem(const char *s) +{ + if (gui_array_head) + { + gui_array_head = 0; + sys_vgui("\"%s\"", escape_double_quotes(s)); + } + else + sys_vgui(",\"%s\"", escape_double_quotes(s)); +} + +void gui_end_array(void) +{ + sys_gui("]"); +} + +void gui_end_vmess(void) +{ + sys_gui(";\n"); +} + int sys_flushtogui( void) { int writesize = sys_guibufhead - sys_guibuftail, nwrote = 0; @@ -805,6 +923,7 @@ static int sys_flushqueue(void ) if (sys_bytessincelastping >= GUI_BYTESPERPING) { sys_gui("pdtk_ping\n"); + gui_vmess("gui_ping", ""); sys_bytessincelastping = 0; sys_waitingforping = 1; return (1); @@ -1145,6 +1264,16 @@ int sys_startgui(const char *guidir) "TCL_LIBRARY=\"%s/tcl/library\" TK_LIBRARY=\"%s/tk/library\" \ \"%s/pd-gui\" %d localhost %s\n", sys_libdir->s_name, sys_libdir->s_name, guidir, portno, (sys_k12_mode ? "pd-l2ork-k12" : "pd-l2ork")); + +/* SUPERHACK - let's just load node-webkit and see what happens */ + sprintf(cmdbuf, + "/home/nu/Downloads/nwjs-v0.12.0-alpha2-linux-ia32/nw " +// "/home/user/Downloads/node-webkit-v0.11.6-linux-ia32/nw " +// "/home/user/Downloads/atom/atom/atom " + "/home/nu/Downloads/test/ %d localhost %s\n", + portno, + (sys_k12_mode ? "pd-l2ork-k12" : "pd-l2ork")); + #endif sys_guicmd = cmdbuf; } @@ -1179,6 +1308,9 @@ int sys_startgui(const char *guidir) } } #endif + + fprintf(stderr, "fuck %s", sys_guicmd); + execl("/bin/sh", "sh", "-c", sys_guicmd, (char*)0); perror("pd: exec"); _exit(1); @@ -1332,12 +1464,19 @@ int sys_startgui(const char *guidir) /* here is where we start the pinging. */ #if defined(__linux__) || defined(IRIX) if (sys_hipriority) - sys_gui("pdtk_watchdog\n"); + gui_vmess("gui_watchdog", ""); #endif sys_get_audio_apis(buf); sys_get_midi_apis(buf2); - sys_vgui("pdtk_pd_startup {%s} %s %s {%s} %s\n", pd_version, buf, buf2, - sys_font, sys_fontweight); +// sys_vgui("pdtk_pd_startup {%s} %s %s {%s} %s\n", pd_version, buf, buf2, +// sys_font, sys_fontweight); + + gui_vmess("gui_startup", "sssss", + pd_version, + buf, + buf2, + sys_font, + sys_fontweight); } return (0); @@ -1387,7 +1526,8 @@ void glob_quit(void *dummy) canvas_suspend_dsp(); do_not_redraw = 1; glob_closeall(0, 1); - sys_vgui("exit\n"); + //sys_vgui("exit\n"); + gui_vmess("app_quit", ""); if (!sys_nogui) { sys_closesocket(sys_guisock); diff --git a/pd/src/s_main.c b/pd/src/s_main.c index 1949d76b1..1336b0a01 100644 --- a/pd/src/s_main.c +++ b/pd/src/s_main.c @@ -309,36 +309,38 @@ int sys_main(int argc, char **argv) // let's create one continuous string from all files int length = 0; t_namelist *nl; - for (nl = sys_openlist; nl; nl = nl->nl_next) - { +// for (nl = sys_openlist; nl; nl = nl->nl_next) +// { // for starting and ending quotes plus a space or null terminating // character, we add 3 additional characters per entry - length = length + strlen(nl->nl_string) + 3; - } - if(length && (filenames = (char*) calloc(length, sizeof(char*)) ) != NULL) +// length = length + strlen(nl->nl_string) + 3; +// } +// if(length && (filenames = (char*) calloc(length, sizeof(char*)) ) != NULL) + if (1) { - strcat(filenames,"\""); +// strcat(filenames,"\\\""); if (sys_openlist) { for (nl = sys_openlist; nl; nl = nl->nl_next) { - strcat(filenames,nl->nl_string); - if (nl->nl_next) - strcat(filenames,"\" \""); - else strcat(filenames,"\"\0"); // ensures proper termination + gui_vmess("gui_build_filelist", "s", nl->nl_string); +// strcat(filenames,nl->nl_string); +// if (nl->nl_next) +// strcat(filenames,"\\\" \\\""); +// else strcat(filenames,"\\\"\\\0"); // ensures proper termination } } //fprintf(stderr,"final list: <%s> <%c> %d\n", filenames, filenames[0], length); } else { - error("filelist malloc failed!\n"); - return(1); +// error("filelist malloc failed!\n"); +// return(1); } } - sys_vgui("pdtk_check_unique %d {%s}\n", sys_unique, - (filenames ? filenames : "0")); - if (filenames != NULL) free(filenames); + gui_vmess("gui_check_unique", "i", sys_unique); +// (filenames ? filenames : "0")); +// if (filenames != NULL) free(filenames); if (sys_externalschedlib) return (sys_run_scheduler(sys_externalschedlibname, sys_extraflagsstring)); diff --git a/pd/src/s_midi.c b/pd/src/s_midi.c index c850097c2..e9e6ac0bd 100644 --- a/pd/src/s_midi.c +++ b/pd/src/s_midi.c @@ -565,7 +565,7 @@ void sys_open_midi(int nmidiindev, int *midiindev, sys_save_midi_params(nmidiindev, midiindev, nmidioutdev, midioutdev); - sys_vgui("set pd_whichmidiapi %d\n", sys_midiapi); + gui_vmess("set_midiapi", "i", sys_midiapi); } diff --git a/pd/src/s_print.c b/pd/src/s_print.c index 8df706ae0..620711a51 100644 --- a/pd/src/s_print.c +++ b/pd/src/s_print.c @@ -65,6 +65,10 @@ static void doerror(const void *object, const char *s) sys_vgui("pdtk_posterror {%s} 1 {%s}\n", strnpointerid(obuf, object, MAXPDSTRING), strnescape(upbuf, s, MAXPDSTRING)); + gui_vmess("gui_post_error", "sis", + strnpointerid(obuf, object, MAXPDSTRING), + 1, + strnescape(upbuf, s, MAXPDSTRING)); } } @@ -118,7 +122,8 @@ static void dopost(const char *s) //if (ptout && upbuf[ptout-1] == '\n') // upbuf[--ptout] = 0, heldcr = 1; upbuf[ptout] = 0; - sys_vgui("pdtk_post {%s}\n", upbuf); +// sys_vgui("pdtk_post {%s}\n", upbuf); + gui_vmess("gui_post", "s", upbuf); } } -- GitLab