<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Luxi Sans'; font-size:11pt; font-weight:400; font-style:normal;">On May 4, 2009, Bert Freudenberg wrote:<br>
&gt; On 04.05.2009, at 07:31, Milan Zimmermann wrote:<br>
&gt; &gt; Hi Bert,<br>
&gt; &gt;<br>
&gt; &gt; I finally did some investigation into Squeak interaction with DBus and<br>
&gt; &gt; Datastore. I went through the classes that implement the DBus and<br>
&gt; &gt; Datastore<br>
&gt; &gt; interaction. This is some great stuff! Among others, if I understand<br>
&gt; &gt; this correctly, your Squeak DBus client framework could, for<br>
&gt; &gt; example, allow to use Squeak to write a KDE or gnome panel applet?<br>
&gt; &gt; But that is an aside.<br>
&gt;<br>
&gt; Yes indeed. <br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Very cool. I think such functionality could also add interest in Squeak... Would  it makes sense to add Squeak to this list<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>http://www.freedesktop.org/wiki/Software/DBusBindings<br>
?<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt; A fun way to explore it is to run Squeak on a regular KDE/<br>
&gt; Gnome desktop and open the DBus Explorer from the World menu. You can,<br>
&gt; for example, find the screen saver on the session bus and tell it to<br>
&gt; blank the screen ...<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Or exiting any application :) This is worth a blog by itself. <br>
        World Menu -&gt; Open -&gt;  DbusExplorer. <br>
        Expand DBus sessionBus<br>
        open KDE system konsole<br>
        org.kde.konsole/konsole/MainWindow_1/actions/file_quit/<br>
                com.Trolltech.QT.QAction.trigger<br>
        yellow(middle or right)-click, select "invoke method"<br>
        konsole gone<br>
Neat...<br>
        <br>
&gt;<br>
&gt; &gt; As Step 1, my goal was to figure out how to save a project in<br>
&gt; &gt; Journal from a set of commands in Workspace. Going to the debugger,<br>
&gt; &gt; I found that if I open a project in Etoys, and in a workspace, and do<br>
&gt; &gt;<br>
&gt; &gt;        Project current storeOnServerWithNoInteractionThenQuit.<br>
&gt; &gt;<br>
&gt; &gt; the project is saved in Journal, and on restart, Etoys must have read<br>
&gt; &gt; the Journal saved project because it shows any changes I have made in<br>
&gt; &gt; the project. It seems that the core method called from<br>
&gt; &gt; storeOnServerWithNoInteractionThenQuit that interacts with Datastore<br>
&gt; &gt; is<br>
&gt; &gt;<br>
&gt; &gt;        SugarDatastoreDirectory&gt;&gt; #writeProject: self<br>
&gt; &gt;                                        inFileNamed: fileName<br>
&gt; &gt;                                        fromDirectory: localDirectory<br>
&gt; &gt;<br>
&gt; &gt; So I tried to do the the same (Project current<br>
&gt; &gt; storeOnServerWithNoInteractionThenQuit.) from a workspace in the<br>
&gt; &gt; FreeCell activity. When performed, it does write to the Journal, but<br>
&gt; &gt; upon restart, I get an exception that appears a DBus object cannot<br>
&gt; &gt; be found -<br>
&gt; &gt; picture attached.<br>
&gt;<br>
&gt; No, this is a regular file-not-found prompt. It looks like an file<br>
&gt; from the Datastore could not be opened. You should press alt-. at this<br>
&gt; prompt and investigate what it's trying to do.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>I will debug it.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; &gt; Could the difference be it because Freecell, on startup, does not<br>
&gt; &gt; setup some DBus interaction?<br>
&gt;<br>
&gt; No, that should not be the problem.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>OK.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; &gt; Well in any case, I am looking for some help trying to figure this<br>
&gt; &gt; out. I was thinking about these steps I'd like to achieve:<br>
&gt; &gt;<br>
&gt; &gt; 1) Command in Workspace that saves the FreeCell project on Journal.<br>
&gt; &gt; I seem to be able to do that, but on fairly high level ( Project<br>
&gt; &gt; current storeOnServerWithNoInteractionThenQuit.). Eventually I'd<br>
&gt; &gt; like to get it done with more but lower level commands.<br>
&gt;<br>
&gt; Well. IMHO we should *not* save the whole project to the Journal. This<br>
&gt; is not supposed to be an Etoys activity, but a Squeak application. It<br>
&gt; should only store and retrieve its relevant state. For starters I'd<br>
&gt; only store the statistics, which is about 10 numbers.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>I did not think of saving only the state of the game, but it is definitely a  better approach. Maybe I am missing something here though. For example, in Etoys, saving a project writes the whole project as a pr file - I assume .PR is some for of serialized everything in the project, not just what have changed. <br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>When attempting to store only FreeCell's state, I have a few things to learn and understand: <br>
        - without looking I am surptised FreeCell's state is only 10 numbers, it seems that position of the cards must be more than that unless it's packed somehow - I will look<br>
        - which objects represent the state stored <br>
        - how to serialize it (well that should be relatively straightforward knowing the objects)<br>
        - what method will write the serialized FreeCell state to Journal<br>
                instead of SugarDatastoreDirectory&gt;&gt;#writeProjectinFileNamed:fromDirectory:<br>
        - what does assign the "ownership" of that file on Journal as FreeCell<br>
        - how to deserialize the state<br>
        - how to import it back to the game<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; &gt; 2) Sure and understood way to open the saved Journal Project in<br>
