<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF86%3AGTK%2B</id>
		<title>LXF86:GTK+ - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF86%3AGTK%2B"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;action=history"/>
		<updated>2026-05-13T00:03:09Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=12081&amp;oldid=prev</id>
		<title>Ewgen: Поправил ошибки из-за которых скопированный код не работал бы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=12081&amp;oldid=prev"/>
				<updated>2011-06-07T12:48:03Z</updated>
		
		<summary type="html">&lt;p&gt;Поправил ошибки из-за которых скопированный код не работал бы&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 12:48, 7 июня 2011&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 79:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 79:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;работы программы. Рассмотрим исходный текст программы helloworld&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;работы программы. Рассмотрим исходный текст программы helloworld&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(этот исходный текст вы найдете на диске в файле helloworld.с).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(этот исходный текст вы найдете на диске в файле helloworld.с).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include &amp;lt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK&lt;/del&gt;/&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK&lt;/del&gt;.h&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include &amp;lt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk&lt;/ins&gt;/&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk&lt;/ins&gt;.h&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;static void button_clicked(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTKWidget &lt;/del&gt;* widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;static void button_clicked(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;GtkWidget &lt;/ins&gt;* widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_print(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“Button &lt;/del&gt;was clicked!\&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;n”&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_print(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;Button &lt;/ins&gt;was clicked!\&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;n&amp;quot;&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;static gboolean delete_event(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTKWidget &lt;/del&gt;* widget, GdkEvent * event,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;static gboolean delete_event(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;GtkWidget &lt;/ins&gt;* widget, GdkEvent * event,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_print(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“Delete &lt;/del&gt;event occurred\&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;n”&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_print(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;Delete &lt;/ins&gt;event occurred\&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;n&amp;quot;&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;return FALSE;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;return FALSE;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;static void destroy(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTKWidget &lt;/del&gt;* widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;static void destroy(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;GtkWidget &lt;/ins&gt;* widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_print(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“Destroy &lt;/del&gt;signal was sent\&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;n”&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_print(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;Destroy &lt;/ins&gt;signal was sent\&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;n&amp;quot;&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_main_quit&lt;/del&gt;();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_main_quit&lt;/ins&gt;();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;int main(int argc, char ** argv)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;int main(int argc, char ** argv)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTKWidget &lt;/del&gt;* window;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;GtkWidget &lt;/ins&gt;* window;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTKWidget &lt;/del&gt;* button;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;GtkWidget &lt;/ins&gt;* button;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;const gchar * title = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“Hello &lt;/del&gt;World!&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;”&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;const gchar * title = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;Hello &lt;/ins&gt;World!&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;&lt;/ins&gt;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_init&lt;/del&gt;(&amp;amp;argc, &amp;amp;argv);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_init&lt;/ins&gt;(&amp;amp;argc, &amp;amp;argv);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;window = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_window_new&lt;/del&gt;(GTK_WINDOW_TOPLEVEL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;window = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_window_new&lt;/ins&gt;(GTK_WINDOW_TOPLEVEL);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_window_set_title&lt;/del&gt;(GTK_WINDOW(window), title);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_window_set_title&lt;/ins&gt;(GTK_WINDOW(window), title);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_container_set_border_width&lt;/del&gt;(GTK_CONTAINER(window), 10);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_container_set_border_width&lt;/ins&gt;(GTK_CONTAINER(window), 10);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect(G_OBJECT(window), &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“delete_event”&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect(G_OBJECT(window), &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;delete_event&amp;quot;&lt;/ins&gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(delete_event), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(delete_event), NULL);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect(G_OBJECT(window), &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“destroy”&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect(G_OBJECT(window), &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;destroy&amp;quot;&lt;/ins&gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(destroy), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(destroy), NULL);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;button = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_button_new_with_label&lt;/del&gt;(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“Quit”&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;button = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_button_new_with_label&lt;/ins&gt;(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;Quit&amp;quot;&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect(G_OBJECT(button), &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“clicked”&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect(G_OBJECT(button), &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(button_clicked), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(button_clicked), NULL);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect_swapped(G_OBJECT(button), &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;“clicked”&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;g_signal_connect_swapped(G_OBJECT(button), &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_widget_destroy&lt;/del&gt;), G_OBJECT(window));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;G_CALLBACK(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_widget_destroy&lt;/ins&gt;), G_OBJECT(window));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_container_add&lt;/del&gt;(GTK_CONTAINER(window), button);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_container_add&lt;/ins&gt;(GTK_CONTAINER(window), button);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_widget_show&lt;/del&gt;(button);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_widget_show&lt;/ins&gt;(button);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_widget_show&lt;/del&gt;(window);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_widget_show&lt;/ins&gt;(window);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK_main&lt;/del&gt;();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk_main&lt;/ins&gt;();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;return 0;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;return 0;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;}&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 262:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 262:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;уже известной нам утилитой pkg-config. Команда компиляции может&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;уже известной нам утилитой pkg-config. Команда компиляции может&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выглядеть так:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;выглядеть так:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; gcc -Wall helloworld.c -o helloworld `pkg-config --cflags &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK+-2.0` `pkg-config &lt;/del&gt;--libs &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;GTK&lt;/del&gt;+-2.0`&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; gcc -Wall helloworld.c -o helloworld `pkg-config --cflags --libs &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;gtk&lt;/ins&gt;+-2.0`&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы вставляем в командную строку ключи, которые выдает нам ути-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы вставляем в командную строку ключи, которые выдает нам ути-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;лита pkg-config. Теперь мы можем, наконец, полюбоваться творением&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;лита pkg-config. Теперь мы можем, наконец, полюбоваться творением&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ewgen</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=6078&amp;oldid=prev</id>
		<title>Yaleks: викификация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=6078&amp;oldid=prev"/>
				<updated>2008-12-16T18:55:18Z</updated>
		
		<summary type="html">&lt;p&gt;викификация&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;amp;diff=6078&amp;amp;oldid=6077&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=6077&amp;oldid=prev</id>
		<title>Yaleks в 18:53, 16 декабря 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=6077&amp;oldid=prev"/>
				<updated>2008-12-16T18:53:24Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;amp;diff=6077&amp;amp;oldid=6075&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=6075&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/GTK+}} == GTK+: первое знакомство == ''ЧАСТЬ 1: Прочитав нашу серию статей о Qt/KDE, вы укрепились во мнении, ...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF86:GTK%2B&amp;diff=6075&amp;oldid=prev"/>
				<updated>2008-12-16T18:27:36Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/GTK+}} == GTK+: первое знакомство == &amp;#039;&amp;#039;ЧАСТЬ 1: Прочитав нашу серию статей о Qt/KDE, вы укрепились во мнении, ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/GTK+}}&lt;br /&gt;
== GTK+: первое знакомство ==&lt;br /&gt;
''ЧАСТЬ 1: Прочитав нашу серию статей о Qt/KDE, вы укрепились во мнении, что о лучшем и мечтать нельзя, и уже готовы удивить мир своей разработкой? Выслушайте сначала контр-аргументы – '''Андрей Боровский''' предлагает вашему вниманию новую серию учебников о GTK+!''&lt;br /&gt;
&lt;br /&gt;
Линус любит KDE. Он сам неоднократно говорил об этом, не&lt;br /&gt;
стесняясь в выражениях по адресу GNOME. Я тоже не боль-&lt;br /&gt;
шой поклонник GNOME, а вот инструментарий GTK+ мне&lt;br /&gt;
очень нравится. Думаю, в таком сочетании предпочтений нет ничего&lt;br /&gt;
особенного, ведь GTK+ – это далеко не только GNOME. Даже если вы –&lt;br /&gt;
фанатичный пользователь KDE, вы наверняка время от времени рабо-&lt;br /&gt;
таете в редакторе Gimp, основанном на библиотеках GTK+. Собственно,&lt;br /&gt;
аббревиатура GTK+ и расшифровывается как Gimp ToolKit – «набор&lt;br /&gt;
инструментов для Gimp).&lt;br /&gt;
Сегодня мы начинаем серию статей, посвященных GTK+. Большая&lt;br /&gt;
часть приложений, которые мы напишем, будет работать независимо&lt;br /&gt;
от среды GNOME, но мы не оставим без внимания и взаимодействие&lt;br /&gt;
с этой популярной оболочкой. Скорее всего, вы, уважаемый читатель&lt;br /&gt;
Linux Format, уже представляете себе, что такое GTK+. Тем не менее,&lt;br /&gt;
следует все-таки напомнить, что GTK+ представляет собой открытый&lt;br /&gt;
набор графических компонентов, предназначенных для создания при-&lt;br /&gt;
ложений на платформах Linux/Unix, Win32 и MacOS. GTK+ включает в&lt;br /&gt;
себя большое количество визуальных элементов, используемых при&lt;br /&gt;
создании графического интерфейса приложений, а также некоторые&lt;br /&gt;
вспомогательные невизуальные элементы. На GTK+ основаны такие&lt;br /&gt;
приложения, как графическая среда GNOME, редактор растровой&lt;br /&gt;
графики Gimp, текстовый редактор AbiWord, табличный процессор&lt;br /&gt;
Gnumeric и многие-многие другие. Помимо библиотек, реализующих&lt;br /&gt;
различные элементы графического интерфейса приложений, GTK+&lt;br /&gt;
снабжен вспомогательными утилитами. Glade, например, позволяет&lt;br /&gt;
проектировать интерфейсы GTK-приложений в режиме визуального&lt;br /&gt;
редактирования. Если вы установили пакеты разработки GTK+/GNOME,&lt;br /&gt;
то в вашей системе наверняка также установлена программа Devhelp,&lt;br /&gt;
которая представляет собой браузер документации программиста по&lt;br /&gt;
GTK+, GNOME, Gimp и Evolution.&lt;br /&gt;
Можно ли назвать GTK+ предпочтительным инструментарием раз-&lt;br /&gt;
работчика графических приложений? Вообще говоря, если вы выби-&lt;br /&gt;
раете набор инструментов для создания графического интерфейса&lt;br /&gt;
нового Linux-приложения, вы не должны особенно беспокоиться о том,&lt;br /&gt;
какую оболочку предпочитают ваши пользователи. В соответствии с&lt;br /&gt;
идеологией свободного выбора, которая пронизывает Linux, различные&lt;br /&gt;
платформы и компоненты системы очень хорошо уживаются между&lt;br /&gt;
собой. Средства взаимодействия между приложениями, использующи-&lt;br /&gt;
ми разные графические компоненты, тоже быстро совершенствуются.&lt;br /&gt;
Для того чтобы сделать выбор между GTK+ и Qt/KDE, следует хотя&lt;br /&gt;
бы бегло ознакомиться с возможностями и особенностями каждого&lt;br /&gt;
инструментария.&lt;br /&gt;
Как это нередко бывает в мире открытого ПО, в настоящее вре-&lt;br /&gt;
мя активно используются сразу две ветки GTK+. Многие разработчи-&lt;br /&gt;
ки приложений, воспользовавшиеся в свое время GTK+ 1.2, не видят&lt;br /&gt;
необходимости переходить на новые версии пакета, поэтому GTK+ 1.2&lt;br /&gt;
все еще можно встретить во многих дистрибутивах Linux. Новые (на&lt;br /&gt;
момент написания этой статьи) приложения используют GTK+ версий&lt;br /&gt;
2.x. Примеры из нашей серии статей должны работать со всеми верси-&lt;br /&gt;
ями GTK+, начиная с 2.0, если иное не указано явно.&lt;br /&gt;
Наши инструменты&lt;br /&gt;
Приложения GTK+ под Linux – это, прежде всего, приложения Linux.&lt;br /&gt;
Для создания приложений GTK+ вам понадобятся стандартные инстру-&lt;br /&gt;
менты разработчика – GCC и automake со товарищи. Помимо этого, в&lt;br /&gt;
вашей системе должны быть установлены пакеты GTK+-devel*, atkdevel*,&lt;br /&gt;
pango-devel* со всеми зависимостями. Кроме того, рекоменду-&lt;br /&gt;
ем установить пакеты libgnome-devel и glade. После установки пакетов&lt;br /&gt;
разработчика в нашем распоряжении окажутся утилиты командной&lt;br /&gt;
строки glib-config и pkg-config (в некоторых системах также может быть&lt;br /&gt;
установлена утилита GTK-config). Эти утилиты выводят информацию&lt;br /&gt;
о расположении базовых библиотек GTK+ в вашей системе. При этом&lt;br /&gt;
утилита glib-config предназначена исключительно для вывода инфор-&lt;br /&gt;
мации о библиотеке glib, а pkg-config выводит информацию о самых&lt;br /&gt;
разных библиотеках. Если, например, скомандовать в окне консоли&lt;br /&gt;
pkg-config --libs GTK+-2.0&lt;br /&gt;
вы увидите нечто вроде&lt;br /&gt;
 -L/usr/X11R6/lib -L/opt/gnome/lib -lGTK-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0&lt;br /&gt;
 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0&lt;br /&gt;
 -lfreetype -lfontconfig -lXrender -lX11 -lXext -lpng12 -lz -lglitz -lm&lt;br /&gt;
Вывод команды представляет собой список ключей компоновщика&lt;br /&gt;
GCC, которые необходимо указать для подключения к основанному на&lt;br /&gt;
GTK+ 2.x приложению всех необходимых ему библиотек. Как вы, конеч-&lt;br /&gt;
но, догадались, этот список сгенерирован не столько для того, чтобы&lt;br /&gt;
удовлетворить наше любопытство, сколько для автоматизации работы&lt;br /&gt;
компоновщика в процессе сборки приложений GTK+, что мы увидим&lt;br /&gt;
ниже. Команда&lt;br /&gt;
pkg-config --cflags GTK+-2.0&lt;br /&gt;
выдаст все ключи компилятора, необходимые для компиляции прило-&lt;br /&gt;
жения GTK+ 2.x.&lt;br /&gt;
Hello GTK+ World!&lt;br /&gt;
Теперь, когда мы знаем, что нам нужно для того, чтобы скомпилиро-&lt;br /&gt;
вать приложение GTK+, мы готовы написать простейшую программу.&lt;br /&gt;
Наша первая программа (назовем ее helloworld) создает простое окно&lt;br /&gt;
с кнопкой. Щелчок по кнопке приводит к закрытию окна и завершению&lt;br /&gt;
работы программы. Рассмотрим исходный текст программы helloworld&lt;br /&gt;
(этот исходный текст вы найдете на диске в файле helloworld.с).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include &amp;lt;GTK/GTK.h&amp;gt;&lt;br /&gt;
static void button_clicked(GTKWidget * widget, gpointer data)&lt;br /&gt;
{&lt;br /&gt;
g_print(“Button was clicked!\n”);&lt;br /&gt;
}&lt;br /&gt;
static gboolean delete_event(GTKWidget * widget, GdkEvent * event,&lt;br /&gt;
gpointer data)&lt;br /&gt;
{&lt;br /&gt;
g_print(“Delete event occurred\n”);&lt;br /&gt;
return FALSE;&lt;br /&gt;
}&lt;br /&gt;
static void destroy(GTKWidget * widget, gpointer data)&lt;br /&gt;
{&lt;br /&gt;
g_print(“Destroy signal was sent\n”);&lt;br /&gt;
GTK_main_quit();&lt;br /&gt;
}&lt;br /&gt;
int main(int argc, char ** argv)&lt;br /&gt;
{&lt;br /&gt;
GTKWidget * window;&lt;br /&gt;
GTKWidget * button;&lt;br /&gt;
const gchar * title = “Hello World!”;&lt;br /&gt;
GTK_init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
window = GTK_window_new(GTK_WINDOW_TOPLEVEL);&lt;br /&gt;
GTK_window_set_title(GTK_WINDOW(window), title);&lt;br /&gt;
GTK_container_set_border_width(GTK_CONTAINER(window), 10);&lt;br /&gt;
g_signal_connect(G_OBJECT(window), “delete_event”,&lt;br /&gt;
G_CALLBACK(delete_event), NULL);&lt;br /&gt;
g_signal_connect(G_OBJECT(window), “destroy”,&lt;br /&gt;
G_CALLBACK(destroy), NULL);&lt;br /&gt;
button = GTK_button_new_with_label(“Quit”);&lt;br /&gt;
g_signal_connect(G_OBJECT(button), “clicked”,&lt;br /&gt;
G_CALLBACK(button_clicked), NULL);&lt;br /&gt;
g_signal_connect_swapped(G_OBJECT(button), “clicked”,&lt;br /&gt;
G_CALLBACK(GTK_widget_destroy), G_OBJECT(window));&lt;br /&gt;
GTK_container_add(GTK_CONTAINER(window), button);&lt;br /&gt;
GTK_widget_show(button);&lt;br /&gt;
GTK_widget_show(window);&lt;br /&gt;
GTK_main();&lt;br /&gt;
return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Прежде чем мы пройдем нашу программу шаг за шагом, необходи-&lt;br /&gt;
мо дать некоторые пояснения общего характера. В графических интер-&lt;br /&gt;
фейсах, реализованных на объектно-ориентированных языках, все&lt;br /&gt;
визуальные элементы представляются классами. В интерфейсе GTK+,&lt;br /&gt;
реализованном на языке C, визуальным элементам соответствуют&lt;br /&gt;
структуры данных. Эти структуры (мы будем называть их объектами)&lt;br /&gt;
группируются в иерархии, которые соответствуют отношениям объ-&lt;br /&gt;
ектов интерфейса. Следует отметить, что понятие «иерархии» здесь&lt;br /&gt;
достаточно условное, отношения объектов GTK+ не следует путать с&lt;br /&gt;
иерархическими отношениями классов в объектно-ориентированных&lt;br /&gt;
языках.&lt;br /&gt;
Корнем иерархии объектов GTK+ является абстрактный объект&lt;br /&gt;
GObject. Ниже в иерархической лестнице расположен объект GTKObject,&lt;br /&gt;
потомком которого является объект GtkWidget, который, в свою оче-&lt;br /&gt;
редь, служит корнем иерархии всех визуальных элементов (виджетов).&lt;br /&gt;
Здесь уместно сказать несколько слов и о формировании идентифи-&lt;br /&gt;
каторов в GTK+. Как и во многих интерфейсах Unix, имена функций,&lt;br /&gt;
типов данных, констант и макросов в GTK+ начинаются с префик-&lt;br /&gt;
са, указывающего на имя библиотеки, которая экспортирует данный&lt;br /&gt;
идентификатор. Имена функций, экспортируемых библиотекой GTK&lt;br /&gt;
(libGTK), начинаются с префикса gtk_, имена типов данных из этой биб-&lt;br /&gt;
лиотеки предваряются префиксом GTK, а имена констант и макросов&lt;br /&gt;
имеют префикс GTK_. Имена функций, типов и констант с макросами,&lt;br /&gt;
экспортируемых библиотекой GLib (libglib), начинаются с префиксов g_,&lt;br /&gt;
g и G_, соответственно.&lt;br /&gt;
Текст нашей программы helloworld начинается с определения трех&lt;br /&gt;
статических функций. Эти функции представляют собой обработчики&lt;br /&gt;
сигналов GTK+. Как и все современные многооконные графические&lt;br /&gt;
системы, GTK+ базируется на событийно-управляемой архитектуре.&lt;br /&gt;
Когда в графической системе происходит нечто, связанное с одним&lt;br /&gt;
из окон приложения (щелчок мышью, нажатие на клавишу, сокрытие&lt;br /&gt;
окном другого приложения – то есть возникает необходимость перери-&lt;br /&gt;
совки), данному окну посылается сообщение. GTK+ преобразует сооб-&lt;br /&gt;
щение оконной системы в сигнал и вызывает функцию-обработчик&lt;br /&gt;
этого сигнала. В качестве аргументов функции-обработчику переда-&lt;br /&gt;
ются данные об объекте-источнике и параметрах события. Механизм&lt;br /&gt;
сигналов абстрагирован от механизма сообщений низкоуровневой&lt;br /&gt;
графической подсистемы и отражает скорее структуру GTK+, нежели&lt;br /&gt;
структуру системы низкого уровня. Источником сигналов, связанных с&lt;br /&gt;
визуальным элементом управления, в GTK+ считается сам визуальный&lt;br /&gt;
элемент. Для обработки сигналов GTK+ использует функции обратно-&lt;br /&gt;
го вызова (callback). Qt, кстати, тоже использует функции обратного&lt;br /&gt;
вызова, скрытые под надстройкой сигналов и слотов. Похоже, что&lt;br /&gt;
прогрессивное человечество, по крайней мере, та его часть, которая&lt;br /&gt;
пишет на C и C++, ничего лучшего пока не придумало. Обработчики&lt;br /&gt;
сигналов представляют собой обычные функции C. Например, если мы&lt;br /&gt;
создадим функцию-обработчик button_clicked и свяжем ее с сигналом&lt;br /&gt;
clicked визуального элемента-кнопки, обработчик button_clicked будет&lt;br /&gt;
вызываться в ответ на щелчок мышью по кнопке. Мы можем связать&lt;br /&gt;
один обработчик с несколькими сигналами и назначить одному сиг-&lt;br /&gt;
налу несколько обработчиков. Первым параметром функции обра-&lt;br /&gt;
ботчика должен быть указатель на объект-источник сигнала, вторым&lt;br /&gt;
параметром – указатель на произвольную структуру данных, которую&lt;br /&gt;
программист может связать с данным сигналом. Помимо сигналов и&lt;br /&gt;
GTK+ определены события, которые соответствуют событиям низко-&lt;br /&gt;
уровневой системы X Window. По сути, события – это те же сигналы, но&lt;br /&gt;
функции-обработчики событий отличаются от обработчиков обычных&lt;br /&gt;
сигналов списком параметров. Имена событий имеют окончание _event.&lt;br /&gt;
В нашей программе функция button_clicked() является обработчиком&lt;br /&gt;
сигнала, а функция delete_event() – обработчиком события. Вы можете&lt;br /&gt;
видеть, что списки параметров этих функций различаются.&lt;br /&gt;
Теперь мы можем более подробно описать каждую функцию&lt;br /&gt;
обратного вызова, определенную в нашей программе. Функция button_&lt;br /&gt;
clicked – это обработчик сигнала clicked кнопки приложения. Функция&lt;br /&gt;
delete_event обрабатывает событие delete_event, а функция destroy&lt;br /&gt;
представляет собой обработчик сигнала destroy. Событие delete_event&lt;br /&gt;
генерируется системой X Window в случае, если пользователь пытается&lt;br /&gt;
закрыть окно приложения. Сигнал destroy всегда посылается приложе-&lt;br /&gt;
нию GTK+ во время завершения его работы. Действия, выполняемые&lt;br /&gt;
функцией main() нашей программы, можно разделить на шесть ста-&lt;br /&gt;
дий: создание и настройка главного окна, назначение обработчиков&lt;br /&gt;
сигналов и событий окна, создание кнопки, назначение обработчиков&lt;br /&gt;
сигнала clicked кнопки, расположение кнопки в главном окне, отобра-&lt;br /&gt;
жение окна и кнопки.&lt;br /&gt;
Работа программы начинается с вызова функции gtk_init(). Как сле-&lt;br /&gt;
дует из названия, gtk_init() инициализирует приложение (устанавливает&lt;br /&gt;
значения параметров GTK+) и обрабатывает специальные аргументы&lt;br /&gt;
командной строки, которые могут быть переданы приложению GTK+.&lt;br /&gt;
Далее мы создаем главное окно приложения с помощью функции&lt;br /&gt;
gtk_window_new(). Единственный параметр функции указывает, что&lt;br /&gt;
мы создаем обычное главное окно. Другой возможный параметр –&lt;br /&gt;
GTK_WINDOW_POPUP позволяет создать всплывающее окно (popup&lt;br /&gt;
window). Функция gtk_window_new() возвращает указатель на струк-&lt;br /&gt;
туру GTKWidget, соответствующую созданному окну. Этот указатель&lt;br /&gt;
мы сохраняем в переменной window. Функция gtk_window_set_title()&lt;br /&gt;
устанавливает надпись в заголовке окна. Первым аргументом функции&lt;br /&gt;
должен быть идентификатор окна, вторым аргументом – текст заголов-&lt;br /&gt;
ка. Функция gtk_window_set_title() ожидает, что первым аргументом&lt;br /&gt;
будет значение типа GTKWindow * (указатель на объект-окно). Однако,&lt;br /&gt;
поскольку переменная window имеет тип указатель на GTKWidget,&lt;br /&gt;
мы выполняем приведение типа с помощью макроса GTK_WINDOW.&lt;br /&gt;
Приведение типов в данном случае необязательно, и мы выполняем&lt;br /&gt;
его только для того, чтобы избавиться от предупреждений, выдава-&lt;br /&gt;
емых компилятором. Главное окно приложения, как и многие другие&lt;br /&gt;
объекты GTK+, представляет собой контейнер. Объекты-контейнеры&lt;br /&gt;
могут содержать произвольное количество дочерних визуальных эле-&lt;br /&gt;
ментов. При этом контейнеры обычно управляют расположением и&lt;br /&gt;
размером дочерних виджетов, чем очень облегчают жизнь програм-&lt;br /&gt;
миста (более подробное знакомство с контейнерами состоится в одной&lt;br /&gt;
из следующих статей серии). Функция gtk_container_set_border_width()&lt;br /&gt;
устанавливает ширину границы контейнера. Для главного окна «шири-&lt;br /&gt;
на границы» означает расстояние от края дочернего элемента до края&lt;br /&gt;
окна.&lt;br /&gt;
Функция g_signal_connect() связывает сигнал объекта с обработ-&lt;br /&gt;
чиком. Первый параметр функции – объект-источник сигнала. Мы&lt;br /&gt;
приводим идентификатор объекта к типу GObject с помощью макро-&lt;br /&gt;
са G_OBJECT. Второй параметр функции – строка с именем сигнала.&lt;br /&gt;
Третий параметр – это указатель на функцию-обработчик (мы при-&lt;br /&gt;
водим его значение к типу GCallback). Последний параметр функции&lt;br /&gt;
g_signal_connect() представляет собой указатель на произвольную&lt;br /&gt;
структуру данных, которую мы можем передать обработчику события.&lt;br /&gt;
Для большинства обработчиков событий мы будем оставлять это зна-&lt;br /&gt;
чение равным null. Мы назначаем обработчики двум другим сигналам&lt;br /&gt;
окна – delete_event и destroy (для удобства имена функций-обработчи-&lt;br /&gt;
ков выбраны аналогичными именам сигнала).&lt;br /&gt;
Теперь нам необходимо создать кнопку, для чего мы пользуемся&lt;br /&gt;
функцией gtk_button_new_with_label(). С помощью этой функции, чье&lt;br /&gt;
имя говорит само за себя, мы создаем кнопку и указываем надпись на&lt;br /&gt;
ней. Единственный параметр функции gtk_button_new_with_label() –&lt;br /&gt;
это текст надписи на кнопке. Возвращаемое функцией значение пред-&lt;br /&gt;
ставляет собой указатель на объект GTKWidget, соответствующий&lt;br /&gt;
созданной кнопке. Почему функции, создающие окно и кнопку, возвра-&lt;br /&gt;
щают указатели на объекты GTKWidget, а не на соответствующие этим&lt;br /&gt;
визуальным элементам объекты GTKWindow и GTKButton (оба типа&lt;br /&gt;
определены в библиотеке GTK)? Вероятно, это сделано для того, что-&lt;br /&gt;
бы избавить нас от лишних операций приведения типов. Ведь большая&lt;br /&gt;
часть функций, работающих с визуальными элементами, принимает в&lt;br /&gt;
качестве параметра именно указатель на GTKWidget.&lt;br /&gt;
Кнопка может быть источником нескольких сигналов, важнейший&lt;br /&gt;
из которых, сигнал clicked, оповещает приложение о том, что по кнопке&lt;br /&gt;
щелкнули мышью (или выполнили аналогичное действие с помощью&lt;br /&gt;
клавиатуры). Мы назначаем сигналу clicked кнопки button два обра-&lt;br /&gt;
ботчика событий – определенный нами обработчик button_clicked() и&lt;br /&gt;
функцию gtk_widget_destroy(), которая завершает работу программы,&lt;br /&gt;
посылая при этом сигнал destroy. Любопытно отметить, что функция&lt;br /&gt;
gtk_widget_destroy(), вообще говоря, не является обработчиком сиг-&lt;br /&gt;
нала. Возможность использовать «простые» функции GTK+ в качест-&lt;br /&gt;
ве обработчиков сигналов представляет собой полезную особенность&lt;br /&gt;
API GTK+, с которой мы еще встретимся не один раз. Для назначения&lt;br /&gt;
обработчика gtk_widget_destroy() мы используем функцию g_signal_&lt;br /&gt;
connect_swapped(). Эта функция аналогична функции g_signal_connect&lt;br /&gt;
(), за исключением того, что при вызове обработчика параметры пере-&lt;br /&gt;
даются ему в другом порядке (подробнее об использовании g_signal_&lt;br /&gt;
connect_swapped() мы поговорим в следующих статьях).&lt;br /&gt;
Функция gtk_container_add() добавляет дочерний элемент в контей-&lt;br /&gt;
нер. Первый параметр функции – это указатель на объект-контейнер,&lt;br /&gt;
вторым параметром должен быть указатель на добавляемый объект.&lt;br /&gt;
Мы используем функцию gtk_container_add() для того, чтобы размес-&lt;br /&gt;
тить кнопку в окне. И кнопка, и окно примут при этом разумные разме-&lt;br /&gt;
ры (определяемые длиной надписи на кнопке и шириной границы окна-&lt;br /&gt;
контейнера). Наконец, мы выполняем два вызова gtk_widget_show(),&lt;br /&gt;
делающих визуальные элементы интерфейса (кнопку и окно) види-&lt;br /&gt;
мыми. Последняя функция, которую мы вызываем явным образом –&lt;br /&gt;
gtk_main(), она запускает цикл обработки сообщений. Теперь наша&lt;br /&gt;
программа сможет реагировать на сигналы, посылаемые визуальными&lt;br /&gt;
элементами управления.&lt;br /&gt;
Нам осталось рассмотреть обработчики сигналов. Обработчик&lt;br /&gt;
button_clicked() распечатывает в окне терминала сообщение о том, что&lt;br /&gt;
кнопка была нажата. Для этого используется функция g_print(), кото-&lt;br /&gt;
рая работает аналогично функции printf(). Сигнал-событие delete_event&lt;br /&gt;
посылается программе, как уже говорилось, при попытке закрыть окно&lt;br /&gt;
приложения. Обработчик этого события может отменить завершение&lt;br /&gt;
работы приложения (для этого, как ни странно, он должен вернуть&lt;br /&gt;
значение true, а не false). Сигнал destroy сообщает приложению, что&lt;br /&gt;
его работа будет завершена и не допускает отмены завершения. Если&lt;br /&gt;
вы закрываете окно приложения, щелкая по кнопке в заголовке окна,&lt;br /&gt;
приложение сначала получит сигнал delete_event, а затем, если обра-&lt;br /&gt;
ботчик этого сигнала вернет значение FALSE, сигнал destroy. Функция&lt;br /&gt;
gtk_widget_destroy() (связанная в нашем примере с кнопкой button)&lt;br /&gt;
посылает только сигнал destroy, но не delete_event. Хотя получение&lt;br /&gt;
сигнала destroy в нашей программе свидетельствует об уничтожении&lt;br /&gt;
главного визуального элемента (и его дочерних элементов), само по&lt;br /&gt;
себе это уничтожение не приводит к выходу из цикла обработки сооб-&lt;br /&gt;
щений. Выход из цикла нужно выполнить явным образом с помощью&lt;br /&gt;
функции gtk_main_quit().&lt;br /&gt;
Для того, чтобы скомпилировать наш пример, мы воспользуемся&lt;br /&gt;
уже известной нам утилитой pkg-config. Команда компиляции может&lt;br /&gt;
выглядеть так:&lt;br /&gt;
 gcc -Wall helloworld.c -o helloworld `pkg-config --cflags GTK+-2.0` `pkg-config --libs GTK+-2.0`&lt;br /&gt;
[[Изображение:Img 86 71 1.png|thumb|Рисунок 1. Наше первое приложение GTK+.]]&lt;br /&gt;
Мы вставляем в командную строку ключи, которые выдает нам ути-&lt;br /&gt;
лита pkg-config. Теперь мы можем, наконец, полюбоваться творением&lt;br /&gt;
наших рук (рис. 1).&lt;br /&gt;
&lt;br /&gt;
Приступая к изучению нового интерфейса, очень приятно быстро&lt;br /&gt;
получить первую работающую программу. Еще приятнее понимать, как&lt;br /&gt;
это программа работает. Углубленному изучению механизма сигналов&lt;br /&gt;
и взаимодействия визуальных компонентов GTK+ будет посвящена следующая статья.&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>