56
Writing Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational Dynamics Davyd Madeley Fugro Seismic Imaging

Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Writing Really RadGTK+ & GNOME

Applicationsin C, Python or Java

Andrew CowieOperational Dynamics

Davyd MadeleyFugro Seismic Imaging

Page 2: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Who Are We?

Andrew Cowiespends an awful lot of time programming for someone who is actually a suit. He started with C in the early 80s, picked up Java in 1997, and now, 10 years later, is the maintainer of the java-gnome project.

Davyd Madeleyhas been programming for a long time. He now works as a software engineer, writing GTK applications for geophysical analysis. Previously he was the gnome-applets maintainer. He plays the tenor saxophone.

Page 3: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

An Overview

● Why choose GTK+ for your application?

● GTK+ Fundamentals

– Building a UI– Box packing– The main loop & signals

● Getting started (in C)

● Window tricks (in Java)

● Complex data models (in Python)

Page 4: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Why Would You Choose GTK+?

● Fast, flexible, ubiquitous● Multi-platform

– Linux, Unix, Mac OS, Win32, and more

● Many languages– C, Python and Java– Perl, C++, Ruby, Haskell, C#, PHP, OCml, Eiffel,

Erlang, Guile/Scheme/Lisp, Lua, Octave, D, TCL, Smalltalk, and more!

● LGPL

Page 5: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

A Word on Versions

● Today we're using the following:– gcc 4.1.x– GTK+ 2.12.x– Python 2.5– pyGTK 2.10– Sun Java 1.5 (& Free Java too!)– Eclipse 3.3.x– java-gnome 4.0.6rc1– Glade 3.4.x

Page 6: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Widgets 'n stuff

● all displayed items are a GtkWidget; all interfaces are built down from a “top level”, inevitably GtkWindow

Page 7: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Building a UI

● You can write code ...– Programmatically create elaborate custom content,

dynamic layouts, and smaller Widgets

Page 8: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

C Demo!

A GtkWindow

with aGtkButton

in it!

Page 9: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Compiling

gcc -o demo \`pkg-config --cflags --libs \ gtk+-2.0` demo.c

Page 10: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Building a UI

● You can write code ...– Programmatically create elaborate custom content,

dynamic layouts, and smaller Widgets

● or use Glade ...– Great for big, complex windows with lots of Layout

Page 11: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

C Demo!

A GtkWindow

with aGtkButtonwith Glade!

Page 12: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Building a UI

● You can write code ...– Programmatically create elaborate custom content,

dynamic layouts, and smaller Widgets

● or use Glade ...– Great for big, complex windows with lots of Layout

● or do both simultaneously!– No point using Glade if coding it directly is less

lines of code– Use Glade for most of Window (ie, Labels) and

code for the dynamically generated bits

Page 13: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

GTK+ uses a“box packing”

model.

Page 14: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

● Start with a GtkWindow

Page 15: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

● Start with a GtkWindow

● Pack a GtkVBox into the Window

Page 16: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

● Start with a GtkWindow

● Pack a GtkVBox into the Window

● Pack a GtkLabel into the VBox

Page 17: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

● Start with a GtkWindow

● Pack a GtkVBox into the Window

● Pack a GtkLabel into the VBox

● Pack a GtkButton into the VBox

Page 18: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

● Start with a GtkWindow

● Pack a GtkVBox into the Window

● Pack a GtkLabel into the VBox

● Pack a GtkButton into the VBox

● Pack a GtkStatusbar into the VBox

Page 19: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Box Packing

● Start with a GtkWindow

● Pack a GtkVBox into the Window

● Pack a GtkLabel into the VBox

● Pack a GtkButton into the VBox

● Pack a GtkStatusbar into the VBox

Page 20: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Button an atomic element, right?

GtkButton

Page 21: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Button is a composite Widget too!

GtkHBox

Page 22: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Button an atomic element, right?

GtkImage GtkLabel

Page 23: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Or go the other way. Your icon,

GtkImage

Page 24: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

...some text...

GtkLabel

Page 25: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

a Container to hold them

GtkHBox

Page 26: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

pack 'em in

GtkLabelGtkImage

Page 27: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

and you've got your Widget

MyCustomButton

Page 28: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Glade Demo!

UsingGlade

to do complexBox packing

layouts

Page 29: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Packing Containers

● GtkVBox – vertical packing

● GtkHBox – horizontal packing

● GtkTable – rows and columns

● GtkHButtonBox – Buttons horizontally

● GtkAlignment – fine grained layout control.

Also,● GtkSizeGroup – child Widgets share same

horizontal/vertical size.

