Here’s a quick overview on how to start writing a custom publishing plugin. This is being done on Ubuntu 14.04, so no promises it will function on any other version.
- Install valac-0.22, libgphoto2-dev, gnome-doc-utils,libgstreamer-plugins-base1.0-dev, libgee-0.8-dev libsqlite3-dev libraw-dev librest-dev libwebkitgtk-3.0-dev libgexiv2-dev libgudev-1.0-dev libgtk-3-dev libjson-glib-dev
- Download the shotwell 0.20.2 sources and not the current version from github. The current version in get uses some new gtk features which are not available in ubuntu 14.04.
- Copy the shotwell/samples/simple-plugin from the shotwell git repo to a new directory
- Build/install shotwell 0.20
$ ./configure --install-headers $ sudo make -j6 install
- In your new plugin, run ‘make; make install’ to ensure the basic build works.
- Rename simple-plugin.vala to your publishing plugin name (ie, OnedrivePublishing.vala)
- Modify the Makefile and set the PROGRAM to your plugin name (ie, OnedrivePublishing)
- Running make should compile your new empty plugin.
Now that that’s done we can start creating out publishing plugin.
The plugin sample implements the Spit.Pluggable interface, in order to create a publishing plugin, we’ll need to use that to return our publishing module and create a new class to implement the Spit.Pluggable and Spit.Publishing.Service interface as well. Rename that class and include all the necessary interfaces. We’ll use the ShotwellPublishingCoreServices as a template for how to bootstrap out publishing service.
The basic do-nothing module which compiles w/ one warning (the return null) now contains the following:
extern const string _VERSION;
private class OnedriveModule : Object, Spit.Module {
private Spit.Pluggable[] pluggables = new Spit.Pluggable[0];
public OnedriveModule() {
pluggables += new OnedriveService();
}
public unowned string get_module_name() {
return _("OneDrive Publishing Services");
}
public unowned string get_version() {
return _VERSION;
}
public unowned string get_id() {
return "org.yorba.shotwell.publishing.onedrive";
}
public unowned Spit.Pluggable[]? get_pluggables() {
return pluggables;
}
}
// This is our new publishing class
private class OnedriveService : Object, Spit.Pluggable, Spit.Publishing.Service {
public OnedriveService() {
}
public unowned string get_id() {
return "org.yorba.shotwell.publishing.onedrive";
}
public Spit.Publishing.Publisher.MediaType get_supported_media() {
return (Spit.Publishing.Publisher.MediaType.PHOTO |
Spit.Publishing.Publisher.MediaType.VIDEO);
}
public Spit.Publishing.Publisher create_publisher(Spit.Publishing.PluginHost host) {
//TODO
return null;
}
public void get_info(ref Spit.PluggableInfo info) {
info.authors = "Mike Smorul";
info.version = _VERSION;
info.is_license_wordwrapped = false;
}
public unowned string get_pluggable_name() {
return "OneDrive";
}
public int get_pluggable_interface(int min_host_interface, int max_host_interface) {
return Spit.negotiate_interfaces(min_host_interface, max_host_interface,
Spit.Publishing.CURRENT_INTERFACE);
}
public void activation(bool enabled) {
}
}
// This entry point is required for all SPIT modules.
public Spit.Module? spit_entry_point(Spit.EntryPointParams *params) {
params->module_spit_interface = Spit.negotiate_interfaces(params->host_min_spit_interface,
params->host_max_spit_interface, Spit.CURRENT_INTERFACE);
return (params->module_spit_interface != Spit.UNSUPPORTED_INTERFACE)
? new OnedriveModule() : null;
}
private void dummy_main() {
}
You can now compile this by:
$ make clean; make ; make install
This will install your new module into your local modules directory. To make sure it works, open up shotwell, go to Edit -> Preferences -> Plugins and you should see your new plugin listed under the Publishing section with a generic graphic next to it. If you enable the module you’ll notice the following error that will be fixed when we start implementing functionality
GSettingsEngine.vala:457: GSettingsConfigurationEngine: error: schema 'org.yorba.shotwell.plugins.enable-state' does not define key 'publishing-onedrive'
Useful Links