<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF87-88:GTK+ - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF87-88:GTK%2B&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 22:10:56 GMT</lastBuildDate>
		<item>
			<title>Ewgen: Исправлены ошибки в коде</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF87-88:GTK%2B&amp;diff=12083&amp;oldid=prev</link>
			<description>&lt;p&gt;Исправлены ошибки в коде&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&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&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;Версия 20:25, 7 июня 2011&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 31:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 31:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &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; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&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(gettext(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Translate &lt;/del&gt;this!&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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; g_print(gettext(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Translate &lt;/ins&gt;this!&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Здесь '''gettext()''' – это макрос, который указывает, что необходимо&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Здесь '''gettext()''' – это макрос, который указывает, что необходимо&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 72:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 72:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static void button_clicked(GtkWidget * widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static void button_clicked(GtkWidget * widget, gpointer data)&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Button &lt;/del&gt;pressed!\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Button &lt;/ins&gt;pressed!\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static gboolean delete_event(GtkWidget * widget, GdkEvent * event,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static gboolean delete_event(GtkWidget * widget, GdkEvent * event,&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: #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; &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; &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; &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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Delete &lt;/del&gt;event occurred\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Delete &lt;/ins&gt;event occurred\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #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; &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; &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; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static void destroy(GtkWidget * widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static void destroy(GtkWidget * widget, gpointer data)&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Destroy &lt;/del&gt;signal sent\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Destroy &lt;/ins&gt;signal sent\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_main_quit();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_main_quit();&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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 colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 90:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 90:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   GtkWidget * button;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   GtkWidget * 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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);&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;   bind_textdomain_codeset (GETTEXT_PACKAGE, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“UTF&lt;/del&gt;-&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;8”&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;   bind_textdomain_codeset (GETTEXT_PACKAGE, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;UTF&lt;/ins&gt;-&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;8&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   textdomain (GETTEXT_PACKAGE);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   textdomain (GETTEXT_PACKAGE);&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_init(&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_init(&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   window = gtk_window_new(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;   gtk_window_set_title(GTK_WINDOW(window), _(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Hello &lt;/del&gt;World!&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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;   gtk_window_set_title(GTK_WINDOW(window), _(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Hello &lt;/ins&gt;World!&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_set_border_width(GTK_CONTAINER(window), 10);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_set_border_width(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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“delete_event”&lt;/del&gt;, G_&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;delete_event&amp;quot;&lt;/ins&gt;, G_&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(delete_event), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; 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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“destroy”&lt;/del&gt;, G_&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;destroy&amp;quot;&lt;/ins&gt;, G_&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(destroy), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; 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 = gtk_button_new_with_label(_(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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 = gtk_button_new_with_label(_(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“clicked”&lt;/del&gt;, G_CALLBACK(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;   g_signal_connect(G_OBJECT(button), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;, G_CALLBACK(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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; clicked), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; 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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“clicked”&lt;/del&gt;, G_&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;, G_&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(gtk_widget_destroy), G_OBJECT(window));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(gtk_widget_destroy), 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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_add(GTK_CONTAINER(window), button);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_add(GTK_CONTAINER(window), button);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 230:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 230:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &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; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gint i = * (gint *) data;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gint i = * (gint *) data;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Button &lt;/del&gt;#%i is pressed!\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;n”&lt;/del&gt;, i);&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Button &lt;/ins&gt;#%i is pressed!\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;n&amp;quot;&lt;/ins&gt;, i);&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static gboolean delete_event(GtkWidget * widget, GdkEvent * event,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static gboolean delete_event(GtkWidget * widget, GdkEvent * event,&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: #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; &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; &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; &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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Delete &lt;/del&gt;event occurred\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Delete &lt;/ins&gt;event occurred\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #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; &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; &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; &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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static void destroy(GtkWidget * widget, gpointer data)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; static void destroy(GtkWidget * widget, gpointer data)&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Destroy &lt;/del&gt;signal sent\&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Destroy &lt;/ins&gt;signal sent\&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_main_quit();&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_main_quit();&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &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 colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 252:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 252:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_init(&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_init(&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   window = gtk_window_new(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;   gtk_window_set_title(GTK_WINDOW(window), &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Buttons”&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;   gtk_window_set_title(GTK_WINDOW(window), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Buttons&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_set_border_width(GTK_CONTAINER(window), 10);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_set_border_width(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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“delete_event”&lt;/del&gt;, G_&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;delete_event&amp;quot;&lt;/ins&gt;, G_&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(delete_event), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; 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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“destroy”&lt;/del&gt;, G_&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 style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;destroy&amp;quot;&lt;/ins&gt;, G_&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(destroy), NULL);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; 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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   box = gtk_hbox_new(TRUE, 2);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   box = gtk_hbox_new(TRUE, 2);&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_add(GTK_CONTAINER(window), box);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_container_add(GTK_CONTAINER(window), box);&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;   button1 = gtk_button_new_with_label(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&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;   button1 = gtk_button_new_with_label(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Выход&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   i1 = 1;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   i1 = 1;&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(button1), &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“clicked”&lt;/del&gt;, G_CALLBACK(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;   g_signal_connect(G_OBJECT(button1), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;, G_CALLBACK(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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; clicked), &amp;amp;i1);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; clicked), &amp;amp;i1);&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(button1), &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“clicked”&lt;/del&gt;, G_&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(button1), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;, G_&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(gtk_widget_destroy), G_OBJECT(window));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CALLBACK(gtk_widget_destroy), 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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_box_pack_start(GTK_BOX(box), button1, TRUE, TRUE, 0);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_box_pack_start(GTK_BOX(box), button1, TRUE, TRUE, 0);&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;   button2 = gtk_button_new_with_label(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“Кнопка 2”&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;   button2 = gtk_button_new_with_label(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;Кнопка 2&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   i2 = 2;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   i2 = 2;&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(button2), &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;“clicked”&lt;/del&gt;, G_CALLBACK(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;   g_signal_connect(G_OBJECT(button2), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;clicked&amp;quot;&lt;/ins&gt;, G_CALLBACK(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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; clicked), &amp;amp;i2);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; clicked), &amp;amp;i2);&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: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_box_pack_start(GTK_BOX(box), button2, TRUE, TRUE, 0);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;   gtk_box_pack_start(GTK_BOX(box), button2, TRUE, TRUE, 0);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Tue, 07 Jun 2011 20:25:14 GMT</pubDate>			<dc:creator>Ewgen</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF87-88:GTK%2B</comments>		</item>
		<item>
			<title>Crazy Rebel: викификация, оформление</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF87-88:GTK%2B&amp;diff=5884&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Категория:Учебники]]&lt;br /&gt;
: '''''GTK+''''' Разработка переносимых приложений с графическим интерейсом пользователя&lt;br /&gt;
&lt;br /&gt;
=Интернационализация и компоновка=&lt;br /&gt;
&lt;br /&gt;
{{Цикл/GTK+}}&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 2''': Сегодня '''Андрей Боровский''' научит приложения ''GTK+'' говорить по-русски и нажимать на несколько кнопок одновременно&lt;br /&gt;
&lt;br /&gt;
::::''Проникновенье наше по планете особенно заметно вдалеке...''&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;
&lt;br /&gt;
Для интернационализации приложений ''GTK+'' мы воспользуемся&lt;br /&gt;
пакетом ''GNU gettext'', так что тем из вас, кто хорошо знаком с ним,&lt;br /&gt;
будет достаточно беглого взгляда на приведенный ниже листинг&lt;br /&gt;
программы, чтобы понять, что мы делаем. Для тех, кто не знаком с&lt;br /&gt;
пакетом ''gettext'', будут даны краткие, и никоим образом не исчерпывающие, пояснения. Более глубокое понимание работы утилит интернационализации GNU вы получите, ознакомившись со специальной&lt;br /&gt;
документацией, которую можно найти, например, по адресу http://www.gnu.org/software/gettext/manual/.&lt;br /&gt;
&lt;br /&gt;
Для тех, кто совсем не знаком с основами процесса перевода приложений Linux на разные языки, я кратко изложу базовые принципы. В процессе разработки программы весь текст интерфейса программы&lt;br /&gt;
(названия кнопок и пунктов меню, текст диалоговых окон, сообщения&lt;br /&gt;
об ошибках) пишется на одном языке, как правило, на английском.&lt;br /&gt;
При этом дальновидный программист заранее готовит интерфейс программы к переводу на другие языки (процесс подготовки программы к «многоязычию» и называется интернационализацией). Программист&lt;br /&gt;
добавляет в программу специальный код, отвечающий за работу с разными языками, а также помечает все строки интерфейса программы, которым потребуется перевод, специальными маркерами (макросами).&lt;br /&gt;
Строка, помеченная для перевода, может выглядеть например так:&lt;br /&gt;
&lt;br /&gt;
 g_print(gettext(“Translate this!”));&lt;br /&gt;
&lt;br /&gt;
Здесь '''gettext()''' – это макрос, который указывает, что необходимо&lt;br /&gt;
перевести строку '''Translate this!'''. Затем программист сканирует исходные тексты программы с помощью утилиты ''xgettext''. Утилита ''xgettext'' копирует все строки, помеченные для перевода, в специальный файл.&lt;br /&gt;
Далее начинается процесс локализации, то есть адаптации программы к конкретной локали. С помощью специальной утилиты, например ''KBabel'', на основе файла, полученного от ''xgettext'', создаются файлы&lt;br /&gt;
перевода интерфейса, в которых каждой оригинальной строке сопоставлен перевод на другой язык (такие файлы называют каталогами&lt;br /&gt;
сообщений). Для того, чтобы интернационализированная программа&lt;br /&gt;
могла воспользоваться каталогами сообщений, их нужно скомпилировать в специальный «машинный» формат с помощью утилиты ''msgfmt''. Полученные в результате двоичные каталоги сообщений распространяются вместе с двоичным файлом приложения. Во время выполнения программа определяет текущую локаль и загружает двоичный&lt;br /&gt;
файл, содержащий перевод сообщений интерфейса на соответствующий язык. В ходе работы программы все строки интерфейса, для&lt;br /&gt;
которых подготовлен перевод, заменяются локализованными вариантами. Каким образом выполняется замена строк? За нее отвечают те самые макросы, которые по совместительству служат маркерами. В&lt;br /&gt;
приведенном выше примере во время выполнения программы макрос&lt;br /&gt;
'''gettext()''' попытается найти перевод строки '''Translate this!'''. Если перевод&lt;br /&gt;
будет найден, аргументом функции '''g_print()''' станет строка перевода,&lt;br /&gt;
если же перевод для данной строки найден не будет, макрос передаст&lt;br /&gt;
функции '''g_print()''' исходную английскую строку.&lt;br /&gt;
&lt;br /&gt;
Возможно, эта схема покажется вам слишком сложной, но я могу&lt;br /&gt;
вас успокоить. Во-первых, на практике все выглядит проще, чем в&lt;br /&gt;
описании (сейчас мы перейдем к примеру, и вы сами это увидите). Во&lt;br /&gt;
вторых, распространение файлов, содержащих перевод интерфейса отдельно от исполнимых файлов программы, представляет собой&lt;br /&gt;
очень мощный механизм, благодаря которому у локализаторов программы появляется возможность переводить ее на другие языки, не&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;
качестве подспорья для интернационализации мы воспользуемся программой ''helloworld'' из '''LXF86'''. Начнем мы с того, что внесем некоторые  изменения в исходный текст программы (вы найдете его на диске в &lt;br /&gt;
файле '''helloworld.c'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;gtk/gtk.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;libintl.h&amp;gt;&lt;br /&gt;
 #define _(String) gettext (String)&lt;br /&gt;
 #define gettext_noop(String) String&lt;br /&gt;
 #define N_(String) gettext_noop (String)&lt;br /&gt;
 #define GETTEXT_PACKAGE “helloworld”&lt;br /&gt;
 #define LOCALEDIR “./locale”&lt;br /&gt;
 static void button_clicked(GtkWidget * widget, gpointer data)&lt;br /&gt;
 {&lt;br /&gt;
   g_print(“Button pressed!\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 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;
   bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);&lt;br /&gt;
   bind_textdomain_codeset (GETTEXT_PACKAGE, “UTF-8”);&lt;br /&gt;
   textdomain (GETTEXT_PACKAGE);&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), _(“Hello World!”));&lt;br /&gt;
   gtk_container_set_border_width(GTK_CONTAINER(window), 10);&lt;br /&gt;
   g_signal_connect(G_OBJECT(window), “delete_event”, G_&lt;br /&gt;
 CALLBACK(delete_event), NULL);&lt;br /&gt;
   g_signal_connect(G_OBJECT(window), “destroy”, G_&lt;br /&gt;
 CALLBACK(destroy), NULL);&lt;br /&gt;
   button = gtk_button_new_with_label(_(“Quit”));&lt;br /&gt;
   g_signal_connect(G_OBJECT(button), “clicked”, G_CALLBACK(button_&lt;br /&gt;
 clicked), NULL);&lt;br /&gt;
   g_signal_connect_swapped(G_OBJECT(button), “clicked”, G_&lt;br /&gt;
 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;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Внимательный читатель сразу заметит, что мы добавили новый&lt;br /&gt;
заголовочный файл – '''libintl.h'''. Этот файл содержит объявления функций, макросов и прочего, относящегося к интернационализации ''GNU gettext''. Заголовочный файл '''libintl.h''' соответствует библиотеке ''libintl'',&lt;br /&gt;
которая должна быть скомпонована с нашей программой. Эта библиотека является частью ''glibc'', а потому, если сборка программы выполняется в Linux (или другой системе, использующей ''glibc''), связывание происходит автоматически и никаких дополнительных ключей не требуется. Вслед за директивами '''#include''' мы объявляем три&lt;br /&gt;
макроса и две константы. Эти макросы представляют собой стандартную часть любого приложения, использующего интернационализацию GNU. Макрос '''_()''' является псевдонимом макроса '''gettext()'''. Сам макрос&lt;br /&gt;
'''gettext()''' выполняет две функции, о которых говорилось в теоретическом введении – помечает в исходном тексте программы те строки текста, которые требуют перевода, и заменяет оригинальную строку ее&lt;br /&gt;
переводом во время выполнения программы. Мы используем псевдоним ради удобства, поскольку печатать один символ «'''_'''» проще, чем вводить слово '''gettext'''. Забегая вперед, отметим, что с помощью макроса '''_()''' мы помечаем для перевода две строки – '''Hello World!''' и '''Quit'''.&lt;br /&gt;
Константа '''GETTEXT_PACKAGE''' указывает общее имя файлов каталогов сообщений данного приложения, из которых программа должна будет брать переводы строк. Файлов каталогов сообщений у каждогo&lt;br /&gt;
приложения может быть много (по одному файлу для каждого языка&lt;br /&gt;
и кодировки, на которые переведен интерфейс приложения), но все&lt;br /&gt;
они имеют одно и то же имя (обычно соответствующее имени приложения, с добавлением расширения '''.mo'''). При этом никакого конфликта не возникает, поскольку файлы, соответствующие разным языкам,&lt;br /&gt;
хранятся в разных поддиректориях корневой директории каталогов&lt;br /&gt;
сообщений. Если вы откроете одну из корневых директорий, в которой&lt;br /&gt;
по умолчанию хранятся ресурсы локализации, например, '''/usr/share/locale''', то увидите в ней множество поддиректорий, имена которых совпадают с сокращенными именами различных локалей. В каждой&lt;br /&gt;
из этих директорий вы найдете поддиректорию '''LC_MESSAGES'''. В ней&lt;br /&gt;
обычно хранятся файлы локализации различных приложений. В сиcтеме есть несколько директорий, используемых для хранения файлов&lt;br /&gt;
переводов. Программы GNOME ищут каталоги сообщений в поддиректориях '''/opt/gnome/share/locale'''. Универсальным хранилищем файлов переводов для разных приложений, использующих интернационализацию, основанную на ''GNU gettext'', служит директория '''/usr/share/locale'''.&lt;br /&gt;
Очевидно, что эти директории уместно использовать для хранения&lt;br /&gt;
ресурсов тех приложений, которые установлены в системе глобально&lt;br /&gt;
и доступны всем пользователям. Константа '''LOCALEDIR''' позволяет нам&lt;br /&gt;
указать нестандартную корневую директорию для хранения файлов&lt;br /&gt;
локализации нашего приложения. В качестве таковой мы указываем&lt;br /&gt;
директорию '''locale''', которая должна располагаться в рабочей директории программы.&lt;br /&gt;
&lt;br /&gt;
В начале функции '''main()''' мы вызываем две функции, загружающие&lt;br /&gt;
и настраивающие ресурсы локализации. Функция '''bindtextdomain(3)'''&lt;br /&gt;
указывает системе интернационализации имя файлов ресурсов локализации и имя корневой директории, в которой они хранится. Функция&lt;br /&gt;
'''bind_textdomain_codeset(3)''' позволяет указать кодировку переведенных сообщений в файлах локализации. Во время выполнения наша программа определит имя локали, в которой она работает, и будет&lt;br /&gt;
искать файл с именем, заданным '''GETTEXT_PACKAGE''', в соответствующей директории. Как видите, все английские строки, требующие перевода, представлены в программе как аргументы макроса '''_()''' (который,&lt;br /&gt;
напомню, является синонимом макроса '''gettext()''').&lt;br /&gt;
&lt;br /&gt;
На этом этапе интерфейс программы '''helloworld''' готов к переводу на&lt;br /&gt;
другие языки. Наша следующая задача – извлечь из исходного текста&lt;br /&gt;
программы список строк, которые надлежит перевести. Это делается&lt;br /&gt;
с помощью уже упомянутой утилиты ''xgettext''. В окне консоли даем&lt;br /&gt;
команду:&lt;br /&gt;
&lt;br /&gt;
 xgettext -C helloworld.c -k_&lt;br /&gt;
&lt;br /&gt;
Ключ '''–C''' указывает программе, что она имеет дело с исходным&lt;br /&gt;
файлом ''C/C++''. Ключ '''–k''' позволяет нам указать вид маркера, которым&lt;br /&gt;
помечены строки для перевода. В нашем случае маркером служит знак&lt;br /&gt;
подчеркивания. Утилита ''xgettext'' не вносит никаких изменений в файл&lt;br /&gt;
'''helloworld.c''', но в результате ее выполнения на диске появится файл&lt;br /&gt;
'''messages.po''', содержащий все строки из файла '''helloworld.c''', помеченные макросом '''_()'''. Мы сделаем копию этого файла и назовем ее '''ru.po''', а&lt;br /&gt;
затем добавим в нее русский перевод строк интерфейса. Файлы переводов '''*.po''' представляют собой документы ''XML''. Для работы с файлами переводов можно воспользоваться редактором ''Emacs'', можно даже&lt;br /&gt;
добавлять строки перевода «вручную» в обычном текстовом редакторе (при этом, конечно, необходимо соблюдать формат файлов '''*.po''').&lt;br /&gt;
Однако в вашей системе наверняка установлен гораздо более удобный&lt;br /&gt;
инструмент, который, правда, не является частью пакетов ''GTK+'' или&lt;br /&gt;
''GNU Gettext''. Речь идет о редакторе файлов перевода ''KBabel'', входящем&lt;br /&gt;
в состав пакета разработчика KDE (рис. 1).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF88_gtk1.png|Рис. 1]]&lt;br /&gt;
&lt;br /&gt;
'''KBabel в работе.'''&lt;br /&gt;
&lt;br /&gt;
Окно ''KBabel'' вертикально разделено на две половины. Левая половина содержит три окна. В самом верхнем окне вы найдете список всех строк, подлежащих переводу. В среднем окне можно выбрать&lt;br /&gt;
строку для перевода, а в нижнем окне – ввести сам перевод. Правая&lt;br /&gt;
часть окна ''KBabel'' содержит некоторые вспомогательные инструменты.&lt;br /&gt;
Выполним перевод всех строк на русский язык и сохраним изменения,&lt;br /&gt;
внесенные в файл '''ru.po'''. Если вы просматриваете пиктограмму файла&lt;br /&gt;
'''ru.po''' в менеджере ''Konqueror', то можете заметить, что цвет круга на&lt;br /&gt;
пиктограмме файла изменился с красного на зеленый. Это значит, что&lt;br /&gt;
все содержимое файла переведено (круг на иконке файла представляет собой диаграмму, отображающую процент переведенных строк).&lt;br /&gt;
Полученный нами файл перевода '''ru.po''' представляет собой «исходник»&lt;br /&gt;
двоичного ресурса локализации. Для того чтобы скомпилировать его в&lt;br /&gt;
«машинное» представление, мы воспользуемся утилитой ''msgfmt'':&lt;br /&gt;
&lt;br /&gt;
 msgfmt ru.po -o helloworld.mo&lt;br /&gt;
&lt;br /&gt;
В результате появится файл '''helloworld.mo''', который мы сможем&lt;br /&gt;
распространять вместе с двоичной версией нашей программы. Для&lt;br /&gt;
того, чтобы во время выполнения программа могла использовать этот&lt;br /&gt;
файл, его нужно поместить туда, где программа ожидает его найти. В&lt;br /&gt;
нашем случае это директория '''./locale/ru/LC_MESSAGES'''. Нам, кажется,&lt;br /&gt;
осталось только скомпилировать программу '''helloworld'''. Теперь при &lt;br /&gt;
запуске вы увидите надписи на русском языке (рис. 2).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF88_gtk2.png|Рис. 2]]&lt;br /&gt;
&lt;br /&gt;
'''Русифицированная программа ''helloworld''.'''&lt;br /&gt;
&lt;br /&gt;
В нашем кратком обзоре мы, разумеется, рассмотрели далеко не&lt;br /&gt;
все аспекты интернационализации и локализации приложений с помощью системы ''GNU gettext'', так что пренебрегать учебником GNU ни в коем случае не следует. Отметим здесь еще одну утилиту, которая&lt;br /&gt;
может оказаться полезной в процессе локализации сложных проектов.&lt;br /&gt;
Представьте себе, что вы локализуете свою (или чужую) программу.&lt;br /&gt;
Вы создали файл каталога сообщений, перевели все сообщения на&lt;br /&gt;
ваш родной (или не родной) язык, скомпилировали двоичный каталог&lt;br /&gt;
сообщений... Но жизнь не стоит на месте, и программа, локализацией&lt;br /&gt;
которой вы занимаетесь, продолжает развиваться. В ней появляются&lt;br /&gt;
новые строки, требующие перевода. Было бы очень неразумно начинать весь процесс локализации сначала из-за того, что в программе появилась новая текстовая строка. Ведь у вас уже есть каталог сообщений, который содержит перевод всех остальных строк. Если вы не хотите переписывать вручную весь перевод каждый раз, когда каталог сообщений, генерируемый утилитой ''xgettext'', изменится, вам на&lt;br /&gt;
помощь придет утилита ''msgmerge''. Эта утилита позволяет объединить&lt;br /&gt;
старый, уже переведенный каталог сообщений и новый каталог, содержащий дополнения.&lt;br /&gt;
&lt;br /&gt;
==Две кнопки==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы исследовать возможности ''GTK+'', нам, конечно, понадобятся программы с более сложным интерфейсом, чем окно с одной кнопкой, так что сейчас будет логично рассмотреть некоторые принципы построения интерфейсов программ ''GTK+''. В первой статье этой серии мы уже упоминали объекты-контейнеры, которые управляют&lt;br /&gt;
размером и расположением дочерних визуальных элементов. Главное&lt;br /&gt;
окно приложения ''GTK+'' само представляет собой объект-контейнер.&lt;br /&gt;
Впрочем, возможности главного окна как объекта-контейнера весьма&lt;br /&gt;
ограничены. В частности, попытка добавить в окно приложения вторую кнопку наталкивается на неожиданное препятствие, – у главного окна приложения может быть только один дочерний визуальный&lt;br /&gt;
элемент. Если мы хотим, чтобы окно приложения содержало более&lt;br /&gt;
одного визуального элемента (естественное желание, не правда ли?),&lt;br /&gt;
мы должны сначала разместить в окне дочерний объект-контейнер,&lt;br /&gt;
способный управлять большим числом элементов. Объектов-контейнеров в ''GTK+'' реализовано немало. Все они являются потомками объекта '''GtkContainer''', реализующего абстрактный контейнер. В частности, объект-контейнер главного окна принадлежит классу '''GtkBin''', представляющему собой контейнер, способный содержать (вы догадались!) только&lt;br /&gt;
один дочерний элемент. Другие контейнеры позволяют управлять сразу многими дочерними визуальными элементами.&lt;br /&gt;
&lt;br /&gt;
Все контейнеры ''GTK+'' можно разделить на две категории. Одни&lt;br /&gt;
контейнеры управляют расположением дочерних визуальных элементов, но сами визуальными элементами не являются. К этой категории контейнеров относится контейнер '''GtkHBox''', с которым мы познакомимся ниже. Ко второй категории относятся контейнеры, которые включают определенные визуальные элементы управления «по умолчанию». Примером контейнеров этого типа может служить контейнер '''GtkNotebook''', который создает панель с несколькими вкладками&lt;br /&gt;
&lt;br /&gt;
Рассмотрим пример использования простого контейнера '''GtkHBox''',&lt;br /&gt;
который позволяет расположить несколько дочерних элементов горизонтально. Ниже приведен текст программы '''buttontest''', в которой мы пользуемся не одной, а двумя кнопками.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&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;
   gint i = * (gint *) data;&lt;br /&gt;
   g_print(“Button #%i is pressed!\n”, i);&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 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 * button1;&lt;br /&gt;
   GtkWidget * button2;&lt;br /&gt;
   GtkWidget * box;&lt;br /&gt;
   gint i1, i2;&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), “Buttons”);&lt;br /&gt;
   gtk_container_set_border_width(GTK_CONTAINER(window), 10);&lt;br /&gt;
   g_signal_connect(G_OBJECT(window), “delete_event”, G_&lt;br /&gt;
 CALLBACK(delete_event), NULL);&lt;br /&gt;
   g_signal_connect(G_OBJECT(window), “destroy”, G_&lt;br /&gt;
 CALLBACK(destroy), NULL);&lt;br /&gt;
   box = gtk_hbox_new(TRUE, 2);&lt;br /&gt;
   gtk_container_add(GTK_CONTAINER(window), box);&lt;br /&gt;
   button1 = gtk_button_new_with_label(“Выход”);&lt;br /&gt;
   i1 = 1;&lt;br /&gt;
   g_signal_connect(G_OBJECT(button1), “clicked”, G_CALLBACK(button_&lt;br /&gt;
 clicked), &amp;amp;i1);&lt;br /&gt;
   g_signal_connect_swapped(G_OBJECT(button1), “clicked”, G_&lt;br /&gt;
 CALLBACK(gtk_widget_destroy), G_OBJECT(window));&lt;br /&gt;
   gtk_box_pack_start(GTK_BOX(box), button1, TRUE, TRUE, 0);&lt;br /&gt;
   button2 = gtk_button_new_with_label(“Кнопка 2”);&lt;br /&gt;
   i2 = 2;&lt;br /&gt;
   g_signal_connect(G_OBJECT(button2), “clicked”, G_CALLBACK(button_&lt;br /&gt;
 clicked), &amp;amp;i2);&lt;br /&gt;
   gtk_box_pack_start(GTK_BOX(box), button2, TRUE, TRUE, 0);&lt;br /&gt;
   gtk_widget_show(button1);&lt;br /&gt;
   gtk_widget_show(button2);&lt;br /&gt;
   gtk_widget_show(box);&lt;br /&gt;
   gtk_widget_show(window);&lt;br /&gt;
   gtk_main();&lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере дочерним элементом главного окна программы&lt;br /&gt;
