25 Jan 2014



Shell Contract Report

Several months ago the ReactOS Foundation issued a development contract to Giannis Adamopoulos to work on improving ReactOS' shell support. The end goal of this work was to get explorer_new running, though it was understood from the onset that a single contract may not be sufficient to finish the project. Still, the first contract would at least provide a solid foundation that could be built upon. The fruits of Giannis' work were recently previewed with screenshots of explorer_new running on Windows 8 and its inclusion into ReactOS, even though not all functionality is working.
While a visual representation of Giannis' work might be satisfying to some, it does not do credit to the effort he put in and that the community helped make possible with their donations. This report will walk through the development conducted during the contract and lay out what future work will be needed, some already in progress.
Early in the project's history, a decision was made to not become dependent on Wine for the shell32 library needed for the graphical user shell. This decision was premised on the fact that Wine does not need all of the infrastructure a true explorer shell requires since Wine is hosted on Linux, which had its own shells like KDE or Gnome. As such, the developers picked and chose specific bits and pieces to import. The shell that was ultimately included in ReactOS for its 0.2.0 release was developed by Martin Fuchs and while it mostly worked, architecturally it was doing a lot of things wrong. This was not due to any fault on Martin's part, as his hands were tied due to lack of a proper shell32 implementation. What Martin was ultimately forced to do was replicate much of the functionality that should have been in shell32 and shove it all into explorer.
This created a kind of catch 22. To get a properly working shell the project needed a properly implemented shell32. But to test the shell32 implementation, the project needed a shell that did the right thing. Thomas Bluemel's attempt to break this deadlock was to implement explorer_new on Windows instead of ReactOS so that he could be certain his shell would do the right thing instead of guessing where the problems were. This of course meant that explorer_new would not work on ReactOS due to all of the unimplemented functionality. A common mistake amongst other developers after Thomas' initial work was trying to fix what they regarded as issues in explorer_new, when in fact explorer_new was perfectly fine and the problems were in ReactOS.
The next big step in shell work was done by Andrew Hill who converted shell32 into C++ and implemented browseui.dll, the file browsing window library. This library was again developed on Windows, which means it is probably mostly correct. The only major architectural issue is on Windows there are in fact two libraries involved in supporting the file browsing window, browseui.dll and shdocvw.dll. Andrew treated the two as a single library, but that's a relatively minor point considering the rest of his achievements. This was the foundation from which Giannis had to build upon and all things considered, they were pretty strong foundations.
Much of Giannis' time was spent doing research and documenting exactly how the shell infrastructure worked. This is one of the more opaque aspects of Windows since Microsoft did not really view the shell as something that application programmers should be modifying beyond via a few specific extension hooks.
Giannis' first major coding effort involved properly routing shell operations so that they actually called upon the libraries Andrew put together. Previously, the tangle of classes and libraries never actually got down to them. After that Giannis spent a considerable amount of time debugging why certain actions performed by the libraries failed, eventually reaching the point where browsing files and folders began working correctly.
By the time the contract concluded, explorer_new could start in ReactOS and allow a user to browse about. The items missing in explorer_new includes the menu bars in the file browser, the start menu, treeview of directories, and commandline argument parsing. Another group of items missing from the shell infrastructure in general include drag and drop, file copy dialogs, and dynamic data exchange.
In addition to the code developed during the contract, Giannis has produced copious amounts of documentation regarding the shell infrastructure. These will be released gradually as they are edited and formatted to be more readable and understandable. The Foundation considers Giannis to have fulfilled the terms of his contract fully and look forward to future work from him.
Addendum: Since the formal conclusion of the contract and while the report was being prepared, Giannis and David Quintana have made further progress on the start menu implementation as demonstrated by this screenshot of explorer_new running on Windows 8 with the menu instead of the start screen.
News Type: