diff options
Diffstat (limited to 'gtk+-mingw/share/gtk-doc/html/gtk3/gtk-getting-started.html')
-rw-r--r-- | gtk+-mingw/share/gtk-doc/html/gtk3/gtk-getting-started.html | 1095 |
1 files changed, 0 insertions, 1095 deletions
diff --git a/gtk+-mingw/share/gtk-doc/html/gtk3/gtk-getting-started.html b/gtk+-mingw/share/gtk-doc/html/gtk3/gtk-getting-started.html deleted file mode 100644 index c73fec5..0000000 --- a/gtk+-mingw/share/gtk-doc/html/gtk3/gtk-getting-started.html +++ /dev/null @@ -1,1095 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -<title>Getting Started with GTK+</title> -<meta name="generator" content="DocBook XSL Stylesheets V1.76.1"> -<link rel="home" href="index.html" title="GTK+ 3 Reference Manual"> -<link rel="up" href="gtk.html" title="Part I. GTK+ Overview"> -<link rel="prev" href="gtk.html" title="Part I. GTK+ Overview"> -<link rel="next" href="gtk-building.html" title="Compiling the GTK+ libraries"> -<meta name="generator" content="GTK-Doc V1.18.1 (XML mode)"> -<link rel="stylesheet" href="style.css" type="text/css"> -</head> -<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> -<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"> -<td><a accesskey="p" href="gtk.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td> -<td><a accesskey="u" href="gtk.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td> -<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td> -<th width="100%" align="center">GTK+ 3 Reference Manual</th> -<td><a accesskey="n" href="gtk-building.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td> -</tr></table> -<div class="chapter"> -<div class="titlepage"><div><div><h2 class="title"> -<a name="gtk-getting-started"></a>Getting Started with GTK+</h2></div></div></div> -<p>This chapter is contains some tutorial information to get you - started with GTK+ programming. It assumes that you have GTK+, its - dependencies and a C compiler installed and ready to use. If you - need to build GTK+ itself first, refer to the - <a class="link" href="gtk-compiling.html" title="Compiling GTK+ Applications">Compiling the GTK+ libraries</a> - section in this reference.</p> -<div class="simplesect"> -<div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id511213"></a>Basics</h2></div></div></div> -<p>To begin our introduction to GTK, we'll start with the simplest - program possible. This program will create an empty 200x200 pixel - window:</p> -<p> - <img src="window-default.png"> - </p> -<div class="informalexample"> - <table class="listing_frame" border="0" cellpadding="0" cellspacing="0"> - <tbody> - <tr> - <td class="listing_lines" align="right"><pre>1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20</pre></td> - <td class="listing_code"><pre class="programlisting"><span class="preproc">#include</span><span class="normal"> </span><span class="string"><gtk/gtk.h></span> - -<span class="type">int</span> -<span class="function">main</span><span class="normal"> </span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span> -<span class="type">char</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">argv</span><span class="symbol">[])</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">window</span><span class="symbol">;</span> - -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-init">gtk_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">argc</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">argv</span><span class="symbol">);</span> - -<span class="normal"> window </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-new">gtk_window_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-Standard-Enumerations.html#GTK-WINDOW-TOPLEVEL:CAPS">GTK_WINDOW_TOPLEVEL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"destroy"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-General.html#gtk-main-quit">gtk_main_quit</a></span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-show">gtk_widget_show</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-main">gtk_main</a></span><span class="normal"> </span><span class="symbol">();</span> - -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> -<span class="cbracket">}</span></pre></td> - </tr> - </tbody> - </table> -</div> - -<p>You can compile the program above with GCC using:</p> -<div class="literallayout"><p><br> - <code class="literal">gcc `pkg-config --cflags gtk+-3.0` -o window-default window-default.c `pkg-config --libs gtk+-3.0`</code><br> - </p></div> -<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"> -<h3 class="title">Note</h3> -<p>For more information on how to compile a GTK+ application, please - refer to the <a class="link" href="gtk-compiling.html" title="Compiling GTK+ Applications">Compiling GTK+ Applications</a> - section in this reference.</p> -</div> -<p>All GTK+ applications will, of course, include - <code class="filename">gtk/gtk.h</code>, which declares functions, types and - macros required by GTK+ applications.</p> -<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"> -<h3 class="title">Warning</h3> -<p>Even if GTK+ installs multiple header files, only the - top-level <code class="filename">gtk/gtk.h</code> header can be directly included - by third party code. The compiler will abort with an error if any other - header is directly included.</p> -</div> -<p>We then proceed into the <code class="function">main</code>() function of the - application, and we declare a <code class="varname">window</code> variable as a pointer - of type <a class="link" href="GtkWidget.html" title="GtkWidget"><span class="type">GtkWidget</span></a>.</p> -<p>The following line will call <a class="link" href="gtk3-General.html#gtk-init" title="gtk_init ()"><code class="function">gtk_init()</code></a>, which - is the initialization function for GTK+; this function will set up GTK+, - the type system, the connection to the windowing environment, etc. The - <a class="link" href="gtk3-General.html#gtk-init" title="gtk_init ()"><code class="function">gtk_init()</code></a> takes as arguments the pointers to the command line arguments - counter and string array; this allows GTK+ to parse specific command line - arguments that control the behavior of GTK+ itself. The parsed arguments - will be removed from the array, leaving the unrecognized ones for your - application to parse.</p> -<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"> -<h3 class="title">Note</h3> -<p>For more information on which command line arguments GTK+ - recognizes, please refer to the <a class="link" href="gtk-running.html" title="Running GTK+ Applications">Running GTK+ - Applications</a> section in this reference.</p> -</div> -<p>The call to <a class="link" href="GtkWindow.html#gtk-window-new" title="gtk_window_new ()"><code class="function">gtk_window_new()</code></a> will create a new <a class="link" href="GtkWindow.html" title="GtkWindow"><span class="type">GtkWindow</span></a> and store - it inside the <code class="varname">window</code> variable. The type of the window - is <a class="link" href="gtk3-Standard-Enumerations.html#GTK-WINDOW-TOPLEVEL:CAPS"><code class="literal">GTK_WINDOW_TOPLEVEL</code></a>, which means that the <a class="link" href="GtkWindow.html" title="GtkWindow"><span class="type">GtkWindow</span></a> will be managed - by the windowing system: it will have a frame, a title bar and window - controls, depending on the platform.</p> -<p>In order to terminate the application when the <a class="link" href="GtkWindow.html" title="GtkWindow"><span class="type">GtkWindow</span></a> is - destroyed, we connect the <a class="link" href="GtkWidget.html#GtkWidget-destroy" title='The "destroy" signal'><span class="type">"destroy"</span></a> signal to the <a class="link" href="gtk3-General.html#gtk-main-quit" title="gtk_main_quit ()"><code class="function">gtk_main_quit()</code></a> - function. This function will terminate the GTK+ main loop started by calling - <a class="link" href="gtk3-General.html#gtk-main" title="gtk_main ()"><code class="function">gtk_main()</code></a> later. The <a class="link" href="GtkWidget.html#GtkWidget-destroy" title='The "destroy" signal'><span class="type">"destroy"</span></a> signal is emitted when a widget is - destroyed, either by explicitly calling <a class="link" href="GtkWidget.html#gtk-widget-destroy" title="gtk_widget_destroy ()"><code class="function">gtk_widget_destroy()</code></a> or when the - widget is unparented. Top-level <a class="link" href="GtkWindow.html" title="GtkWindow"><span class="type">GtkWindow</span></a>s are also destroyed when - the Close window control button is clicked.</p> -<p><a class="link" href="GtkWidget.html" title="GtkWidget"><span class="type">GtkWidget</span></a>s are hidden by default. By calling <a class="link" href="GtkWidget.html#gtk-widget-show" title="gtk_widget_show ()"><code class="function">gtk_widget_show()</code></a> - on a <a class="link" href="GtkWidget.html" title="GtkWidget"><span class="type">GtkWidget</span></a> we are asking GTK+ to set the visibility attribute so that it - can be displayed. All this work is done after the main loop has been - started.</p> -<p>The last line of interest is the call to <a class="link" href="gtk3-General.html#gtk-main" title="gtk_main ()"><code class="function">gtk_main()</code></a>. This function will - start the GTK+ main loop and will block the control flow of the - <code class="function">main()</code> until the <a class="link" href="gtk3-General.html#gtk-main-quit" title="gtk_main_quit ()"><code class="function">gtk_main_quit()</code></a> function is called.</p> -<p>While the program is running, GTK+ is receiving - <em class="firstterm">events</em>. These are typically input events caused by - the user interacting with your program, but also things like messages from - the window manager or other applications. GTK+ processes these and as a - result, <em class="firstterm">signals</em> may be emitted on your widgets. - Connecting handlers for these signals is how you normally make your - program do something in response to user input.</p> -<p>The following example is slightly more complex, and tries to - showcase some of the capabilities of GTK+.</p> -<p>In the long tradition of programming languages and libraries, - it is called <span class="emphasis"><em>Hello, World</em></span>.</p> -<p> - <img src="hello-world.png"> - </p> -<div class="example"> -<a name="gtk-getting-started-hello-world"></a><p class="title"><b>Example 1. Hello World in GTK+</b></p> -<div class="example-contents"> - <table class="listing_frame" border="0" cellpadding="0" cellspacing="0"> - <tbody> - <tr> - <td class="listing_lines" align="right"><pre>1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104</pre></td> - <td class="listing_code"><pre class="programlisting"><span class="preproc">#include</span><span class="normal"> </span><span class="string"><gtk/gtk.h></span> - -<span class="comment">/* This is a callback function. The data arguments are ignored</span> -<span class="comment"> * in this example. More on callbacks below.</span> -<span class="comment"> */</span> -<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span> -<span class="function">print_hello</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Hello World</span><span class="specialchar">\n</span><span class="string">"</span><span class="symbol">);</span> -<span class="cbracket">}</span> - -<span class="keyword">static</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean">gboolean</a></span> -<span class="function">on_delete_event</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">GdkEvent</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">event</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="comment">/* If you return FALSE in the "delete_event" signal handler,</span> -<span class="comment"> * GTK will emit the "destroy" signal. Returning TRUE means</span> -<span class="comment"> * you don't want the window to be destroyed.</span> -<span class="comment"> *</span> -<span class="comment"> * This is useful for popping up 'are you sure you want to quit?'</span> -<span class="comment"> * type dialogs.</span> -<span class="comment"> */</span> - -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"delete event occurred</span><span class="specialchar">\n</span><span class="string">"</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS">TRUE</a></span><span class="symbol">;</span> -<span class="cbracket">}</span> - -<span class="type">int</span> -<span class="function">main</span><span class="normal"> </span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span> -<span class="normal"> </span><span class="type">char</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">argv</span><span class="symbol">[])</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="comment">/* GtkWidget is the storage type for widgets */</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">window</span><span class="symbol">;</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">button</span><span class="symbol">;</span> - -<span class="normal"> </span><span class="comment">/* This is called in all GTK applications. Arguments are parsed</span> -<span class="comment"> * from the command line and are returned to the application.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-init">gtk_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">argc</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">argv</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* create a new window, and set its title */</span> -<span class="normal"> window </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-new">gtk_window_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-Standard-Enumerations.html#GTK-WINDOW-TOPLEVEL:CAPS">GTK_WINDOW_TOPLEVEL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-set-title">gtk_window_set_title</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_WINDOW</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> </span><span class="string">"Hello"</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* When the window emits the "delete-event" signal (which is emitted</span> -<span class="comment"> * by GTK+ in response to an event coming from the window manager,</span> -<span class="comment"> * usually as a result of clicking the "close" window control), we</span> -<span class="comment"> * ask it to call the on_delete_event() function as defined above.</span> -<span class="comment"> *</span> -<span class="comment"> * The data passed to the callback function is NULL and is ignored</span> -<span class="comment"> * in the callback function.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"delete-event"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">on_delete_event</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Here we connect the "destroy" event to the gtk_main_quit() function.</span> -<span class="comment"> *</span> -<span class="comment"> * This signal is emitted when we call gtk_widget_destroy() on the window,</span> -<span class="comment"> * or if we return FALSE in the "delete_event" callback.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"destroy"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-General.html#gtk-main-quit">gtk_main_quit</a></span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Sets the border width of the window. */</span> -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-set-border-width">gtk_container_set_border_width</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> </span><span class="number">10</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Creates a new button with the label "Hello World". */</span> -<span class="normal"> button </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkButton.html#gtk-button-new-with-label">gtk_button_new_with_label</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Hello World"</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* When the button receives the "clicked" signal, it will call the</span> -<span class="comment"> * function print_hello() passing it NULL as its argument.</span> -<span class="comment"> *</span> -<span class="comment"> * The print_hello() function is defined above.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"clicked"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">print_hello</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* The g_signal_connect_swapped() function will connect the "clicked" signal</span> -<span class="comment"> * of the button to the gtk_widget_destroy() function; instead of calling it</span> -<span class="comment"> * using the button as its argument, it will swap it with the user data</span> -<span class="comment"> * argument. This will cause the window to be destroyed by calling</span> -<span class="comment"> * gtk_widget_destroy() on the window.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect-swapped">g_signal_connect_swapped</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"clicked"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="GtkWidget.html#gtk-widget-destroy">gtk_widget_destroy</a></span><span class="symbol">),</span><span class="normal"> window</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* This packs the button into the window. A GtkWindow inherits from GtkBin,</span> -<span class="comment"> * which is a special container that can only have one child</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-add">gtk_container_add</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> button</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* The final step is to display this newly created widget... */</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-show">gtk_widget_show</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* ... and the window */</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-show">gtk_widget_show</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* All GTK applications must have a gtk_main(). Control ends here</span> -<span class="comment"> * and waits for an event to occur (like a key press or a mouse event),</span> -<span class="comment"> * until gtk_main_quit() is called.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-main">gtk_main</a></span><span class="normal"> </span><span class="symbol">();</span> - -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> -<span class="cbracket">}</span></pre></td> - </tr> - </tbody> - </table> -</div> - -</div> -<br class="example-break"> -</div> -<div class="simplesect"> -<div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id508058"></a>Packing</h2></div></div></div> -<p>When creating an application, you'll want to put more than one widget - inside a window. Our first helloworld example only used one widget so we - could simply use a <a class="link" href="GtkContainer.html#gtk-container-add" title="gtk_container_add ()"><code class="function">gtk_container_add()</code></a> call to "pack" the widget into the - window. But when you want to put more than one widget into a window, it - it becomes important to control how each widget is positioned and sized. - This is where packing comes in.</p> -<p>GTK+ comes with a large variety of <em class="firstterm">layout containers</em> - whose purpose it is to control the layout of the child widgets that are - added to them. See <a class="xref" href="LayoutContainers.html" title="Layout Containers"><i>Layout Containers</i></a> for an overview.</p> -<p>The following example shows how the GtkGrid container lets you - arrange several buttons:</p> -<p> - <img src="grid-packing.png"> - </p> -<div class="example"> -<a name="gtk-getting-started-grid-packing"></a><p class="title"><b>Example 2. Packing buttons</b></p> -<div class="example-contents"> - <table class="listing_frame" border="0" cellpadding="0" cellspacing="0"> - <tbody> - <tr> - <td class="listing_lines" align="right"><pre>1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73</pre></td> - <td class="listing_code"><pre class="programlisting"><span class="preproc">#include</span><span class="normal"> </span><span class="string"><gtk/gtk.h></span> - -<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span> -<span class="function">print_hello</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Hello World</span><span class="specialchar">\n</span><span class="string">"</span><span class="symbol">);</span> -<span class="cbracket">}</span> - -<span class="type">int</span> -<span class="function">main</span><span class="normal"> </span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span> -<span class="normal"> </span><span class="type">char</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">argv</span><span class="symbol">[])</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">window</span><span class="symbol">;</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">grid</span><span class="symbol">;</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">button</span><span class="symbol">;</span> - -<span class="normal"> </span><span class="comment">/* This is called in all GTK applications. Arguments are parsed</span> -<span class="comment"> * from the command line and are returned to the application.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-init">gtk_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">argc</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">argv</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* create a new window, and set its title */</span> -<span class="normal"> window </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-new">gtk_window_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-Standard-Enumerations.html#GTK-WINDOW-TOPLEVEL:CAPS">GTK_WINDOW_TOPLEVEL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-set-title">gtk_window_set_title</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_WINDOW</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> </span><span class="string">"Grid"</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"destroy"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-General.html#gtk-main-quit">gtk_main_quit</a></span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-set-border-width">gtk_container_set_border_width</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> </span><span class="number">10</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Here we construct the container that is going pack our buttons */</span> -<span class="normal"> grid </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkGrid.html#gtk-grid-new">gtk_grid_new</a></span><span class="normal"> </span><span class="symbol">();</span> - -<span class="normal"> </span><span class="comment">/* Pack the container in the window */</span> -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-add">gtk_container_add</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> grid</span><span class="symbol">);</span> - -<span class="normal"> button </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkButton.html#gtk-button-new-with-label">gtk_button_new_with_label</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Button 1"</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"clicked"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">print_hello</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Place the first button in the grid cell (0, 0), and make it fill</span> -<span class="comment"> * just 1 cell horizontally and vertically (ie no spanning)</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="GtkGrid.html#gtk-grid-attach">gtk_grid_attach</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_GRID</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">grid</span><span class="symbol">),</span><span class="normal"> button</span><span class="symbol">,</span><span class="normal"> </span><span class="number">0</span><span class="symbol">,</span><span class="normal"> </span><span class="number">0</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span> - -<span class="normal"> button </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkButton.html#gtk-button-new-with-label">gtk_button_new_with_label</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Button 2"</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"clicked"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">print_hello</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Place the second button in the grid cell (1, 0), and make it fill</span> -<span class="comment"> * just 1 cell horizontally and vertically (ie no spanning)</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="GtkGrid.html#gtk-grid-attach">gtk_grid_attach</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_GRID</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">grid</span><span class="symbol">),</span><span class="normal"> button</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">,</span><span class="normal"> </span><span class="number">0</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span> - -<span class="normal"> button </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkButton.html#gtk-button-new-with-label">gtk_button_new_with_label</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Quit"</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"clicked"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-General.html#gtk-main-quit">gtk_main_quit</a></span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Place the Quit button in the grid cell (0, 1), and make it</span> -<span class="comment"> * span 2 columns.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="GtkGrid.html#gtk-grid-attach">gtk_grid_attach</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_GRID</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">grid</span><span class="symbol">),</span><span class="normal"> button</span><span class="symbol">,</span><span class="normal"> </span><span class="number">0</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">,</span><span class="normal"> </span><span class="number">2</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Now that we are done packing our widgets, we show them all</span> -<span class="comment"> * in one go, by calling gtk_widget_show_all() on the window.</span> -<span class="comment"> * This call recursively calls gtk_widget_show() on all widgets</span> -<span class="comment"> * that are contained in the window, directly or indirectly.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-show-all">gtk_widget_show_all</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* All GTK applications must have a gtk_main(). Control ends here</span> -<span class="comment"> * and waits for an event to occur (like a key press or a mouse event),</span> -<span class="comment"> * until gtk_main_quit() is called.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-main">gtk_main</a></span><span class="normal"> </span><span class="symbol">();</span> - -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> -<span class="cbracket">}</span></pre></td> - </tr> - </tbody> - </table> -</div> - -</div> -<br class="example-break"> -</div> -<div class="simplesect"> -<div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id517517"></a>Drawing</h2></div></div></div> -<p>Many widgets, like buttons, do all their drawing themselves. You - just tell them the label you want to see, and they figure out what font - to use, draw the button outline and focus rectangle, etc. Sometimes, it - is necessary to do some custom drawing. In that case, a <a class="link" href="GtkDrawingArea.html" title="GtkDrawingArea"><span class="type">GtkDrawingArea</span></a> - might be the right widget to use. It offers a canvas on which you can - draw by connecting to the <a class="link" href="GtkWidget.html#GtkWidget-draw" title='The "draw" signal'><span class="type">"draw"</span></a> signal. - </p> -<p>The contents of a widget often need to be partially or fully redrawn, - e.g. when another window is moved and uncovers part of the widget, or - when tie window containing it is resized. It is also possible to explicitly - cause part or all of the widget to be redrawn, by calling - <a class="link" href="GtkWidget.html#gtk-widget-queue-draw" title="gtk_widget_queue_draw ()"><code class="function">gtk_widget_queue_draw()</code></a> or its variants. GTK+ takes care of most of the - details by providing a ready-to-use cairo context to the ::draw signal - handler.</p> -<p>The following example shows a ::draw signal handler. It is a bit - more complicated than the previous examples, since it also demonstrates - input event handling by means of ::button-press and ::motion-notify - handlers.</p> -<p> - <img src="drawing.png"> - </p> -<div class="example"> -<a name="gtk-getting-started-drawing"></a><p class="title"><b>Example 3. Drawing in response to input</b></p> -<div class="example-contents"> - <table class="listing_frame" border="0" cellpadding="0" cellspacing="0"> - <tbody> - <tr> - <td class="listing_lines" align="right"><pre>1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184</pre></td> - <td class="listing_code"><pre class="programlisting"><span class="preproc">#include</span><span class="normal"> </span><span class="string"><gtk/gtk.h></span> - -<span class="comment">/* Surface to store current scribbles */</span> -<span class="keyword">static</span><span class="normal"> </span><span class="usertype">cairo_surface_t</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">surface </span><span class="symbol">=</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span> - -<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span> -<span class="function">clear_surface</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="usertype">cairo_t</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">cr</span><span class="symbol">;</span> - -<span class="normal"> cr </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-create">cairo_create</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-set-source-rgb">cairo_set_source_rgb</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">,</span><span class="normal"> </span><span class="number">1</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-paint">cairo_paint</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-destroy">cairo_destroy</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">);</span> -<span class="cbracket">}</span> - -<span class="comment">/* Create a new surface of the appropriate size to store our scribbles */</span> -<span class="keyword">static</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean">gboolean</a></span> -<span class="function">configure_event_cb</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">GdkEventConfigure</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">event</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface</span><span class="symbol">)</span> -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-surface-t.html#cairo-surface-destroy">cairo_surface_destroy</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface</span><span class="symbol">);</span> - -<span class="normal"> surface </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="http://developer.gnome.org/gdk/gdk3-Cairo-Interaction.html#gdk-window-create-similar-surface">gdk_window_create_similar_surface</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="GtkWidget.html#gtk-widget-get-window">gtk_widget_get_window</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">),</span> -<span class="normal"> <a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-surface-t.html#CAIRO-CONTENT-COLOR:CAPS">CAIRO_CONTENT_COLOR</a></span><span class="symbol">,</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-get-allocated-width">gtk_widget_get_allocated_width</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">),</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-get-allocated-height">gtk_widget_get_allocated_height</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">));</span> - -<span class="normal"> </span><span class="comment">/* Initialize the surface to white */</span> -<span class="normal"> </span><span class="function">clear_surface</span><span class="normal"> </span><span class="symbol">();</span> - -<span class="normal"> </span><span class="comment">/* We've handled the configure event, no need for further processing. */</span> -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS">TRUE</a></span><span class="symbol">;</span> -<span class="cbracket">}</span> - -<span class="comment">/* Redraw the screen from the surface. Note that the ::draw</span> -<span class="comment"> * signal receives a ready-to-be-used cairo_t that is already</span> -<span class="comment"> * clipped to only draw the exposed areas of the widget</span> -<span class="comment"> */</span> -<span class="keyword">static</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean">gboolean</a></span> -<span class="function">draw_cb</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">cairo_t</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">cr</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-set-source-surface">cairo_set_source_surface</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">,</span><span class="normal"> surface</span><span class="symbol">,</span><span class="normal"> </span><span class="number">0</span><span class="symbol">,</span><span class="normal"> </span><span class="number">0</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-paint">cairo_paint</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS">FALSE</a></span><span class="symbol">;</span> -<span class="cbracket">}</span> - -<span class="comment">/* Draw a rectangle on the surface at the given position */</span> -<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span> -<span class="function">draw_brush</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gdouble</span><span class="normal"> x</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gdouble</span><span class="normal"> y</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="usertype">cairo_t</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">cr</span><span class="symbol">;</span> - -<span class="normal"> </span><span class="comment">/* Paint to the surface, where we store our state */</span> -<span class="normal"> cr </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-create">cairo_create</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-Paths.html#cairo-rectangle">cairo_rectangle</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">,</span><span class="normal"> x </span><span class="symbol">-</span><span class="normal"> </span><span class="number">3</span><span class="symbol">,</span><span class="normal"> y </span><span class="symbol">-</span><span class="normal"> </span><span class="number">3</span><span class="symbol">,</span><span class="normal"> </span><span class="number">6</span><span class="symbol">,</span><span class="normal"> </span><span class="number">6</span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-fill">cairo_fill</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-t.html#cairo-destroy">cairo_destroy</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">cr</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Now invalidate the affected region of the drawing area. */</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-queue-draw-area">gtk_widget_queue_draw_area</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">,</span><span class="normal"> x </span><span class="symbol">-</span><span class="normal"> </span><span class="number">3</span><span class="symbol">,</span><span class="normal"> y </span><span class="symbol">-</span><span class="normal"> </span><span class="number">3</span><span class="symbol">,</span><span class="normal"> </span><span class="number">6</span><span class="symbol">,</span><span class="normal"> </span><span class="number">6</span><span class="symbol">);</span> -<span class="cbracket">}</span> - -<span class="comment">/* Handle button press events by either drawing a rectangle</span> -<span class="comment"> * or clearing the surface, depending on which button was pressed.</span> -<span class="comment"> * The ::button-press signal handler receives a GdkEventButton</span> -<span class="comment"> * struct which contains this information.</span> -<span class="comment"> */</span> -<span class="keyword">static</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean">gboolean</a></span> -<span class="function">button_press_event_cb</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">GdkEventButton</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">event</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="comment">/* paranoia check, in case we haven't gotten a configure event */</span> -<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface </span><span class="symbol">==</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">)</span> -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS">FALSE</a></span><span class="symbol">;</span> - -<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">-></span><span class="normal">button </span><span class="symbol">==</span><span class="normal"> <a href="http://developer.gnome.org/gdk/gdk3-Events.html#GDK-BUTTON-PRIMARY:CAPS">GDK_BUTTON_PRIMARY</a></span><span class="symbol">)</span> -<span class="normal"> </span><span class="cbracket">{</span> -<span class="normal"> </span><span class="function">draw_brush</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">,</span><span class="normal"> event</span><span class="symbol">-></span><span class="normal">x</span><span class="symbol">,</span><span class="normal"> event</span><span class="symbol">-></span><span class="normal">y</span><span class="symbol">);</span> -<span class="normal"> </span><span class="cbracket">}</span> -<span class="normal"> </span><span class="keyword">else</span><span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">-></span><span class="normal">button </span><span class="symbol">==</span><span class="normal"> <a href="http://developer.gnome.org/gdk/gdk3-Events.html#GDK-BUTTON-SECONDARY:CAPS">GDK_BUTTON_SECONDARY</a></span><span class="symbol">)</span> -<span class="normal"> </span><span class="cbracket">{</span> -<span class="normal"> </span><span class="function">clear_surface</span><span class="normal"> </span><span class="symbol">();</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-queue-draw">gtk_widget_queue_draw</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">);</span> -<span class="normal"> </span><span class="cbracket">}</span> - -<span class="normal"> </span><span class="comment">/* We've handled the event, stop processing */</span> -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS">TRUE</a></span><span class="symbol">;</span> -<span class="cbracket">}</span> - -<span class="comment">/* Handle motion events by continuing to draw if button 1 is</span> -<span class="comment"> * still held down. The ::motion-notify signal handler receives</span> -<span class="comment"> * a GdkEventMotion struct which contains this information.</span> -<span class="comment"> */</span> -<span class="keyword">static</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean">gboolean</a></span> -<span class="function">motion_notify_event_cb</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">widget</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">GdkEventMotion</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">event</span><span class="symbol">,</span> -<span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> data</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="comment">/* paranoia check, in case we haven't gotten a configure event */</span> -<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface </span><span class="symbol">==</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">)</span> -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS">FALSE</a></span><span class="symbol">;</span> - -<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">-></span><span class="normal">state </span><span class="symbol">&</span><span class="normal"> <a href="http://developer.gnome.org/gdk/gdk3-Windows.html#GDK-BUTTON1-MASK:CAPS">GDK_BUTTON1_MASK</a></span><span class="symbol">)</span> -<span class="normal"> </span><span class="function">draw_brush</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">widget</span><span class="symbol">,</span><span class="normal"> event</span><span class="symbol">-></span><span class="normal">x</span><span class="symbol">,</span><span class="normal"> event</span><span class="symbol">-></span><span class="normal">y</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* We've handled it, stop processing */</span> -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS">TRUE</a></span><span class="symbol">;</span> -<span class="cbracket">}</span> - -<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span> -<span class="function">close_window</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface</span><span class="symbol">)</span> -<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/cairo/cairo-cairo-surface-t.html#cairo-surface-destroy">cairo_surface_destroy</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">surface</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-main-quit">gtk_main_quit</a></span><span class="normal"> </span><span class="symbol">();</span> -<span class="cbracket">}</span> - -<span class="type">int</span> -<span class="function">main</span><span class="normal"> </span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span> -<span class="normal"> </span><span class="type">char</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">argv</span><span class="symbol">[])</span> -<span class="cbracket">{</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">window</span><span class="symbol">;</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">frame</span><span class="symbol">;</span> -<span class="normal"> </span><span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">da</span><span class="symbol">;</span> - -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-init">gtk_init</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">argc</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">argv</span><span class="symbol">);</span> - -<span class="normal"> window </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-new">gtk_window_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gtk3-Standard-Enumerations.html#GTK-WINDOW-TOPLEVEL:CAPS">GTK_WINDOW_TOPLEVEL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="GtkWindow.html#gtk-window-set-title">gtk_window_set_title</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_WINDOW</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> </span><span class="string">"Drawing Area"</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"destroy"</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">close_window</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-set-border-width">gtk_container_set_border_width</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> </span><span class="number">8</span><span class="symbol">);</span> - -<span class="normal"> frame </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkFrame.html#gtk-frame-new">gtk_frame_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="GtkFrame.html#gtk-frame-set-shadow-type">gtk_frame_set_shadow_type</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_FRAME</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">frame</span><span class="symbol">),</span><span class="normal"> <a href="gtk3-Standard-Enumerations.html#GTK-SHADOW-IN:CAPS">GTK_SHADOW_IN</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-add">gtk_container_add</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">),</span><span class="normal"> frame</span><span class="symbol">);</span> - -<span class="normal"> da </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="GtkDrawingArea.html#gtk-drawing-area-new">gtk_drawing_area_new</a></span><span class="normal"> </span><span class="symbol">();</span> -<span class="normal"> </span><span class="comment">/* set a minimum size */</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-set-size-request">gtk_widget_set_size_request</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">,</span><span class="normal"> </span><span class="number">100</span><span class="symbol">,</span><span class="normal"> </span><span class="number">100</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="GtkContainer.html#gtk-container-add">gtk_container_add</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">GTK_CONTAINER</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">frame</span><span class="symbol">),</span><span class="normal"> da</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Signals used to handle the backing surface */</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"draw"</span><span class="symbol">,</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">draw_cb</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">,</span><span class="string">"configure-event"</span><span class="symbol">,</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">configure_event_cb</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Event signals */</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"motion-notify-event"</span><span class="symbol">,</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">motion_notify_event_cb</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"button-press-event"</span><span class="symbol">,</span> -<span class="normal"> </span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">button_press_event_cb</span><span class="symbol">),</span><span class="normal"> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="comment">/* Ask to receive events the drawing area doesn't normally</span> -<span class="comment"> * subscribe to. In particular, we need to ask for the</span> -<span class="comment"> * button press and motion notify events that want to handle.</span> -<span class="comment"> */</span> -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-set-events">gtk_widget_set_events</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">,</span><span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-get-events">gtk_widget_get_events</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">da</span><span class="symbol">)</span> -<span class="normal"> </span><span class="symbol">|</span><span class="normal"> <a href="http://developer.gnome.org/gdk/gdk3-Events.html#GDK-BUTTON-PRESS-MASK:CAPS">GDK_BUTTON_PRESS_MASK</a></span> -<span class="normal"> </span><span class="symbol">|</span><span class="normal"> <a href="http://developer.gnome.org/gdk/gdk3-Events.html#GDK-POINTER-MOTION-MASK:CAPS">GDK_POINTER_MOTION_MASK</a></span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="GtkWidget.html#gtk-widget-show-all">gtk_widget_show_all</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">window</span><span class="symbol">);</span> - -<span class="normal"> </span><span class="function"><a href="gtk3-General.html#gtk-main">gtk_main</a></span><span class="normal"> </span><span class="symbol">();</span> - -<span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> -<span class="cbracket">}</span></pre></td> - </tr> - </tbody> - </table> -</div> - -</div> -<br class="example-break"> -</div> -<div class="simplesect"> -<div class="titlepage"><div><div><h2 class="title" style="clear: both"> -<a name="id481528"></a>Building interfaces</h2></div></div></div> -<p>When construcing a more complicated user interface, with dozens - or hundreds of widgets, doing all the setup work in C code is - cumbersome, and making changes becomes next to impossible.</p> -<p>Thankfully, GTK+ supports the separation of user interface - layout from your business logic, by using UI descriptions in an - XML format that can be parsed by the <a class="link" href="GtkBuilder.html" title="GtkBuilder"><span class="type">GtkBuilder</span></a> class.</p> -<div class="example"> -<a name="id501584"></a><p class="title"><b>Example 4. Packing buttons with GtkBuilder</b></p> -<div class="example-contents"> -<pre class="programlisting"> - #include <gtk/gtk.h> - -static void -print_hello (GtkWidget *widget, - gpointer data) -{ - g_print ("Hello World\n"); -} - -int -main (int argc, - char *argv[]) -{ - GtkBuilder *builder; - GObject *window; - GObject *button; - - gtk_init (&argc, &argv); - - /* Construct a GtkBuilder instance and load our UI description */ - builder = gtk_builder_new (); - gtk_builder_add_from_file (builder, "builder.ui", NULL); - - /* Connect signal handlers to the constructed widgets. */ - window = gtk_builder_get_object (builder, "window"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - button = gtk_builder_get_object (builder, "button1"); - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); - - button = gtk_builder_get_object (builder, "button2"); - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); - - button = gtk_builder_get_object (builder, "quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - - gtk_main (); - - return 0; -} - - </pre> - The builder.ui file looks like this: - <pre class="programlisting"> - <interface> - <object id="window" class="GtkWindow"> - <property name="visible">True</property> - <property name="title">Grid</property> - <property name="border-width">10</property> - <child> - <object id="grid" class="GtkGrid"> - <property name="visible">True</property> - <child> - <object id="button1" class="GtkButton"> - <property name="visible">True</property> - <property name="label">Button 1</property> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object id="button2" class="GtkButton"> - <property name="visible">True</property> - <property name="label">Button 2</property> - </object> - <packing> - <property name="left-attach">1</property> - <property name="top-attach">0</property> - </packing> - </child> - <child> - <object id="quit" class="GtkButton"> - <property name="visible">True</property> - <property name="label">Quit</property> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">1</property> - <property name="width">2</property> - </packing> - </child> - </object> - <packing> - </packing> - </child> - </object> -</interface> - - </pre> -</div> -</div> -<br class="example-break"><p>Note that GtkBuilder can also be used to construct objects - that are not widgets, such as tree models, adjustments, etc. - That is the reason the method we use here is called - <a class="link" href="GtkBuilder.html#gtk-builder-get-object" title="gtk_builder_get_object ()"><code class="function">gtk_builder_get_object()</code></a> and returns a GObject* instead of a - GtkWidget*.</p> -<p>Normally, you would pass a full path to - <a class="link" href="GtkBuilder.html#gtk-builder-add-from-file" title="gtk_builder_add_from_file ()"><code class="function">gtk_builder_add_from_file()</code></a> to make the execution of your program - independent of the current directory. A common location to install - UI descriptions and similar data is - <code class="filename">/usr/share/<em class="replaceable"><code>appname</code></em></code>. - </p> -<p>It is also possible to embed the UI description in the source - code as a string and use <a class="link" href="GtkBuilder.html#gtk-builder-add-from-string" title="gtk_builder_add_from_string ()"><code class="function">gtk_builder_add_from_string()</code></a> to load it. - But keeping the UI description in a separate file has several - advantages: It is then possible to make minor adjustments to the UI - without recompiling your program, and, more importantly, graphical - UI editors such as <a class="ulink" href="http://glade.gnome.org" target="_top">glade</a> - can load the file and allow you to create and modify your UI by - point-and-click.</p> -</div> -</div> -<div class="footer"> -<hr> - Generated by GTK-Doc V1.18.1</div> -</body> -</html>
\ No newline at end of file |