содержит контейнер '''box''', который, в свою очередь, включает две кнопки – '''button1''' и '''button2'''. Контейнер типа '''GtkHBox''' создается функцией-конструктором '''gtk_hbox_new()'''. Конструктор принимает два аргумента.&lt;br /&gt;
Первый аргумент, значение типа '''gboolean''', позволяет указать, должны&lt;br /&gt;
ли дочерние элементы контейнера иметь одинаковые размеры. Если&lt;br /&gt;
передать в этом аргументе значение '''true''', размеры дочерних элементов&lt;br /&gt;
будут одинаковыми. Второй аргумент имеет тип '''gint''' и позволяет указать расстояние между дочерними элементами контейнера в пикселях. Здесь уместно еще раз обратить внимание на систему типов ''GTK+''. В&lt;br /&gt;
целях улучшения переносимости с одной платформы на другую, ''GTK+''&lt;br /&gt;
определяет собственные аналоги простых типов данных ''C''. Многие&lt;br /&gt;
из этих типов представляют собой псевдонимы типов ''C'' со схожими&lt;br /&gt;
именами. Например, тип '''gint''', является псевдонимом типа '''int'''. Сложнее&lt;br /&gt;
обстоит дело с типом '''gboolean'''. В языке ''C'' (в отличие от ''C++'') нет встроенного булевого типа, и тип ''gboolean'' является псевдонимом типа ''gint''. Константы '''TRUE''' и '''FALSE''' объявлены так, чтобы соответствовать&lt;br /&gt;
результатам логических операций ''C''. ('''FALSE = 0''', '''TRUE = !FALSE''', то есть&lt;br /&gt;
любое ненулевое значение).&lt;br /&gt;
&lt;br /&gt;
После того, как мы создали контейнер, мы делаем его дочерним&lt;br /&gt;
элементом главного окна с помощью знакомой нам функции '''gtk_container_add()'''. Далее мы создаем кнопку и назначаем ей обработчики сигналов, так же, как мы делали в предыдущем примере. Наша следующая задача – добавить кнопку в контейнер box. Для этого мы воспользуемся функцией '''gtk_box_pack_start()'''. Функция '''gtk_box_pack_start()'''&lt;br /&gt;
добавляет новые визуальные элементы в контейнер в порядке слева&lt;br /&gt;
направо, если контейнер представляет собой «горизонтальный ящик»&lt;br /&gt;
'''GtkHBox''', и сверху вниз, если контейнер представляет собой «вертикальный ящик» '''GtkVBox'''. Функция '''gtk_box_pack_end()''' добавляет элементы в противоположном порядке, соответственно справа налево и&lt;br /&gt;
снизу вверх. Функции '''gtk_box_pack_start()''' и '''gtk_box_pack_end()''' обладают одинаковым набором параметров. Первым параметром каждой функции является указатель на объект-контейнер. Вторым параметром&lt;br /&gt;
служит указатель на добавляемый объект. Третий и четвертый параметры позволяют указать порядок добавления и распределения нового пространства, добавляемого вместе с новым элементом. Последний&lt;br /&gt;
параметр указывает, сколько дополнительных пикселей следует расположить между новым элементом и его соседями.&lt;br /&gt;
&lt;br /&gt;
Хотя объект '''box''' сам по себе не создает никаких визуальных элементов, его следует сделать видимым с помощью функции '''gtk_widget_show()''', как и все визуальные элементы программы. В результате получаем окно с двумя кнопками (рис. 3).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF88_gtk3.png|Рис. 3]]&lt;br /&gt;
&lt;br /&gt;
'''Окно с двумя кнопками.'''&lt;br /&gt;
&lt;br /&gt;
Вооружившись познаниями о контейнерах, мы сможем свободно&lt;br /&gt;
исследовать другие визуальные элементы ''GTK+'', а также подробнее&lt;br /&gt;
изучить механизм сигналов, чему и будет посвящена следующая статья. '''LXF'''&lt;/div&gt;</description>
			<pubDate>Wed, 10 Dec 2008 05:02:21 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF87-88:GTK%2B</comments>		</item>
	</channel>
</rss>