Page 30: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

The Main Loop

● GUI programming is event driven programming● The main loop polls sources for events● events include user activity (keyboard or

mouse), I/O, or a timeout● events issued as named signals; register

callbacks for signals you want to react to

Page 31: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

The Main Loop

Callbacks for events are issued from the main loop...

... one at a time

... and it's single threaded!

DON'T BLOCK THE MAIN LOOP!

Page 32: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Signals

● Signals are connected to GObjects

● Often you pass 4 things:– object– signal name– callback function– optional free-form “user data”

● Prototype for each callback in API docs● Some callbacks return information to GTK+

(eg a gboolean)

Page 33: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Signals – C

g_signal_connect(my_gobject, “notify::parent”, G_CALLBACK(notify_parent_cb), NULL);

void notify_parent_cb(GObject *my_gobject, GParamSpec arg1, gpointer user_data){

...

}

Page 34: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

C Demo!

Hooking up asignal

Page 35: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Signals

● Some signals already have handlers registered– eg. expose-event

● Some signals are passed up the widget tree from your widget all the way to the toplevel– eg. expose-event, enter-notify-event– You can choose whether or not to stop these in

your signal handler by returning True or False

Page 36: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Java Demo!

Same code, different language:

Java

Page 37: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

gtk_widget_show_all()

A Widget must be show()n

to be seen

Size request and allocation does not happen until the Widget is mapped.

Page 38: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

delete-event

Closing a Window!=

Terminating application

Beware the main loop!

Page 39: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

GtkFileChooser

Choose a file,any file

Page 40: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Python Demo!

Same code, different language:

Python

Page 41: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

GtkTreeView

● Can display trees or lists of data● Uses an model, view, control (MVC) paradigm● You need three things:

– a GtkTreeView

– a GtkTreeModel (GtkTreeStore, GtkListStore or write your own)

– GtkCellRenderers

● You can store more data in a row than you display (handy!)

Page 42: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Python Demo!

See the gtk.TreeView for

the Forrest

Page 43: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Getting More Out of GTK+/GNOME

● GConf – store configuration data● GNOME-VFS – access data over networks● Cairo – antialiased vector graphics● GooCanvas – Cairo based canvas widget● D-BUS – cross-desktop IPC with GLib tie-in● Soup – HTTP, XML-RPC and SOAP libraries● libwnck – Access window information● libnotify – Popup balloons

Page 44: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

GConf

GConf

Page 45: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

GConf

What GConf is for:● user preferences and settings

What GConf is not for:● storing application state● IPC● general purpose data storage (use a DB)

Page 46: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

GConf

● GConf keys are stored in a hierarchy and have a type (e.g. String, Boolean, Integer, List):– /apps/nautilus/desktop/computer_icon_visible– /desktop/gnome/background/picture_filename

● Don't go creating your own top level directories. Your application's settings go in /apps.

● You can get or set keys or connect a signal for when they change

Page 47: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

GConf

AGConf

Example

Page 48: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Design and Usability

Getting thatGNOME

Style

Page 49: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Design and Usability

● Dialog button order matters!● Use stock icons whenever possible● Use default fonts, sizes, and colours; theme is

the user's choice, not yours.● Be consistent with other applications● Human Interface Guidelines (“the HIG”) just

that: guidelines

Page 50: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Translation (i18n/l10n)

Translation

Page 51: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Translation (i18n/l10n)

● Native language only:

g_print(“Hello World”);

:

Page 52: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Translation (i18n/l10n)

● Translatable...

g_print(_(“Hello World”));

:

Page 53: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Translation (i18n/l10n)

● fr.po (French Translation)

# ../src/hello.c:4

msgid “Hello World”

msgstr “Bonjour Monde”

:

Page 54: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Translation (i18n/l10n)

● Provided via GNU gettext● Requires some build infrastructure● GNOME's enthusiastic translation team can

help!

Page 55: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Would Ye Like To Know More?

● In C:

– http://www.gtk.org/tutorial/– Matthias Warkus, The Official GNOME 2

Developer's Guide (No Starch Press, 2004)

– Andrew Krause, Foundations of GTK+ Development (Apress, 2007)

● In Java:

– http://java-gnome.sourceforge.net/4.0/doc/● In Python:

– http://www.pygtk.org/pygtk2tutorial/index.html

Page 56: Writing Really Rad GTK+ & GNOME Applicationsgiles/2008/lca/mirror/slides/227-rad_gtk_apps.pdfWriting Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Operational

Fin ;)Questions?

www.davyd.id.au/articles.shtml

operationaldynamics.com/talks