diff options
Diffstat (limited to 'korundum/ChangeLog')
-rw-r--r-- | korundum/ChangeLog | 630 |
1 files changed, 630 insertions, 0 deletions
diff --git a/korundum/ChangeLog b/korundum/ChangeLog new file mode 100644 index 00000000..0d904be8 --- /dev/null +++ b/korundum/ChangeLog @@ -0,0 +1,630 @@ +2007-03-05 Richard Dale <rdale@foton.es> + + * Added a marshaller for QValueList<WId>& as requested by volty on #qtruby + +2007-07-06 Richard Dale <rdale@foton.es> + + * Fixed bug in DCOPRef's reported by Han Holl, but how has it ever worked? + +2007-02-19 Richard Dale <rdale@foton.es> + + * Fixed a bug where the sort method of KDE::ListView and KDE::ListViewItem + was no longer working, as the classes are 'Enumerable' and ruby was + calling the ruby sort method instead. Thanks to kelko for reporting it + on #kde-ruby. + +2006-11-21 Richard Dale <rdale@foton.es> + + * Made KDE::ListView, KDE::ListViewItem Enumerable with implementations + of each() so they don't need to use the Qt External iterators like + Qt::ListViewItemIterator anymore. For instance: + + lv = KDE::ListView.new do + ["one", "two", "three", "four"].each do |label| + KDE::ListViewItem.new(self, label, "zzz") + end + end + + lv.each do |item| + p item.inspect + pp item.inspect + end + + * Add inspect() and pretty_print() methods to KDE::ListViewItem so that + they show the text of their columns + +2006-10-22 Richard Dale <rdale@foton.es> + + * Special case QValueList<int> as a DCOPRef return type. Fixes problem + reported by Brian Bart. + +2006-08-18 Richard Dale <rdale@foton.es> + + * Added a KActionPtrList marshaller. Fixes problem reported by + eskatos on the #qtruby irc channel. + +2006-06-05 Richard Dale <rdale@foton.es> + + * The metaObject methods for slots and signals are no longer added when + a Qt::Object is constructed, but when slots or signals are added to + a class. This means that signals as well as slots can be added to an + existing instance. + +2006-05-16 Richard Dale <rdale@foton.es> + + * Fixed regression causing KDE::UniqueApplication.exec to not work + + * Removed the konsole_part_metaobject() C function as it isn't + needed anymore + +2006-03-29 Richard Dale <rdale@foton.es> + + * Added a KDE::KonsolePart class for when a konsolePart KPart is + dynamically loaded. It adds the five methods from the ExtTerminalInterface + to the KParts::ReadOnlyPart for interacting with the konsolePart. + + * Example usage: + + factory = KDE::LibLoader.self().factory("libkonsolepart") + if ! factory.nil? + @konsole = factory.create(self) + end + + @konsole.autoStartShell = true + @konsole.startProgram("/bin/echo", ["echo", "-n"]) + @konsole.showShellInDir( Qt::Dir.home.path ) + @konsole.sendInput( "puts 'hello there konsole'" ) + + * Fixes problem reported by Ranjan Ghosh + +2006-03-21 Richard Dale <rdale@foton.es> + + * Added various explicit calls to method_missing() for methods which + are defined in Kernel and Object, such as 'exec', 'select', 'format' + etc. Otherwise, the corresponding methods in the Smoke library were + not being invoked correctly. + +2006-02-08 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * When KDE::CmdLineArgs.init() was called with just a single + KDE::AboutData arg, it crashed. Fixes problem reported by + Han Holl. + + * KDE::CmdLineArgs and KDE::AboutData instances are no longer + deleted by qtruby on garbage collection. Fixes another problem + reported by Han Holl. + +2005-12-08 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * A marshaller was defined for 'KFileItemList' as a value type, but not for + a 'KFileItemList*' pointer type. Fixes problem reported by Diego 'Flameeyes' + Pettenò + +2005-10-05 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Changed DCOP code now that Qt::ByteArray class is in the Smoke library + * Fixed some examples derived from PyKDE with 0 or 1 passed as a + boolean instead of true or false for Ruby. A bug in the overloaded + method resolution meant it worked when it shouldn't have. + +2005-09-26 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Removed get and set methods for accessing fields on the structs + KIO::UDSAtom and KDE::ConfigSkeleton::MenuItem::Choice as + they aren't needed any more now that accessor methods are + generated in the Smoke library. + +2005-06-08 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * DCOP signals were failing with a 'undefined method `fullSignalName'' error + * Fixes problem reported by Chris Gow + +2005-05-29 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * At the moment require 'Qt' and require 'Korundum' statements can't appear + in the same ruby program. Suitable fatal error messages are now displayed + to indicate the cause of the problem. Fixes bug reported by Caleb Tennis + and Dave M + +2005-05-21 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * KDE::DCOPRef.methods now returns remote DCOP methods as well as the local methods in + the DCOPRef. So now irb tab completion works with dynamically discovered DCOP methods, + in a DCOPRef. + +2005-04-03 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added some #ifdefs so the bindings build with KDE 3.1.x + * Fixed problem with rbkconfig_compile Makefile.am + +2005-03-30 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Fixed problems caused ''include Qt'' and "include KDE" statements in korundum.rb where a + couple of methods were being added to class Module was causing all the Qt and KDE methods + to be added to Module. + +2005-02-01 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added marshallers for KIO::UDSEntry and KIO::UDSEntryList, and accessor methods for + fields in the KIO::UDSAtom struct. Fixes problem reported by Ian Monroe. + +2005-01-27 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added some fixes for the rbkconfig_compiler code generation and + example code. + * The method 'isImmutable' is added to KDE::ConfigSkeletonItems + as a special case - it's missing from the Smoke runtime as it's + from a template based superclass. + +2005-01-26 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Translated the rbkconfig_compiler examples from C++ to ruby, + and improved the build rules in the Makefile.ams + +2005-01-20 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The rbkconfig_compiler now uses Qt::Variants to hold the values in KDE::ConfigSkeleton + instance variables. + * The values of the KDE::ConfigSkeletonItems are then set as properties with the Qt::Variants. + It wasn't possible to handle references to primitive types such as 'int&' via ruby, so properties are + a more 'scripting language' oriented approach. + * The embedded code in the .kcfg examples was converted from C++ to ruby + +2005-01-20 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Tidied up the rbkconfig_compiler code + * Added marshaller for KConfigSkeleton::ItemEnum::Choice lists to and from ruby Arrays, + and accessor methods for the Item::Enum::Choice struct. + +2005-01-18 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added rbkconfig_compiler for compiling .kcfg files to ruby + +2004-12-29 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added inspect() and pretty_print() methods for KDE::AboutPerson and KDE::AboutTranslator, + along with some more fields in the KDE::AboutData inspector + +2004-12-15 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The DCOPObject inspect method was crashing if the instance hadn't been fully + constructed + * The kde_resolve_classname function's arg types were changed to match the new + ones in the resolve_classname() function of QtRuby/handlers.cpp. + +2004-12-11 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * DCOPObject inspect() and pretty_print() methods added + +2004-12-09 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * More inspect() and pretty_print() methods for common classes to improve debugging - + KDE::DCOPRef, KDE::Service, KDE::URL, KDE::AboutData. + +2004-10-30 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * References to Qt.qWarning() changed to qWarning() + +2004-10-24 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Fixed crashes in the KURL::List marshalling. A copy is now made of each KURL item + in the list when being marshalled to a ruby Array. When a KURL::List is deleted the + contents are all deleted too as it's a QValueList. Hence, the need to make copies. + +2004-10-20 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The RESTORE() method is no longer an KDE::Mainwindow method, but a globally available + Object method + +2004-10-20 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added I18N_NOOP() and I18N_NOOP2() methods + +2004-10-11 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Set global flag 'application_terminated' when KDE::Application or KDE::UniqueApplication + has returned from exec(). Once this is set the QtRuby runtime will no longer delete any + C++ instances. This will hopefully fix crash on application exit problems reported by Thibauld + Favre. + +CCMAIL: kde-bindings@kde.org + +2004-10-08 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Reverted recent fix for crash on exit, as it only occured with a Qt::Application and + seems to introduce a crash in KDE apps where none existed before. + + CCMAIL: kde-bindings@kde.org + CCMAIL: thibauld.favre@laposte.net + +2004-10-06 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * When a Korundum application exits, the top level widgets are now destroyed + as well as the KDE::Application itself. This fixes a problem where the ruby garbage + collection frees instances in an arbitrary order afer the program has exited, and + destroys a Hash containing QMetaData info needed for tidying up. + +2004-10-04 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * When a ruby app exits, rb_gc_call_finalizer_at_exit() is called and all the ruby + instances are garbage collected. The problem is that this is done in an arbitrary + order, and KDE::Application was occasionally crashing in its destructor because + QMetaObject info it still needed was being deleted before then. + + * Fixes problem reported by Thibauld Favre + + CCMAIL: <tfavre@mandrakesoft.com> + +2004-10-03 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Removed warning about '*' being used as an argument prefix + +2004-09-30 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added some rtti tests for DOM::Node to instantiate a more accurate ruby class + +2004-09-30 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The resolve_classname() function in qtruby handlers.cpp uses the various Qt rtti mechanisms to + get a more accurate classname to instantiate as a ruby instance. It has now been extended + with a callback to the Korundum library to do the same for KDE classes. + + * This fixes a problem reported by Zack Rusin where a KArchiveEntry returned to ruby was not being + correctly constructed as either a KArchiveDirectory or KArchiveFile according to + the KArchiveEntry::isDirectory() method + + CCMAIL: zack@kde.org + + +2004-09-18 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added marshallers for KPluginInfo::List and QPtrList<KParts::Plugin> + +2004-09-16 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The KDE::UniqueApplication constructor now sets up the $kapp global variable + +2004-09-16 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added $kapp global variable, example usage: + + config = $kapp.config() + +2004-08-29 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added Kontact module to provide a namespace for the kontact plugin api + +2004-08-25 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Underscore naming for can be used for DCOP method names instead of camel case if + preferred. Any underscores in method names are removed, and the following + character is capitalised. For example, either of these two forms can be used + to call the same dcop function: + + process_can_be_reused(1234) + + processCanBeReused(1234) + +2004-08-24 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The form 'foo?' can be used as a synonym for isFoo() or hasFoo() dcop methods. + * Instead of: + result = dcopRef.isFoo() + * Use this more rubyish form: + result = dcopRef.foo? + if result.nil? + puts "DCOP predicate failed" + else + puts "foo? is #{result}" + end + + +2004-08-16 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The 'qWarning()' calls in korundum.rb needed to be prefixed with the 'Qt.'' module + otherwise a missing dcop call causes an infinite loop. + +2004-08-14 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added KServiceGroup::List to ruby array marshaller + +2004-08-03 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Fixed regression bug in emitting dcop signals + +2004-08-03 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added a KMountPoint::List marshaller + +2004-07-30 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Removed the various Q_INT32 etc types from the Smoke stack <--> QDataStream + marshalling. This was because the code generated by the dcopidl2cpp tool + doesn't have them. So if a machine has native 64 bit ints, then that width + will be used rather than Q_INT32. + +2004-07-28 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added a couple of template methods for marshalling QValueLists and QMaps. + * Included a quite a few new marshaller functions for QPtrLists, as well as + the two types above. + +2004-07-28 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Fixed crash in marshalling KMimeTypes and KServiceGroups to ruby values + +2004-07-27 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Replaced QString casts to 'const char *' with latin1() calls + +2004-07-27 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added error messages for invalid dcop slot or signal declarations + +2004-07-27 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * DCOP error messages now go via qWarning() rather than puts() + +2004-07-26 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added QMap<QCString,DCOPRef> marshalling to and from Smoke as well as dcop + +2004-07-24 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * DCOP reply types can now contain colons + * Added KURL::List to ruby Array marshalling, fixed crash when + marshalling from a ruby Array to a KURL::List + * Add KURL::List ruby <--> dcop marshalling + +2004-07-24 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added QMap<QString,DCOPRef> ruby <--> dcop marshalling + +2004-07-23 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Tidied up the dcop meta object code a bit + +2004-07-23 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * If a ruby class with 'k_dcop' declarations isn't a subclass of DCOPObject, + only one instance of a DCOPObject is created no matter how many instances + are instantiated. + +2004-07-23 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Tidied code - removed unnecessary action_map_to_list helper method + +2004-07-21 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * QDataStream temporary variables added for the Q_INT32 etc types when + writing to a Smoke stack from a QDataStream. + +2004-07-21 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added casts to the various macros like 'Q_INT32' when writing a Smoke + stack to a QDataStream + +2004-07-21 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added QValueList<QCString> marshalling ruby <--> dcop + +2004-07-21 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Ruby dcop slots can now return actionMaps and windowLists as + 'QMap<QString,DCOPRef>' and 'QValueList<DCOPRef>' types + +2004-07-20 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added missing 'QMap<QString,DCOPRef>' dcop reply marshalling + * The recently added dcop reply type 'QValueList<DCOPRef>' now works + * The parsing of a dcop function type signature to add it to the cache + was wrong if the reply type contained angle brackets or commas + +2004-07-19 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added dynamic ruby to C++ argument type resolution in DCOPRef calls. + When a call of the form 'dcopRef.getPoint(5, "foobar")' is made, the C++ + type signature is obtained from the list of those returned by + DCOPRef.functions(). If the function name is overloaded, the ruby arg + types are used to pick the correct call. + +2004-07-18 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Made 'parrot.age = 7' a synonym for 'parrot.setAge(7)' with dcop refs + +2004-07-17 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * More missing DCOP marshallers - QStringList and QCStringList + * A class with a 'k_dcop' slots declaration can now be an instance + of DCOPObject + * Converted the 'petshop' DCOP server example from pykde python + +2004-07-16 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added missing QCString DCOP marshalling + +2004-07-16 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Removed the recently added QValueList<DCOPRef> marshaller as no '<<' + or '<<' QDataStream marshallers are in the Smoke runtime + * Added missing primitive type marshalling to and from a DCOP QByteArray + +2004-07-15 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Fixed completely non-working DCOP call reply marshalling. An instance wasn't + being constructed to read the QByteArray containing the reply via a QDataStream. + +2004-07-15 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added QValueList<DCOPRef> marshalling + +2004-07-14 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Converted various example app templates from pykde to ruby Korundum + +2004-07-13 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * A DCOP send() now correctly returns true or false according to success + * DCOP call()s with void or ASYNC return types return true on success, + or nil on failure + +2004-07-13 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Improved the KSharePtr item marshalling so that a copy of the item + is constructed with no accompanying smart pointer. The new item + can be owned by ruby without needing to special case deref'ing + the pointer on destruction. Apart from KService's don't have a + public copy constructor, where the ref count is incremented to + prevent their destruction. + +2004-07-12 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * The full C++ type signature is no longer needed in DCOP calls: + + dcopRef = KDE::DCOPRef.new("dcopslot", "MyWidget") + + There are three different ways to specify the call: + 1) res = dcopRef.call("getPoint(QString)", "Hello from dcopsend") + 2) res = dcopRef.call("getPoint", "Hello from dcopsend") + 3) res = dcopRef.getPoint("Hello from dcopsend") + + puts "result class: #{res.class.name} x: #{res.x} y: #{res.y}" + + * Send to a DCOPRef is similar: + 1) dcopRef.send("mySlot(QString)", "Hello from dcopsend") + 2) dcopRef.send("mySlot", "Hello from dcopsend") + + * If the type signature of the target dcop slot is ommited it is derived + from the ruby argument types: + + String => QString + Float => double + Integer => int + Qt::Widget etc => QWidget + KDE::URL etc => KURL + [] => QStringList + +2004-07-08 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Reverted fix for QChar args being passed as ruby strings after + discussion with Germain Garand. A QChar arg is now passed like this: + + cs = KDE::CharSelect.new(self, "chselect", nil, Qt::Char.new(0), 0) + + This will no longer work for now: + + cs = KDE::CharSelect.new(self, "chselect", nil, ' ', 0) + +2004-07-07 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Translated the excellent pykde 'UISampler' app to ruby + * Added KAction list marshalling + * KDE::MainWindow.RESTORE() and kRestoreMainWindows() methods added. + +2004-07-06 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added more translated pykde examples + * The type signatures of dcop signals and slots are now normalized and unwanted + white space is removed + +2004-07-02 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Translated some pykde example programs from python to ruby + * Added various marshallers for the KSharedPtr related methods/classes + +2004-07-02 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Replaced obsolete STR2CSTR() calls with StringValuePtr() + +2004-07-01 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * DCOP Signals now work, they are defined like this: + + k_dcop_signals 'void testEmitSignal(QString)' + + def doit() + puts "In doit.." + emit testEmitSignal("Hello DCOP Slot") + end + + * Connect slot 'mySlot' to a DCOP signal like this: + + res = slottest.connectDCOPSignal("dcopsignal", "SenderWidget", + "testEmitSignal(QString)", "mySlot(QString)", + true) + +2004-06-30 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added DCOPRef.call() and send() support. + * Define a dcop slot like this in one ruby program: + + k_dcop 'QPoint getPoint(QString)' + + def getPoint(msg) + puts "message: #{msg}" + return Qt::Point.new(50, 100) + end + + * Call it from another program and print the reply, like this: + + dcopRef = KDE::DCOPRef.new("dcopslot", "MyWidget") + res = dcopRef.call("QPoint getPoint(QString)", "Hello from dcopsend") + puts "result class: #{res.class.name} x: #{res.x} y: #{res.y}" + + * Send to a DCOPRef is similar: + + dcopRef = KDE::DCOPRef.new("dcopslot", "MyWidget") + dcopRef.send("mySlot(QString)", "Hello from dcopsend") + + * Note that the full type signature of the target dcop slot must be + specified at present. + +2004-03-10 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Added marshaller for KTrader::OfferList to ruby array + * Used DOM::Node rtti to instantiate a ruby value with the correct subclass + +2004-03-03 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * If the DCOP reply type is 'void' or 'ASYNC', it isn't marshalled into the + QByteArray 'replyData' arg of DCOPObject::process(). + +2004-03-02 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Slots and signals couldn't be added to KDE classes, such as KDE::PushButton + +2004-03-02 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * A DCOPClient instance is now created for classes with a 'k_dcop_signals' + declaration, and emitDCOPSignal() is called on that. + +2004-03-01 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Ruby DCOP support now working - here is some example code: + + require 'Korundum' + class MyWidget < KDE::PushButton + k_dcop 'QPoint mySlot(int,QString)' + + def initialize(parent, name) + super + end + + def mySlot(counter,greeting) + return Qt::Point.new(50, 100) + end + end + + - This slot is passed an integer and a string, and returns a Qt::Point. + - Note that the class doesn't have to inherit from DCOPObject. If you + include a 'k_dcop' slots declaration a 'listener' dcop object instance + is created automatically. + + +2004-01-08 Alexander Kellett <lypanov@kde.org> + * Imported krubyinit sources, thus at last fixing the startup segv's with gentoo/x86/qt 3.2. + +2003-12-02 Richard Dale <Richard_Dale@tipitina.demon.co.uk> + + * Korundum - a Ruby SMOKE adaptor for KDE, initial checkin (proxy commit from lypanov) + |