&gt; &gt; FreeCell. (So far within Etoys it seems to work, but I have little<br>
&gt; &gt; understanding of it. In FreeCell it does not)<br>
&gt;<br>
&gt; The regular Etoys Sugar startup happens in SugarLauncher&gt;&gt;startUp.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>yes<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt; There it looks for the ACTIVITY_ID parameter to see if we are actually<br>
&gt; running under Sugar, and an OBJECT_ID which is present if we are<br>
&gt; resuming a Journal entry.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>yes<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; I think the best way would be to use different parameter names in<br>
&gt; FreeCell.sh, perhaps FREECELL_ACTIVITY_ID and FREECELL_OBJECT_ID. Then<br>
&gt; the Etoys logic would not kick off<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>logic in SugarLauncher.startup?<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;  and would not try to open the<br>
&gt; object as project, but we could provide our own startup method that we<br>
&gt; would simply call at the end of FreeCell.st.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>and load the state read from the Datastore/Journal?<br>
&gt;<br>
&gt; &gt; 3) A command or set of commands in workspace, which wil allow to<br>
&gt; &gt; Rename the FreeCell project (and save on Journal under the new name)<br>
&gt;<br>
&gt; Renaming means nothing more than storing in the DataStore with<br>
&gt; different meta data. Inspect<br>
&gt;<br>
&gt;         SugarDataStore new getProperties: someObjectId<br>
&gt;<br>
&gt; (see the SugarDataStore class example to find out object ids). This<br>
&gt; meta data is just a dictionary that you can modify and later pass to<br>
&gt; the datastore's "update" function.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>ah i see - so the getProperties reads the database key-values and update just puts it back with whatever changes we may have done.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; You should try to create and retrieve a file for the datastore<br>
&gt; manually in a workspace first. Like in this example, where a file is<br>
&gt; first read from the datastore, then modified, the saved again:<br>
&gt;<br>
&gt; http://wiki.squeakland.org/display/sq/Saving+to+a+file+in+Sugar<br>
&gt;<br>
&gt; This is actually a pretty complete example of what would have to<br>
&gt; happen for FreeCell on startup and on saving (reading a datastore<br>
&gt; object on startup, and creating or updating the datastore object to<br>
&gt; save). The difference would be that no find call is necessary because<br>
&gt; we would know the object id (if any) already.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>i saw the example but did not study it - actually I tried, but did not get far enough. I will play with it from workspace, and likely ask some  questions.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; One minor thing missing is that an activity is supposed to watch the<br>
&gt; journal entry so it catches e.g. renames done on the Journal screen.<br>
&gt; Etoys actually does this (try resuming an Etoys project, switch to<br>
&gt; Journal, rename it there, switch back to Etoys, name should have<br>
&gt; changed there, too). See #monitorJournalEntry.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>I see - will play with that as well.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; &gt; 4) Ability to start using the black Launcher ribbon on top, with the<br>
&gt; &gt; standard Etoys project name a project stop widget that would call<br>
&gt; &gt; the commands from 1 and 2. .<br>
&gt;<br>
&gt; Well if you look at the end of FreeCell.st you see the tool bar is<br>
&gt; explicitly toggled off. Before re-enabling it we would have to<br>
&gt; customize it (see class SugarNavigatorBar).<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Ah I thought the bar was SugarLauncher. Another thing to look at.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; &gt; 5) More interaction such as copy/paste on Journal<br>
&gt;<br>
&gt; What would you like to paste into FreeCell? Not sure how useful that<br>
&gt; would be.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Well I though of it as an exercise, rather then useful feature, but it could be used like this: User could copy and later paste another state of FreeCell from the Sugar black ribbon on the left - this would replace the current game with the one that was pasted<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; &gt; Do these goals and order make sense?<br>
&gt; &gt;<br>
&gt; &gt; I will try to maintain a blog about what I am playing with.<br>
&gt; &gt;<br>
&gt; &gt; http://mzimmerm.blogspot.com/2009/05/how-to-install-and-run-sugar-activit<br>
&gt; &gt;y.html<br>
&gt;<br>
&gt; Nice. I commented about two misconceptions.<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Thanks! That means that section of blog is really for a developer that wants to do things manually (rather then just install FreeCell by clicking "download" - I will modify the blog with that comment so it is less confusing<br>
&gt;<br>
&gt; &gt; I am unfortunately frustratingly slow and sometimes fail to respond<br>
&gt; &gt; for a long time, combination of lack of time and experience in this<br>
&gt; &gt; area (Squeak/DBus/Sugar), but will keep going... Appreciate any help.<br>
&gt;<br>
&gt; Just take your time, I'm glad someone else is finally looking at this<br>
&gt; stuff :)<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>I am actually quite excited about this - you did lots of great stuff there that deserves attention, use, and maybe we can do some marketing for it :) by having a few blogs and a small tutorial at some point.  Long time ago I played with DCOP in KDE and Dbus is similar but that's not the point - The point is that apart from it's usefulness for Sugar, what you did can be also used for Squeak / Etoys applications to be integral part of KDE and Gnome desktops (perhaps even OS X - I am reading Dbus is ported there there but probably not integrated). I especially like the idea trying to write a  KDE Panel applet in Squeak :)<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>ok time to go, I have stuff to try during the week and weekend, but I should have some questions earlier...<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>Later, Milan<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p>&gt;<br>
&gt; - Bert -<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Etoys mailing list<br>
&gt; Etoys@lists.laptop.org<br>
&gt; http://lists.laptop.org/listinfo/etoys<br>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p><p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;"><br></p></body></html>