Javascript can be used to develop applications and interfaces for the GNOME desktop environment. GNOME 3 introduced the GNOME Shell, which uses Javascript and the GObject Introspection system to interface GNOME libraries. GObject Introspection extracts metadata from C libraries to make them accessible from Javascript via bindings. This allows Javascript programs to import and use functionality from GNOME libraries. There are two engines for running GNOME Javascript code: GJS, which uses Mozilla's Spidermonkey, and Seed, which uses Apple's JavascriptCore. Both provide access to GNOME libraries but have some differences. Tools and documentation are still works in progress areas as GNOME Javascript continues to evolve.
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
Javascript Programming with GNOME Libraries
1. Javascript, the GNOME way
Berlin, October 2nd, 2011
(follow the talk at http://10.109.2.56:8080)
2. A bit about of me
Eduardo Lima Mitev <elima@igalia.com>
Web apps developer, GNOME developer, eventdance, hildon-input-methods, libmeegotouch, filetea, ...
Not a gnome-shell/G-I/GJS core hacker myself, just a messenger...
7. GNOME 3 was released in April 2011
http://www.gnome.org/gnome-3/
8. GNOME 3 was released in April 2011
A major breakthrough in design
HW acceleration for graphics
Tons of cleaning up and restructuring of the stack
The gnome-shell to be the default UX
... and GNOME met Javascript
9. The gnome-shell
A modern, integrated user experience
Acts as a compositing manager for the desktop
Handles application launching, window switching, multiple desktops, and much more
Interfaces GNOME libraries using Javascript as glue
29,497 lines of Javascript code (39,538 of C)
13. what is gobject-introspection?
A set of tools for extracting and accessing the metadata of a
library's API in a convenient way for other programs to use it.
library APIs must be "annotated" and designed to be "introspection friendly"
14. gobject-introspection goals
Enable two level applications: C and <your favorite runtime>;
Share binding infrastructure work;
Other uses like API verification, improving documentation tools, etc
17. GIR file
An XML description of a library API
Can include documentation
Example: ZLibCompressor class from GIO's GIR
<class name="ZlibCompressor"
c:symbol-prefix="zlib_compressor"
c:type="GZlibCompressor"
parent="GObject.Object"
glib:type-name="GZlibCompressor"
glib:get-type="g_zlib_compressor_get_type"
glib:type-struct="ZlibCompressorClass">
<doc xml:whitespace="preserve">Zlib decompression</doc>
<implements name="Converter"/>
<constructor name="new"
c:identifier="g_zlib_compressor_new"
version="2.24">
<doc xml:whitespace="preserve">Creates a new #GZlibCompressor.</doc>
<return-value transfer-ownership="full">
<doc xml:whitespace="preserve">a new #GZlibCompressor</doc>
18. Typelib file
A binary representation of the GIR file for faster access during
run-time.
19. GIRepository: API for retrieving library info from a typelib file
http://moodleman.moodle.com.au/archives/202
20. libffi: fantasy fiction foreign function interface
http://moodleman.moodle.com.au/archives/202
21. Annotations
Go inline in the code (normally in the .c files)
Complement the API description with semantic information
Normally "guessed" correctly by the scanner
Documented at https://live.gnome.org/GObjectIntrospection/Annotations
26. GJS vs. Seed
GJS wraps Mozilla's Spidermonkey engine while Seed wraps Apple's JavascriptCore
GJS supports language features from ES-Harmony (let, const, etc), Seed doesn't (as of now)
GJS is more mature, it powers gnome-shell at the moment
Other minor differences (i.e module extensions, etc)
both have a fairly good G-I support
28. node-gir
G-I support for Node
early stage of development
written by Tim Caswell
code at https://github.com/creationix/node-gir
Why not use Seed or GJS?
"Because they are nice, but not what I'm looking for. Node is really popular and it would be nice to be able to
use it for desktop tools and applications.", Tim Caswell
31. Importing modules
No 'require', sorry
The 'imports' keyword
Importing is an assignment, not a function call
The full module's global scope is imported
'imports.searchPath' similar to 'require.paths'
Only synchronous
32. Importing a Javascript module
// this will import file 'path/to/my/module.js'
var MyModule = imports.path.to.my.module;
// this will import 'lib/Http.js'
var Http = imports.lib.Http;
// using 'const' here is nice but only works in GJS :)
const Promise = imports.lib.Promise;
33. Importing a module from the G-I repository
// this will import GLib library namespace
var GLib = imports.gi.GLib;
// this will import GTK+ library namespace
// for API version 3.0
var Gtk = imports.gi.Gtk-3.0;
// in recent versions of GJS you can do
var Gtk = imports.gi.Gtk = 3.0;
34. Importing modules
There are also native Javascript modules for more convenient
APIs, i.e: mainloop, dbus, lang, signals.
35. Importing a native JS module
// built-in JS modules are always accessible
// from the root importer
var Mainloop = imports.mainloop;
var DBus = imports.dbus;
36. Using G-I APIs
There are "well defined" rules for mapping the C symbols to their
corresponding Javascript syntax
37. Using G-I APIs: Functions
Library functions are mapped to Namespace.function:
g_timeout_add(...) becomes GLib.timeout_add(...)
38. Using G-I APIs: GObject methods
GObject methods are mapped to Namespace.Class.method:
gtk_button_new_with_label(...) becomes Gtk.Button.new_with_label(...)
39. Using G-I APIs: Enums
Enums are mapped to Namespace.EnumName.VALUE:
GST_STATE_PLAYING becomes Gst.State.PLAYING,
CLUTTER_STAGE_STATE_FULLSCREEN becomes Clutter.StageState.FULLSCREEN
40. Using G-I APIs: GObject properties
GObject properties are mapped to normal Javascript Object members replacing '-' by '_':
Property 'use-markup' of a GtkLabel becomes obj.use_markup
41. Using G-I APIs: GObject signals
GJS
obj.connect(signalName, callback) method is used to connect to GObject signals:
obj.connect('destroy', callback);
Seed:
A bit different: obj.signal["signal name"].connect(callback)
obj.signal['destroy'].connect(callback);
43. Documentation
No official documentation for Javascript bindings yet
Unofficial documentation at http://www.roojs.org/index.php/projects/gnome/introspection-docs.html
A hot topic right now
44. What about development tools?
http://blog.doomby.com/blog,7-of-the-best-free-website-development-tools,311404.html
45. Development tools
No specific developer tools for Javascript at the moment
Still too early: remains unclear what the needs will be
46. GNOME Javascript and CommonJS?
There is certain interest in the GNOME community, but
Not all CommonJS specs could make sense
More discussion and bridging is needed
node-gir?
gjs-commonjs?
47. gjs-commonjs
Wraps GJS to add CommonJS APIs
Just an experiment, not the way to go
Code at https://gitorious.org/gjs-commonjs (LGPL)
Only Modules 1.1 and Promises/D (partially) at the moment
48. Current issues and challenges
To complete introspection support in GNOME libraries
To complete introspection support in GJS/Seed
To have official documentation
To make GJS and Seed code fully compatible
To align with CommonJS for what makes sense
49. Final thoughts
An elegant and efficient combination of low-level and high-level languages
JS opened to a platform with 10+ years of evolution
Very convenient for fast prototyping and gluing
Expands the frontiers of JS in the desktop
50. An awesome stack!
your Javascript programs
GJS
(Spidermonkey)
Seed (JSC) node-gir (V8) ...
gobject introspection
Core
GIO
GLib
GObject
User
interface
GTK+
Cairo
Clutter
ATK
Pango
Webkit
Multimedia
gstreamer
Canberra
Pulseaudio
Communication
Telepathy
Avahi
GUPnP
Data
storage
EDS
GDA
Tracker
Utilities
Champlain
Enchant
Poppler
GeoClue
Desktop
integration
PackageKit
libnotify
seahorse
System
integration
upower
udisks
policykit