LibreOffice DbusMenu Integration Source Code ============================================ There are three main classes, DesktopJob, FrameJob and FrameHelper implemented in their respective .cxx/.h files: - src/DesktopJob.cxx - src/DesktopJob.h - src/FrameJob.cxx - src/FrameJob.h - src/FrameHelper.cxx - src/FrameHelper.h The first two classes are Jobs executed synchronously on two events, the events that trigger these jobs are defined in data/Jobs.xcu. Further explanation on each class can be found below. The FrameHelper class performs most of the tasks regarding communication between The src/export.cxx code is the entry point for the resulting shared object that conforms this extension. It exports the information needed to register and access all the interfaces implemented by the two jobs exported. GLib Integration ---------------- This extension assumes the presence of the GLib mainloop in the application, it is not recommended its installation on LibreOffice deployments that do not provide integration with the glib mainloop. g_type_init() is called in DesktopJob for safety. DesktopJob ---------- This class is a XJob that is instantiated and executed on LibreOffice startup just once during the lifetime of the process. This class does nothing but trying to acquire the "org.libreoffice.dbusmenu" busname. Once the executed method returns the object instance is destroyed. FrameJob & FrameHelper ---------------------- This class is a XJob that is instantiated and executed every time a document is created or loaded. It watches for the presence of the com.canonical.AppMenu.Registrar well-known D-Bus name. Afterwards it creates an instance of the FrameHelper class. FrameHelper is an XFrameActionListener that subscribes to the XFrame that represents the current Window. The lifetime of this FrameHelper is bound to the life of the current document being viewed/edited. FrameHelper creates the initial structure of Dbusmenu menuitems, and the dbusmenu server. If FrameHelper is destroyed, the frame is unregistered and the server shutdown. It also stops watching com.canonical.AppMenu.Registrar presence. Listening for menu changes - MenuItemInfo & MenuItemStatusListener ------------------------------------------------------------------ FrameHelper subscribes creates a cache in the commandsInfo GHashTable property. This cache maps each command URL with a MenuItemInfo object that stores the current information for a given menu item. To listen for menu changes and update the cache, FrameHelper creates an instance of MenuItemStatusListener per each command url. This listeners update the data for the respective MenuItemInfo associated to the command URL it is listening for. The source code for these two classes can be found in the following respective files: - src/MenuItemInfo.h - src/MenuItemInfo.cxx - src/MenuItemStatusListener.h - src/MenuItemStatusListener.cxx Special Popup Menus ------------------- This is the set of special popup menus: - .uno:CharFontName - .uno:FontHeight - .uno:ObjectMenue - .uno:InsertPageHeader - .uno:InsertPageFooter - .uno:ChangeControlType - .uno:AvailableToolbars - .uno:ScriptOrganizer - .uno:RecentFileList - .uno:AddDirect - .uno:AutoPilotMenu These menus cannot be introspected as they are created dinamically when the user clicks on the menu. Therefor they are treated differently, see the usage of isSpecialSubmenu in the rebuildMenu method from the FrameHelper class. In the case of the recent file list, the command URLs provided by this workaround are not enough to open the document. A workaround for this is present in the FrameHelper::dispatchCommand method. For further reference on this type of submenus follow this link: http://wiki.services.openoffice.org/wiki/Framework/Tutorial/Popup_Menu_Controller