Writing Really Rad GTK+ & GNOME Applications in C, Python or - - PowerPoint PPT Presentation

writing really rad gtk gnome applications
SMART_READER_LITE
LIVE PREVIEW

Writing Really Rad GTK+ & GNOME Applications in C, Python or - - PowerPoint PPT Presentation

Writing Really Rad GTK+ & GNOME Applications in C, Python or Java Andrew Cowie Davyd Madeley Operational Dynamics Fugro Seismic Imaging Who Are We? Andrew Cowie Davyd Madeley spends an awful lot of has been time programming


slide-1
SLIDE 1

Writing Really Rad GTK+ & GNOME Applications

in C, Python or Java

Andrew Cowie

Operational Dynamics

Davyd Madeley

Fugro Seismic Imaging

slide-2
SLIDE 2

Who Are We?

Andrew Cowie spends 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 Madeley has 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.

slide-3
SLIDE 3

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)
slide-4
SLIDE 4

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
slide-5
SLIDE 5

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

slide-6
SLIDE 6

Widgets 'n stuff

  • all displayed items are a GtkWidget; all

interfaces are built down from a “top level”, inevitably GtkWindow

slide-7
SLIDE 7

Building a UI

  • You can write code ...

– Programmatically create elaborate custom content,

dynamic layouts, and smaller Widgets

slide-8
SLIDE 8

C Demo!

A GtkWindow with a GtkButton in it!

slide-9
SLIDE 9

Compiling

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

slide-10
SLIDE 10

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

slide-11
SLIDE 11

C Demo!

A GtkWindow with a GtkButton with Glade!

slide-12
SLIDE 12

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

slide-13
SLIDE 13

Box Packing

GTK+ uses a “box packing” model.

slide-14
SLIDE 14

Box Packing

  • Start with a GtkWindow
slide-15
SLIDE 15

Box Packing

  • Start with a GtkWindow
  • Pack a GtkVBox into the Window
slide-16
SLIDE 16

Box Packing

  • Start with a GtkWindow
  • Pack a GtkVBox into the Window
  • Pack a GtkLabel into the VBox
slide-17
SLIDE 17

Box Packing

  • Start with a GtkWindow
  • Pack a GtkVBox into the Window
  • Pack a GtkLabel into the VBox
  • Pack a GtkButton into the VBox
slide-18
SLIDE 18

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
slide-19
SLIDE 19

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
slide-20
SLIDE 20

Button an atomic element, right?

GtkButton

slide-21
SLIDE 21

Button is a composite Widget too!

GtkHBox

slide-22
SLIDE 22

Button an atomic element, right?

GtkImage GtkLabel

slide-23
SLIDE 23

Or go the other way. Your icon,

GtkImage

slide-24
SLIDE 24

...some text...

GtkLabel

slide-25
SLIDE 25

a Container to hold them

GtkHBox

slide-26
SLIDE 26

pack 'em in

GtkLabel GtkImage

slide-27
SLIDE 27

and you've got your Widget

MyCustomButton

slide-28
SLIDE 28

Glade Demo!

Using Glade to do complex Box packing layouts

slide-29
SLIDE 29

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.

slide-30
SLIDE 30

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

slide-31
SLIDE 31

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!

slide-32
SLIDE 32

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)

slide-33
SLIDE 33

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) { ... }

slide-34
SLIDE 34

C Demo!

Hooking up a signal

slide-35
SLIDE 35

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

slide-36
SLIDE 36

Java Demo!

Same code, different language: Java

slide-37
SLIDE 37

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.

slide-38
SLIDE 38

delete-event

Closing a Window != Terminating application

Beware the main loop!

slide-39
SLIDE 39

GtkFileChooser

Choose a file, any file

slide-40
SLIDE 40

Python Demo!

Same code, different language: Python

slide-41
SLIDE 41

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!)

slide-42
SLIDE 42

Python Demo!

See the gtk.TreeView for the Forrest

slide-43
SLIDE 43

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
slide-44
SLIDE 44

GConf

GConf

slide-45
SLIDE 45

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)
slide-46
SLIDE 46

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

slide-47
SLIDE 47

GConf

A GConf Example

slide-48
SLIDE 48

Design and Usability

Getting that GNOME Style

slide-49
SLIDE 49

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

slide-50
SLIDE 50

Translation (i18n/l10n)

Translation

slide-51
SLIDE 51

Translation (i18n/l10n)

  • Native language only:

g_print(“Hello World”); :

slide-52
SLIDE 52

Translation (i18n/l10n)

  • Translatable...

g_print(_(“Hello World”)); :

slide-53
SLIDE 53

Translation (i18n/l10n)

  • fr.po (French Translation)

# ../src/hello.c:4 msgid “Hello World” msgstr “Bonjour Monde” :

slide-54
SLIDE 54

Translation (i18n/l10n)

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

help!

slide-55
SLIDE 55

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

slide-56
SLIDE 56

Fin ;)

Questions? www.davyd.id.au/articles.shtml

  • perationaldynamics.com/talks