Introduction GObject Introspection GSettings Notifications Shell Extensions The End The GNOME3 Desktop and You Guido Günther <agx@sigxcpu.org> FrOSCon 2011 Introduction GObject Introspection GSettings Notifications Shell Extensions The End About myself Freelancing Free Software Developer Debian Developer since 2000 Contributions to GNOME/GTK+/GObject based apps since about 2008: krb5-auth-dialog, PPM, ModemManager, gtk-vnc, virt-manager I’m less an author but more a user of GNOME APIs. Introduction GObject Introspection GSettings Notifications Shell Extensions The End About this talk Covers things I came across when working on the above projects in Tries to give an introduction so it’s simpler to dive deeper into it GNOME development Introduction GObject Introspection GSettings Notifications Shell Extensions The End GNOME3 GNOME is a desktop environment built on top of GTK+/GLib/GObject GNOME’s user interface is shaped by GNOME Shell Introduction GObject Introspection GSettings Notifications Shell Extensions The End Overview 1 Introduction 2 GObject Introspection 3 GSettings 4 Notifications 5 Shell Extensions 6 The End Introduction GObject Introspection GSettings Notifications Shell Extensions The End GTK+, GLib, GObject GLib is a cross platform C library that provides: Data types: Lists, Hash Tables, Trees, Caches, Strings, ... Application Support: Threads, Loadable Modules, Memory Management, ... Utilities: Timers, Checksums, Random Numbers, Parsers, Testing framework, ... gobject: The GLib Object system gio: filesystem monitoring, async I/O, networking, DBus, settings, ... GTK+3 is the widget toolkit Based on GObject Widgets, clipboard, key bindings, d’n’d, theming, ... Many other libraries are based on GObject: libsoup, gtk-vnc, telepathy, ... Introduction GObject Introspection GSettings Notifications Shell Extensions The End GTK+, GLib, GObject GLib is a cross platform C library that provides: Data types: Lists, Hash Tables, Trees, Caches, Strings, ... Application Support: Threads, Loadable Modules, Memory Management, ... Utilities: Timers, Checksums, Random Numbers, Parsers, Testing framework, ... gobject: The GLib Object system gio: filesystem monitoring, async I/O, networking, DBus, settings, ... GTK+3 is the widget toolkit Based on GObject Widgets, clipboard, key bindings, d’n’d, theming, ... Many other libraries are based on GObject: libsoup, gtk-vnc, telepathy, ... Introduction GObject Introspection GSettings Notifications Shell Extensions The End GNOME Shell Workspace and window management Application life cycle Notification system Integrated IM Can be extended in JavaScript much more... Introduction GObject Introspection GSettings Notifications Shell Extensions The End GNOME Shell Workspace and window management Application life cycle Notification system Integrated IM Can be extended in JavaScript much more... Introduction GObject Introspection GSettings Notifications Shell Extensions The End What’s a GObject GLib has it’s own dynamic type system: Non classed: numbers, pointers, ... Instantiable classed types: objects Non-instantiable classed types: interfaces Introduction GObject Introspection GSettings Notifications Shell Extensions The End What’s a GObject GLib has it’s own dynamic type system: Non classed: numbers, pointers, ... Instantiable classed types: objects Non-instantiable classed types: interfaces GObject is the base class of GLib’s type system provides: signals, memory management, per-object properties Written in C, very binding friendly Introduction GObject Introspection GSettings Notifications Shell Extensions The End What is it? python-gtk-vnc gtk-vnc Python foo-gtk-vnc python-notify libnotify Foo foo-notify Introduction GObject Introspection GSettings Notifications Shell Extensions The End What is it? Layer to use GObject based libraries written in C from other languages like: JavaScript (gjs, seed) Python (PyGObject) ruby scheme PHP and more GObject Introspection Only one dynamic binding per language needed to use all GObject introspection enabled libraries. No outdated bindings! Introduction GObject Introspection GSettings Notifications Shell Extensions The End What is it? gtk-vnc PyGObject Python libnotify foo dynamic binding Foo Introduction GObject Introspection GSettings Notifications Shell Extensions The End How does it work? When writing the C library Add annotations to the libraries source code (reference counting, allocation) C library build time Scanner (g-ir-scanner) generates GIR (XML) from sources and built libraries Debian: *-dev packages in /usr/share/gir-1.0/*.gir Compiler (g-ir-compiler) to compile GIR to typelib Debian: gir1.2-* packages in /usr/lib/girepository-1.0/*.typelib Runtime (e.g. gjs or Python+PyGObject) libgirepository to read the introspection data libffi to make library callable from other language Introduction GObject Introspection GSettings Notifications Shell Extensions The End What is it? PyGObject gtk-vnc Python libgirepository + libffi gtk-vnc typelib libnotify foo dynamic binding Foo libnotify typelib Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; Gtk.init(0, null); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; Gtk.init(0, null); var win = new Gtk.Window({title: "GTK-VNC"}); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; const Vnc = imports.gi.GtkVnc; Gtk.init(0, null); var win = new Gtk.Window({title: "GTK-VNC"}); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; const Vnc = imports.gi.GtkVnc; Gtk.init(0, null); var win = new Gtk.Window({title: "GTK-VNC"}); var disp = new Vnc.Display(); win.add(disp); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; const Vnc = imports.gi.GtkVnc; Gtk.init(0, null); var win = new Gtk.Window({title: "GTK-VNC"}); var disp = new Vnc.Display(); win.add(disp); disp.open_host(”localhost”, ”5901”); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; const Vnc = imports.gi.GtkVnc; Gtk.init(0, null); var win = new Gtk.Window({title: "GTK-VNC"}); var disp = new Vnc.Display(); win.add(disp); disp.open_host(”localhost”, ”5901”); win.show_all(); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from JavaScript? JavaScript VNC viewer1 gvncviewer.js - VNC in 10 lines const Gtk = imports.gi.Gtk; const Vnc = imports.gi.GtkVnc; Gtk.init(0, null); var win = new Gtk.Window({title: "GTK-VNC"}); var disp = new Vnc.Display(); win.add(disp); win.connect(’delete-event’, Gtk.main_quit); disp.open_host(”localhost”, ”5901”); win.show_all(); Gtk.main(); 1 Example taken from gtk-vnc/examples Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it from Python? gvncviewer.py - VNC in 9 lines from gi.repository import GtkVnc, Gtk Gtk.init(None) win = Gtk.Window(title="GTK-VNC with Python") disp = GtkVnc.Display() win.add(disp) win.connect(’delete-event’, Gtk.main_quit) disp.open_host("localhost", "5901") win.show_all() Gtk.main() Introduction GObject Introspection GSettings Notifications Shell Extensions The End What do I need? Programming language, dynamic bindings, typelib files JavaScript example apt-get install gjs \ gir1.2-gtk-3.0 \ gir1.2-gtk-vnc-2.0 Python example apt-get install python-gobject \ gir1.2-gtk-3.0 \ gir1.2-gtk-vnc-2.0 Note: no python-gtk-vnc, python-gtk2! Introduction GObject Introspection GSettings Notifications Shell Extensions The End GObjects in JS, Python and C Constructors var win = new Gtk.Window({title: "foo"})); win = Gtk.Window(title="foo") win = g_object_new (GTK_TYPE_WINDOW, "title", "foo", NULL); Signals win.connect("delete-event", callable); win.connect("delete-event", callable); g_signal_connect (win, "delete-event", gcallback, NULL); Properties win["title"]; win.title win.props.title g_object_get (win, "title", &title, NULL); Introduction GObject Introspection GSettings Notifications Shell Extensions The End What is it? API to retrieve and store configuration settings Easy to bind to GObject properties to settings Change notification via signals Supports different backends DConf: store settings key based on disk Memory XML schema describes location and types of keys Vendor overrides possible Delay mode Complex types possible using GVariant obsoletes gconf, gconf-bridge Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it? Shell example gsettings get \ org.gnome.system.proxy.http enabled gsettings set \ org.gnome.system.proxy.http enabled true Python example python proxysettings.py GUI dconf-editor Introduction GObject Introspection GSettings Notifications Shell Extensions The End What do I need? Example apt-get install libglib2.0-bin \ dconf dconf-tools Introduction GObject Introspection GSettings Notifications Shell Extensions The End What is it? GNOME Shell’s message tray displays and manages notifications to the user Notifications: Provide feedback to the user Displayed for a short period of time at the bottom of the screen By default persistent: saved until interacted with or application is opened Less distractive since no need to interact instantly Can be globally disabled Resident and transient notifications possible Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it? gvncviewer.notify.py from gi.repository import Notify Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it? gvncviewer.notify.py from gi.repository import Notify def notify(obj, v): n = Notify.Notification( summary="Connected to %(host)s" % v, body="Made VNC connection to " "server %(host)s at port" " %(port)s" % v) n.set_hint("resident", GLib.Variant(’b’, True)) n.show() Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use it? gvncviewer.notify.py from gi.repository import Notify def notify(obj, v): n = Notify.Notification( summary="Connected to %(host)s" % v, body="Made VNC connection to " "server %(host)s at port" " %(port)s" % v) n.set_hint("resident", GLib.Variant(’b’, True)) n.show() ... disp.connect("vnc-connected", notify, vncserver) Introduction GObject Introspection GSettings Notifications Shell Extensions The End What do I need Python example apt-get install gir1.2-notify-0.7 Introduction GObject Introspection GSettings Notifications Shell Extensions The End GNOME Shell GNOME3 desktop shell written in C and JavaScript Heavily uses Clutter Extendable via JavaScript and GObject Introspection Available Extensions: https://live.gnome.org/GnomeShell/Extensions The shell has a built JavaScript inspector/debugger (ALT-F2 → lg) Introduction GObject Introspection GSettings Notifications Shell Extensions The End How to use them? Create new extension gnome-shell-extension-tool --create-extension Example Example Launch_Iceowl@sigxcpu.org/ Introduction GObject Introspection GSettings Notifications Shell Extensions The End What do I need? Example apt-get install -t experimental gnome-shell Your own extension git clone git://git.gnome.org/gnome-shell.git gjs style guide An idea about GObject Introspection (see above) Introduction GObject Introspection GSettings Notifications Shell Extensions The End Porting to GTK+3, GDBus, GSettings, PyGObject GNOME3 porting guide: http://live.gnome.org/Gnome3PortingGuide GTK+2 → GTK+3: http://developer.gnome.org/gtk3/3.0/migrating.html GConf → GSettings http://developer.gnome.org/gio/stable/ch28.html dbus-glib → GDBus http://developer.gnome.org/gio/unstable/ch29.html python-gtk → PyGObject: http://git.gnome.org/browse/pygobject/tree/pygi-convert.sh Introduction GObject Introspection GSettings Notifications Shell Extensions The End API documentation API Documentation for PyGObject and gjs: Look at the the C API documentation, it’s well documented You can infer Python or JavaScript calls form there Example gtk_widget_show_all(GtkWidget* widget); widget.show_all(); widget.show_all() If in doubt consult the GIR file Introduction GObject Introspection GSettings Notifications Shell Extensions The End API documentation Generating language specific docs from the introspection information is in the works: http://www.j5live.com/2011/08/15/ gobjects-in-berlin-the-search-for-more-documentation/ https://live.gnome.org/GObjectIntrospection/Doctools Development with vim apt-get install vim-syntax-gtk \ devhelp libgtk-3-doc .vimrc autocmd Filetype c nmap <silent> <C-K> :! devhelp -s "<cword>" &<CR><CR> Introduction GObject Introspection GSettings Notifications Shell Extensions The End Thank you Thanks! Questions? Source code and examples are at: git clone git://honk.sigxcpu.org/git/talks/2011-08-gnome3-froscon.git CC BY-SA 3.0 — Creative Commons Attribution-ShareAlike 3.0 Introduction GObject Introspection GSettings Notifications Shell Extensions The End Changes in GTK+, GObject, GLib GObject Introspection GSettings: Settings DB now included GDBus: API to access DBus now included GtkBuilder: UI XML now included GTK+3 uses Cairo Multiple GDK backend support (Wayland, HTML5) Themes use CSS Introduction GObject Introspection GSettings Notifications Shell Extensions The End Changes in GTK+, GObject, GLib GObject Introspection → obsoletes writing language bindings for each library and language GSettings: Settings DB now included → obsoletes GConf GDBus: API to access DBus now included → obsoletes dbus-glib GtkBuilder: UI XML now included → obsoletes libglade GTK+3 uses Cairo → obsoletes GDK drawing API Multiple GDK backend support (Wayland, HTML5) Themes use CSS Introduction GObject Introspection GSettings Notifications Shell Extensions The End Changes in GTK+, GObject, GLib GObject Introspection → obsoletes writing language bindings for each library and language GSettings: Settings DB now included → obsoletes GConf GDBus: API to access DBus now included → obsoletes dbus-glib GtkBuilder: UI XML now included → obsoletes libglade GTK+3 uses Cairo → obsoletes GDK drawing API Multiple GDK backend support (Wayland, HTML5) Themes use CSS Introduction GObject Introspection GSettings Notifications Shell Extensions The End Annotations example /** * soup_message_body_append_take: * @body: a #SoupMessageBody * @data: (array length=length) (transfer full): data to append * @length: length of @data * * Appends @length bytes from @data to @body. * * This function is exactly equivalent to soup_message_body_apppend() * with %SOUP_MEMORY_TAKE as second argument; it exists mainly for * convenience and simplifying language bindings. * * Since: 2.32 * Rename to: soup_message_body_append **/ void soup_message_body_append_take (SoupMessageBody *body, guchar *data, gsize length) { soup_message_body_append(body, SOUP_MEMORY_TAKE, data, length); }
Authors Guido Günther
License CC-BY-SA-3.0