<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=16170&amp;type=atom" />
	<updated>2013-12-07T23:59:42Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=16170</id>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=380490#p380490" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>sklimkin пишет:</cite><blockquote><p>Первая программа - консольная для работы через COM-port (RS-232) с приемником/навигатором Garmin по его бинарному протоколу написана в редакторе gedit.</p></blockquote></div><p>Я по своему опыту разделяю прием данных и отрисовку в разные процессы. прием - цикл чтения (через таймаут или poll) -&gt; pipe или unix socket -&gt; отрисовка.<br />При B115200 и больше без этого даже движение мыши вызывало потерю данных.<br />Программа чтения просто читает данные в буфер(для хранения) и пишет на stdout.<br />Получилось лучше чем делать multithread да и писать проще.</p>]]></content>
			<author>
				<name><![CDATA[vic5710]]></name>
				<uri>https://linuxforum.ru/profile.php?id=32751</uri>
			</author>
			<updated>2013-12-07T23:59:42Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=380490#p380490</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=311881#p311881" />
			<content type="html"><![CDATA[<p>Исправленный scrot GTK+<br />Переход с целевую dir и создание скриншота в ней (без перемещения файла)<br /><a href="http://www.mediafire.com/?l79j1cb2ll4gbhc">http://www.mediafire.com/?l79j1cb2ll4gbhc</a></p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-11-30T16:37:04Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=311881#p311881</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=308495#p308495" />
			<content type="html"><![CDATA[<p><strong>Два варианта GUI для scrot на СИ</strong></p><p>1. в теле СИ-функции все строки, как адаптация bash-script, работают со scrot через gtkdialog<br />&nbsp; &nbsp;В результате компиляции получается бинарный файл scrotdlg 9.5 КБ<br /><a href="http://www.mediafire.com/download.php?el5ruubgov613qg">http://www.mediafire.com/download.php?el5ruubgov613qg</a></p><p>2. СИ-файл использует только GTK+ виджеты/функции и работает со scrot через GTK+<br />&nbsp; &nbsp;В результате компиляции получается бинарный файл scrotdlg 31.7 КБ<br /><a href="http://www.mediafire.com/?k8e2cbw21hcczdc">http://www.mediafire.com/?k8e2cbw21hcczdc</a></p><p>В архивах СИ-исходник, бинарный файл, Malefile и по паре скриншотов.<br />То есть это 2 разные возможности работы со скрин-грабером scrot.<br />Через gtkdialog и через GTK+</p><p>3-й вариант использующий только bash-скрипт (который обращается к gtkdialog) смотри на:<br /><a href="http://linuxforum.ru/viewtopic.php?id=25092">http://linuxforum.ru/viewtopic.php?id=25092</a></p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-11-09T21:23:42Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=308495#p308495</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=307777#p307777" />
			<content type="html"><![CDATA[<p>Отвечаю на свой вопрос сам: все дело в порядке ключей командной строки.<br />Должно быть: scrot&nbsp; &quot;grab-mode&quot; &quot;time-delay&quot; &quot;DIR-to-save-file&quot;<br />&quot;grab-mode&quot;&nbsp; &nbsp;-m или -s или -u<br />&quot;time-delay&quot;&nbsp; &nbsp;-d 0 или 1 или 2 или ...<br />&quot;DIR-to-save-file&quot;&nbsp; &nbsp;pwd из $FILE</p><p>Вот последний (?) вариант скрипта:<br /></p><div class="codebox"><pre><code>#!/bin/bash
GTKDIALOG=gtkdialog

call() {
funccommand $COMBOBOX1 $COMBOBOX2
echo &quot;call_COMMANDSTRING= $COMMANDSTRING&quot;
scrot &quot;$COMMANDSTRING&quot;
}

funccommand () {
if [ &quot;$COMBOBOX1&quot; == &quot;All&quot; ]; then
COMMAND1=&quot;-m&quot;
else COMMAND1=&quot;-s&quot;
fi
if [ &quot;$COMBOBOX1&quot; == &quot;Window&quot; ]; then
COMMAND1=&quot;-u&quot;
fi
echo &quot;COMMAND1= $COMMAND1&quot;
COMMAND2=&quot;$COMBOBOX2&quot;
echo &quot;COMMAND2= $COMMAND2&quot;
COMMANDSTRING=&quot;$COMMAND1 -b -d $COMMAND2 -e &#039;mv $f ~&#039;&quot;
echo &quot;COMMANDSTRING= $COMMANDSTRING&quot;
echo &quot;End of export variables.&quot;
}

export -f call
export -f funccommand

export MAIN_DIALOG=&#039;
&lt;window title=&quot;SCReenshOT  screen-grabber&quot;&gt;
    &lt;vbox&gt;
        &lt;frame Command button EXIT&gt;
            &lt;hbox&gt;
                &lt;button cancel&gt;&lt;/button&gt;
            &lt;/hbox&gt;
        &lt;/frame&gt;

        &lt;frame User-settings&gt;
            &lt;hbox&gt;
                &lt;vbox&gt;
                    &lt;text&gt;
                        &lt;label&gt;Select grab-mode&lt;/label&gt;
                    &lt;/text&gt;
                    &lt;combobox&gt;
                        &lt;variable&gt;COMBOBOX1&lt;/variable&gt;
                        &lt;item&gt;All&lt;/item&gt;
                        &lt;item&gt;Window&lt;/item&gt;
                        &lt;item&gt;Area&lt;/item&gt;
                        &lt;action&gt;save:COMBOBOX1&lt;/action&gt;
                        &lt;variable&gt;COMMAND1&lt;/variable&gt;
                    &lt;/combobox&gt;
                &lt;/vbox&gt;
                &lt;vbox&gt;
                    &lt;text&gt;
                        &lt;label&gt;Time-delay-sec&lt;/label&gt;
                    &lt;/text&gt;
                    &lt;combobox&gt;
                        &lt;variable&gt;COMBOBOX2&lt;/variable&gt;
                        &lt;item&gt;0&lt;/item&gt;
                        &lt;item&gt;1&lt;/item&gt;
                        &lt;item&gt;2&lt;/item&gt;
                        &lt;item&gt;3&lt;/item&gt;
                        &lt;item&gt;5&lt;/item&gt;
                        &lt;item&gt;10&lt;/item&gt;
                        &lt;item&gt;20&lt;/item&gt;
                        &lt;action&gt;save:COMBOBOX2&lt;/action&gt;
                        &lt;variable&gt;COMMAND2&lt;/variable&gt;
                    &lt;/combobox&gt;
                &lt;/vbox&gt;
                &lt;button&gt;
                    &lt;label&gt;ACCEPT&lt;/label&gt;
                    &lt;variable&gt;GOMMANDSRING&lt;/variable&gt;
                    &lt;action&gt;echo &quot;Start of scrot:&quot;&lt;/action&gt;
                    &lt;action&gt;call &lt;/action&gt;
                &lt;/button&gt;
            &lt;/hbox&gt;
        &lt;/frame&gt;

        &lt;frame Select DIR for save screenshot&gt;
            &lt;chooser&gt;
                &lt;height&gt;200&lt;/height&gt;
                &lt;width&gt;200&lt;/width&gt;
                &lt;variable&gt;FILE&lt;/variable&gt;
                &lt;default&gt;/home/&lt;/default&gt;
                &lt;action&gt;cat [ echo $FILE ] | zenity --text-info  --width=250 --height=250 --title $FILE&lt;/action&gt;
            &lt;/chooser&gt;
        &lt;/frame&gt;
    &lt;/vbox&gt;
&lt;/window&gt;
&#039;

case $1 in
    -d | --dump) echo &quot;$MAIN_DIALOG&quot; ;;
    *) $GTKDIALOG --program=MAIN_DIALOG ;;
esac</code></pre></div>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-11-05T18:42:10Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=307777#p307777</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=307246#p307246" />
			<content type="html"><![CDATA[<p><strong>SCROT + GTKDIALOG для оконного интерфейса из bash-script</strong><br />Мне нравится программа scrot (SCReenshOT) для &quot;фотографирования&quot; экрана монитора.<br />У нее есть необходимые и понятные аргументы/ключи для вызова, но... она консольная.</p><p>Сделал интерфейс gcc + GTK2 (в архиве есть и исхлдник на СИ и скриншоты):<br /><a href="http://www.mediafire.com/?u3860bikpsatd2t">http://www.mediafire.com/?u3860bikpsatd2t</a></p><p>Но размер исполняемого файла (37 КБ) заставил задуматься.<br />Взялся за gtkdialog (файл получился 17 КБ)&nbsp; - но в gtkdialog очень мало СИ-шных возможностей.<br />Пришлось интенсивно читать о премудростях bash-script</p><p>Оказалось, что совсем непросто повторить в gtkdialog то, что легко получается просто в bash<br />Из основного модуля gtkdialog надо обращаться к внешним (по отношению к нему) функциям.<br />Вот как выглядят ф-ции, которые пишутся в начале скрипта:<br /></p><div class="codebox"><pre><code>call() {
funccommand $COMBOBOX1 $COMBOBOX2
echo &quot;call_COMMANDSTRING= $COMMANDSTRING&quot;
cat &quot;$COMMANDSTRING&quot; | scrot
}</code></pre></div><p>она вызывается из основного кода скрипта:<br /></p><div class="codebox"><pre><code>&lt;button&gt;
&lt;label&gt;ACCEPT&lt;/label&gt;
&lt;variable&gt;GOMMANDSRING&lt;/variable&gt;
&lt;action&gt;echo &quot;Start of scrot:&quot;&lt;/action&gt;
&lt;action&gt;call &lt;/action&gt;
&lt;/button&gt;</code></pre></div><p>и она вызывает другую пользовательскую ф-цию funccommand () :<br /></p><div class="codebox"><pre><code>funccommand () {
if [ &quot;$COMBOBOX1&quot; == &quot;All&quot; ]; then
COMMAND1=
else COMMAND1=&quot;-s&quot;
fi
... ... ...
... ... ...
echo &quot;End of export variables.&quot;
}</code></pre></div><p>В результате получаем строку аргументов для вызова программы scrot такого вида:<br />scrot -d 5 -s -e &#039;mv $f ~&#039; (задержка 5 сек., выбор области, поместить в DIR)</p><p>Но для этого нужно иметь gtkdialig версии не ниже 0.8.0<br />Но и это еще не все,&nbsp; надо объявить:<br /></p><div class="codebox"><pre><code>export -f имя_внешней-функции</code></pre></div><p>Теперь скрипт (его размер 2 КБ) работает, но &quot;командная строка&quot; для scrot интерпретеруется не вся.<br />scrot &quot;не видит&quot; важного аргумента - тип захвата (все, окно, область-рамка) и захватывает весь экран.</p><p>ПОЭТОМУ: если есть знатоки ИМЕННО <strong>gtkdialog</strong>, подскажите где &quot;дырка&quot;.</p><p>Привожу текст gtkdialog-скрипта :<br /></p><div class="codebox"><pre><code>#!/bin/bash
GTKDIALOG=gtkdialog

call() {
funccommand $COMBOBOX1 $COMBOBOX2
echo &quot;call_COMMANDSTRING= $COMMANDSTRING&quot;
cat &quot;$COMMANDSTRING&quot; | scrot
}

funccommand () {
if [ &quot;$COMBOBOX1&quot; == &quot;All&quot; ]; then
COMMAND1= 
else COMMAND1=&quot;-s&quot;
fi
if [ &quot;$COMBOBOX1&quot; == &quot;Window&quot; ]; then
COMMAND1=&quot;-u&quot;
fi
echo &quot;COMMAND1= $COMMAND1&quot;
COMMAND2=&quot;$COMBOBOX2&quot;
echo &quot;COMMAND2= $COMMAND2&quot;
COMMANDSTRING=&quot;-d $COMMAND2 $COMMAND1 -e &#039;mv $f &#039;&quot;
echo &quot;COMMANDSTRING= $COMMANDSTRING&quot;
echo &quot;End of export variables.&quot;
}

export -f call
export -f funccommand

export MAIN_DIALOG=&#039;
&lt;window title=&quot;SCReenshOT  screen-grabber&quot;&gt;
    &lt;vbox&gt;
        &lt;frame Command button EXIT&gt;
            &lt;hbox&gt;
                &lt;button cancel&gt;&lt;/button&gt;
            &lt;/hbox&gt;
        &lt;/frame&gt;

        &lt;frame User-settings&gt;
            &lt;hbox&gt;
                &lt;vbox&gt;
                    &lt;text&gt;
                        &lt;label&gt;Select grab-mode&lt;/label&gt;
                    &lt;/text&gt;
                    &lt;combobox&gt;
                        &lt;variable&gt;COMBOBOX1&lt;/variable&gt;
                        &lt;item&gt;All&lt;/item&gt;
                        &lt;item&gt;Window&lt;/item&gt;
                        &lt;item&gt;Area&lt;/item&gt;
                        &lt;action&gt;save:COMBOBOX1&lt;/action&gt;
                        &lt;variable&gt;COMMAND1&lt;/variable&gt;
                    &lt;/combobox&gt;
                &lt;/vbox&gt;
                &lt;vbox&gt;
                    &lt;text&gt;
                        &lt;label&gt;Time-delay-sec&lt;/label&gt;
                    &lt;/text&gt;
                    &lt;combobox&gt;
                        &lt;variable&gt;COMBOBOX2&lt;/variable&gt;
                        &lt;item&gt;0&lt;/item&gt;
                        &lt;item&gt;1&lt;/item&gt;
                        &lt;item&gt;2&lt;/item&gt;
                        &lt;item&gt;5&lt;/item&gt;
                        &lt;item&gt;10&lt;/item&gt;
                        &lt;item&gt;20&lt;/item&gt;
                        &lt;action&gt;save:COMBOBOX2&lt;/action&gt;
                        &lt;variable&gt;COMMAND2&lt;/variable&gt;
                    &lt;/combobox&gt;
                &lt;/vbox&gt;
                &lt;button&gt;
                    &lt;label&gt;ACCEPT&lt;/label&gt;
                    &lt;variable&gt;GOMMANDSRING&lt;/variable&gt;
                    &lt;action&gt;echo &quot;Start of scrot:&quot;&lt;/action&gt;
                    &lt;action&gt;call &lt;/action&gt;
                &lt;/button&gt;
            &lt;/hbox&gt;
        &lt;/frame&gt;

        &lt;frame Select DIR for save screenshot&gt;
            &lt;chooser&gt;
                &lt;height&gt;200&lt;/height&gt;
                &lt;width&gt;200&lt;/width&gt;
                &lt;variable&gt;FILE&lt;/variable&gt;
                &lt;default&gt;/home/&lt;/default&gt;
                &lt;action&gt;cat [ echo $FILE ] | zenity --text-info  --width=250 --height=250 --title $FILE&lt;/action&gt;
            &lt;/chooser&gt;
        &lt;/frame&gt;
    &lt;/vbox&gt;
&lt;/window&gt;
&#039;

case $1 in
    -d | --dump) echo &quot;$MAIN_DIALOG&quot; ;;
    *) $GTKDIALOG --program=MAIN_DIALOG ;;
esac</code></pre></div>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-11-01T20:32:40Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=307246#p307246</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=301690#p301690" />
			<content type="html"><![CDATA[<p>Уверен что функции таймаута хватит для работы.</p>]]></content>
			<author>
				<name><![CDATA[Oleg_Grabar]]></name>
				<uri>https://linuxforum.ru/profile.php?id=25880</uri>
			</author>
			<updated>2012-10-05T10:31:06Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=301690#p301690</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=290007#p290007" />
			<content type="html"><![CDATA[<p>Пример программы на GTK+ создающий заготовку меню с наполнением, которую пользователь может приспособить для своих конкретных нужд.<br /><a href="http://stuff.mit.edu/afs/sipb/user/xiphmont/share/gtk-2.0/demo/ui_manager.c">http://stuff.mit.edu/afs/sipb/user/xiph … _manager.c</a><br /></p><div class="codebox"><pre><code>/* UI Manager
 *
 * The GtkUIManager object allows the easy creation of menus
 * from an array of actions and a description of the menu hierarchy.
 */

#include &lt;gtk/gtk.h&gt;

static void
activate_action (GtkAction *action)
{
  g_message (&quot;Action \&quot;%s\&quot; activated&quot;, gtk_action_get_name (action));
}

static void
activate_radio_action (GtkAction *action, GtkRadioAction *current)
{
  g_message (&quot;Radio action \&quot;%s\&quot; selected&quot;, 
         gtk_action_get_name (GTK_ACTION (current)));
}

static GtkActionEntry entries[] = {
  { &quot;FileMenu&quot;, NULL, &quot;_File&quot; },               /* name, stock id, label */
  { &quot;PreferencesMenu&quot;, NULL, &quot;_Preferences&quot; }, /* name, stock id, label */
  { &quot;ColorMenu&quot;, NULL, &quot;_Color&quot;  },            /* name, stock id, label */
  { &quot;ShapeMenu&quot;, NULL, &quot;_Shape&quot; },             /* name, stock id, label */
  { &quot;HelpMenu&quot;, NULL, &quot;_Help&quot; },               /* name, stock id, label */
  { &quot;New&quot;, GTK_STOCK_NEW,                      /* name, stock id */
    &quot;_New&quot;, &quot;&lt;control&gt;N&quot;,                      /* label, accelerator */
    &quot;Create a new file&quot;,                       /* tooltip */ 
    G_CALLBACK (activate_action) },      
  { &quot;Open&quot;, GTK_STOCK_OPEN,                    /* name, stock id */
    &quot;_Open&quot;,&quot;&lt;control&gt;O&quot;,                      /* label, accelerator */     
    &quot;Open a file&quot;,                             /* tooltip */
    G_CALLBACK (activate_action) }, 
  { &quot;Save&quot;, GTK_STOCK_SAVE,                    /* name, stock id */
    &quot;_Save&quot;,&quot;&lt;control&gt;S&quot;,                      /* label, accelerator */     
    &quot;Save current file&quot;,                       /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;SaveAs&quot;, GTK_STOCK_SAVE,                  /* name, stock id */
    &quot;Save _As...&quot;, NULL,                       /* label, accelerator */     
    &quot;Save to a file&quot;,                          /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;Quit&quot;, GTK_STOCK_QUIT,                    /* name, stock id */
    &quot;_Quit&quot;, &quot;&lt;control&gt;Q&quot;,                     /* label, accelerator */     
    &quot;Quit&quot;,                                    /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;About&quot;, NULL,                             /* name, stock id */
    &quot;_About&quot;, &quot;&lt;control&gt;A&quot;,                    /* label, accelerator */     
    &quot;About&quot;,                                   /* tooltip */  
    G_CALLBACK (activate_action) },
  { &quot;Logo&quot;, &quot;demo-gtk-logo&quot;,                   /* name, stock id */
     NULL, NULL,                               /* label, accelerator */     
    &quot;GTK+&quot;,                                    /* tooltip */
    G_CALLBACK (activate_action) },
};
static guint n_entries = G_N_ELEMENTS (entries);


static GtkToggleActionEntry toggle_entries[] = {
  { &quot;Bold&quot;, GTK_STOCK_BOLD,                    /* name, stock id */
     &quot;_Bold&quot;, &quot;&lt;control&gt;B&quot;,                    /* label, accelerator */     
    &quot;Bold&quot;,                                    /* tooltip */
    G_CALLBACK (activate_action), 
    TRUE },                                    /* is_active */
};
static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);

enum {
  COLOR_RED,
  COLOR_GREEN,
  COLOR_BLUE
};

static GtkRadioActionEntry color_entries[] = {
  { &quot;Red&quot;, NULL,                               /* name, stock id */
    &quot;_Red&quot;, &quot;&lt;control&gt;R&quot;,                      /* label, accelerator */     
    &quot;Blood&quot;, COLOR_RED },                      /* tooltip, value */
  { &quot;Green&quot;, NULL,                             /* name, stock id */
    &quot;_Green&quot;, &quot;&lt;control&gt;G&quot;,                    /* label, accelerator */     
    &quot;Grass&quot;, COLOR_GREEN },                    /* tooltip, value */
  { &quot;Blue&quot;, NULL,                              /* name, stock id */
    &quot;_Blue&quot;, &quot;&lt;control&gt;B&quot;,                     /* label, accelerator */     
    &quot;Sky&quot;, COLOR_BLUE },                       /* tooltip, value */
};
static guint n_color_entries = G_N_ELEMENTS (color_entries);

enum {
  SHAPE_SQUARE,
  SHAPE_RECTANGLE,
  SHAPE_OVAL
};

static GtkRadioActionEntry shape_entries[] = {
  { &quot;Square&quot;, NULL,                            /* name, stock id */
    &quot;_Square&quot;, &quot;&lt;control&gt;S&quot;,                   /* label, accelerator */     
    &quot;Square&quot;,  SHAPE_SQUARE },                 /* tooltip, value */
  { &quot;Rectangle&quot;, NULL,                         /* name, stock id */
    &quot;_Rectangle&quot;, &quot;&lt;control&gt;R&quot;,                /* label, accelerator */     
    &quot;Rectangle&quot;, SHAPE_RECTANGLE },            /* tooltip, value */
  { &quot;Oval&quot;, NULL,                              /* name, stock id */
    &quot;_Oval&quot;, &quot;&lt;control&gt;O&quot;,                     /* label, accelerator */     
    &quot;Egg&quot;, SHAPE_OVAL },                       /* tooltip, value */  
};
static guint n_shape_entries = G_N_ELEMENTS (shape_entries);

static const gchar *ui_info = 
&quot;&lt;ui&gt;&quot;
&quot;  &lt;menubar name=&#039;MenuBar&#039;&gt;&quot;
&quot;    &lt;menu action=&#039;FileMenu&#039;&gt;&quot;
&quot;      &lt;menuitem action=&#039;New&#039;/&gt;&quot;
&quot;      &lt;menuitem action=&#039;Open&#039;/&gt;&quot;
&quot;      &lt;menuitem action=&#039;Save&#039;/&gt;&quot;
&quot;      &lt;menuitem action=&#039;SaveAs&#039;/&gt;&quot;
&quot;      &lt;separator/&gt;&quot;
&quot;      &lt;menuitem action=&#039;Quit&#039;/&gt;&quot;
&quot;    &lt;/menu&gt;&quot;
&quot;    &lt;menu action=&#039;PreferencesMenu&#039;&gt;&quot;
&quot;      &lt;menu action=&#039;ColorMenu&#039;&gt;&quot;
&quot;    &lt;menuitem action=&#039;Red&#039;/&gt;&quot;
&quot;    &lt;menuitem action=&#039;Green&#039;/&gt;&quot;
&quot;    &lt;menuitem action=&#039;Blue&#039;/&gt;&quot;
&quot;      &lt;/menu&gt;&quot;
&quot;      &lt;menu action=&#039;ShapeMenu&#039;&gt;&quot;
&quot;        &lt;menuitem action=&#039;Square&#039;/&gt;&quot;
&quot;        &lt;menuitem action=&#039;Rectangle&#039;/&gt;&quot;
&quot;        &lt;menuitem action=&#039;Oval&#039;/&gt;&quot;
&quot;      &lt;/menu&gt;&quot;
&quot;      &lt;menuitem action=&#039;Bold&#039;/&gt;&quot;
&quot;    &lt;/menu&gt;&quot;
&quot;    &lt;menu action=&#039;HelpMenu&#039;&gt;&quot;
&quot;      &lt;menuitem action=&#039;About&#039;/&gt;&quot;
&quot;    &lt;/menu&gt;&quot;
&quot;  &lt;/menubar&gt;&quot;
&quot;  &lt;toolbar  name=&#039;ToolBar&#039;&gt;&quot;
&quot;    &lt;toolitem action=&#039;Open&#039;/&gt;&quot;
&quot;    &lt;toolitem action=&#039;Quit&#039;/&gt;&quot;
&quot;    &lt;separator action=&#039;Sep1&#039;/&gt;&quot;
&quot;    &lt;toolitem action=&#039;Logo&#039;/&gt;&quot;
&quot;  &lt;/toolbar&gt;&quot;
&quot;&lt;/ui&gt;&quot;;

GtkWidget *
do_ui_manager (GtkWidget *do_widget)
{
  static GtkWidget *window = NULL;
  
  if (!window)
    {
      GtkWidget *box1;
      GtkWidget *box2;
      GtkWidget *separator;
      GtkWidget *label;
      GtkWidget *button;
      GtkUIManager *ui;
      GtkActionGroup *actions;
      GError *error = NULL;

      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_screen (GTK_WINDOW (window),
                 gtk_widget_get_screen (do_widget));
      
      g_signal_connect (window, &quot;destroy&quot;,
            G_CALLBACK (gtk_widget_destroyed), &amp;window);
      g_signal_connect (window, &quot;delete-event&quot;,
            G_CALLBACK (gtk_true), NULL);

      actions = gtk_action_group_new (&quot;Actions&quot;);
      gtk_action_group_add_actions (actions, entries, n_entries, NULL);
      gtk_action_group_add_toggle_actions (actions, 
                       toggle_entries, n_toggle_entries, 
                       NULL);
      gtk_action_group_add_radio_actions (actions, 
                      color_entries, n_color_entries, 
                      COLOR_RED,
                      G_CALLBACK (activate_radio_action), 
                      NULL);
      gtk_action_group_add_radio_actions (actions, 
                      shape_entries, n_shape_entries, 
                      SHAPE_OVAL,
                      G_CALLBACK (activate_radio_action), 
                      NULL);

      ui = gtk_ui_manager_new ();
      gtk_ui_manager_insert_action_group (ui, actions, 0);
      gtk_window_add_accel_group (GTK_WINDOW (window), 
                  gtk_ui_manager_get_accel_group (ui));
      gtk_window_set_title (GTK_WINDOW (window), &quot;UI Manager&quot;);
      gtk_container_set_border_width (GTK_CONTAINER (window), 0);
      
      if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &amp;error))
    {
      g_message (&quot;building menus failed: %s&quot;, error-&gt;message);
      g_error_free (error);
    }

      box1 = gtk_vbox_new (FALSE, 0);
      gtk_container_add (GTK_CONTAINER (window), box1);
      
      gtk_box_pack_start (GTK_BOX (box1),
              gtk_ui_manager_get_widget (ui, &quot;/MenuBar&quot;),
              FALSE, FALSE, 0);

      label = gtk_label_new (&quot;Type\n&lt;alt&gt;\nto start&quot;);
      gtk_widget_set_size_request (label, 200, 200);
      gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
      gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);


      separator = gtk_hseparator_new ();
      gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);


      box2 = gtk_vbox_new (FALSE, 10);
      gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
      gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);

      button = gtk_button_new_with_label (&quot;close&quot;);
      g_signal_connect_swapped (button, &quot;clicked&quot;,
                G_CALLBACK (gtk_widget_destroy), window);
      gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
      gtk_widget_grab_default (button);

      gtk_widget_show_all (window);
    }
  else
    {
      gtk_widget_destroy (window);
      window = NULL;
    }

  return window;
}</code></pre></div><p>А это немного переработанный мной этот пример. Добавил окошечко со скромным названием &quot;Supervisor&quot; и полезный в жизни &quot;MessageBox&quot;<br />Мои вставки/добавления помечены <em>added by SNK</em><br /></p><div class="codebox"><pre><code>#include &lt;stdio.h&gt;
#include &lt;gtk/gtk.h&gt;

/*modified by SNK http://stuff.mit.edu/afs/sipb/user/xiphmont/share/gtk-2.0/demo/ui_manager.c */
/* added by SNK GtkWidget* msgbox (void) */
gchar * strMsg;  // string for MessageBox - see at end of file
/*---------------------------------------------------------------------------*/

static void
activate_action (GtkAction *action)
{
  g_message (&quot;Action \&quot;%s\&quot; activated&quot;, gtk_action_get_name (action));
}

static void
activate_radio_action (GtkAction *action, GtkRadioAction *current)
{
  g_message (&quot;Radio action \&quot;%s\&quot; selected&quot;,
         gtk_action_get_name (GTK_ACTION (current)));
}

static GtkActionEntry entries[] = {
  { &quot;FileMenu&quot;, NULL, &quot;_File&quot; },               /* name, stock id, label */
  { &quot;PreferencesMenu&quot;, NULL, &quot;_Preferences&quot; }, /* name, stock id, label */
  { &quot;ColorMenu&quot;, NULL, &quot;_Color&quot;  },            /* name, stock id, label */
  { &quot;ShapeMenu&quot;, NULL, &quot;_Shape&quot; },             /* name, stock id, label */
  { &quot;HelpMenu&quot;, NULL, &quot;_Help&quot; },               /* name, stock id, label */
  { &quot;New&quot;, GTK_STOCK_NEW,                      /* name, stock id */
    &quot;_New&quot;, &quot;&lt;control&gt;N&quot;,                      /* label, accelerator */
    &quot;Create a new file&quot;,                       /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;Open&quot;, GTK_STOCK_OPEN,                    /* name, stock id */
    &quot;_Open&quot;,&quot;&lt;control&gt;O&quot;,                      /* label, accelerator */
    &quot;Open a file&quot;,                             /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;Save&quot;, GTK_STOCK_SAVE,                    /* name, stock id */
    &quot;_Save&quot;,&quot;&lt;control&gt;S&quot;,                      /* label, accelerator */
    &quot;Save current file&quot;,                       /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;SaveAs&quot;, GTK_STOCK_SAVE,                  /* name, stock id */
    &quot;Save _As...&quot;, NULL,                       /* label, accelerator */
    &quot;Save to a file&quot;,                          /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;Quit&quot;, GTK_STOCK_QUIT,                    /* name, stock id */
    &quot;_Quit&quot;, &quot;&lt;control&gt;Q&quot;,                     /* label, accelerator */
    &quot;Quit&quot;,                                    /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;About&quot;, NULL,                             /* name, stock id */
    &quot;_About&quot;, &quot;&lt;control&gt;A&quot;,                    /* label, accelerator */
    &quot;About&quot;,                                   /* tooltip */
    G_CALLBACK (activate_action) },
  { &quot;Logo&quot;, &quot;demo-gtk-logo&quot;,                   /* name, stock id */
     NULL, NULL,                               /* label, accelerator */
    &quot;GTK+&quot;,                                    /* tooltip */
    G_CALLBACK (activate_action) },
};
static guint n_entries = G_N_ELEMENTS (entries);


static GtkToggleActionEntry toggle_entries[] = {
  { &quot;Bold&quot;, GTK_STOCK_BOLD,                    /* name, stock id */
     &quot;_Bold&quot;, &quot;&lt;control&gt;B&quot;,                    /* label, accelerator */
    &quot;Bold&quot;,                                    /* tooltip */
    G_CALLBACK (activate_action),
    TRUE },                                    /* is_active */
};
static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);

enum {
  COLOR_RED,
  COLOR_GREEN,
  COLOR_BLUE
};

static GtkRadioActionEntry color_entries[] = {
  { &quot;Red&quot;, NULL,                               /* name, stock id */
    &quot;_Red&quot;, &quot;&lt;control&gt;R&quot;,                      /* label, accelerator */
    &quot;Blood&quot;, COLOR_RED },                      /* tooltip, value */
  { &quot;Green&quot;, NULL,                             /* name, stock id */
    &quot;_Green&quot;, &quot;&lt;control&gt;G&quot;,                    /* label, accelerator */
    &quot;Grass&quot;, COLOR_GREEN },                    /* tooltip, value */
  { &quot;Blue&quot;, NULL,                              /* name, stock id */
    &quot;_Blue&quot;, &quot;&lt;control&gt;B&quot;,                     /* label, accelerator */
    &quot;Sky&quot;, COLOR_BLUE },                       /* tooltip, value */
};
static guint n_color_entries = G_N_ELEMENTS (color_entries);

enum {
  SHAPE_SQUARE,
  SHAPE_RECTANGLE,
  SHAPE_OVAL
};

static GtkRadioActionEntry shape_entries[] = {
  { &quot;Square&quot;, NULL,                            /* name, stock id */
    &quot;_Square&quot;, &quot;&lt;control&gt;S&quot;,                   /* label, accelerator */
    &quot;Square&quot;,  SHAPE_SQUARE },                 /* tooltip, value */
  { &quot;Rectangle&quot;, NULL,                         /* name, stock id */
    &quot;_Rectangle&quot;, &quot;&lt;control&gt;R&quot;,                /* label, accelerator */
    &quot;Rectangle&quot;, SHAPE_RECTANGLE },            /* tooltip, value */
  { &quot;Oval&quot;, NULL,                              /* name, stock id */
    &quot;_Oval&quot;, &quot;&lt;control&gt;O&quot;,                     /* label, accelerator */
    &quot;Egg&quot;, SHAPE_OVAL },                       /* tooltip, value */
};
static guint n_shape_entries = G_N_ELEMENTS (shape_entries);

static const gchar *ui_info =
&quot;&lt;ui&gt;&quot;
&quot;  &lt;menubar name=&#039;MenuBar&#039;&gt;&quot;
&quot;    &lt;menu action=&#039;FileMenu&#039;&gt;&quot;
&quot;      &lt;menuitem action=&#039;New&#039;/&gt;&quot;
&quot;      &lt;menuitem action=&#039;Open&#039;/&gt;&quot;
&quot;      &lt;menuitem action=&#039;Save&#039;/&gt;&quot;
&quot;      &lt;menuitem action=&#039;SaveAs&#039;/&gt;&quot;
&quot;      &lt;separator/&gt;&quot;
&quot;      &lt;menuitem action=&#039;Quit&#039;/&gt;&quot;
&quot;    &lt;/menu&gt;&quot;
&quot;    &lt;menu action=&#039;PreferencesMenu&#039;&gt;&quot;
&quot;      &lt;menu action=&#039;ColorMenu&#039;&gt;&quot;
&quot;    &lt;menuitem action=&#039;Red&#039;/&gt;&quot;
&quot;    &lt;menuitem action=&#039;Green&#039;/&gt;&quot;
&quot;    &lt;menuitem action=&#039;Blue&#039;/&gt;&quot;
&quot;      &lt;/menu&gt;&quot;
&quot;      &lt;menu action=&#039;ShapeMenu&#039;&gt;&quot;
&quot;        &lt;menuitem action=&#039;Square&#039;/&gt;&quot;
&quot;        &lt;menuitem action=&#039;Rectangle&#039;/&gt;&quot;
&quot;        &lt;menuitem action=&#039;Oval&#039;/&gt;&quot;
&quot;      &lt;/menu&gt;&quot;
&quot;      &lt;menuitem action=&#039;Bold&#039;/&gt;&quot;
&quot;    &lt;/menu&gt;&quot;
&quot;    &lt;menu action=&#039;HelpMenu&#039;&gt;&quot;
&quot;      &lt;menuitem action=&#039;About&#039;/&gt;&quot;
&quot;    &lt;/menu&gt;&quot;
&quot;  &lt;/menubar&gt;&quot;
&quot;  &lt;toolbar  name=&#039;ToolBar&#039;&gt;&quot;
&quot;    &lt;toolitem action=&#039;Open&#039;/&gt;&quot;
&quot;    &lt;toolitem action=&#039;Quit&#039;/&gt;&quot;
&quot;    &lt;separator action=&#039;Sep1&#039;/&gt;&quot;
&quot;    &lt;toolitem action=&#039;Logo&#039;/&gt;&quot;
&quot;  &lt;/toolbar&gt;&quot;
&quot;&lt;/ui&gt;&quot;;
/*---------------------------------------------------------------------------*/

GtkWidget *
do_ui_manager (GtkWidget *do_widget)
{
  static GtkWidget *window = NULL;

  if (!window)
    {
      GtkWidget *box1;
      GtkWidget *box2;
      GtkWidget *separator;
      GtkWidget *label;
      GtkWidget *button;
      GtkUIManager *ui;
      GtkActionGroup *actions;
      GError *error = NULL;

      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_screen (GTK_WINDOW (window),
                 gtk_widget_get_screen (do_widget));

      g_signal_connect (window, &quot;destroy&quot;,
            G_CALLBACK (gtk_widget_destroyed), &amp;window);
      g_signal_connect (window, &quot;delete-event&quot;,
            G_CALLBACK (gtk_true), NULL);

      actions = gtk_action_group_new (&quot;Actions&quot;);
      gtk_action_group_add_actions (actions, entries, n_entries, NULL);
      gtk_action_group_add_toggle_actions (actions,
                       toggle_entries, n_toggle_entries,
                       NULL);
      gtk_action_group_add_radio_actions (actions,
                      color_entries, n_color_entries,
                      COLOR_RED,
                      G_CALLBACK (activate_radio_action),
                      NULL);
      gtk_action_group_add_radio_actions (actions,
                      shape_entries, n_shape_entries,
                      SHAPE_OVAL,
                      G_CALLBACK (activate_radio_action),
                      NULL);

      ui = gtk_ui_manager_new ();
      gtk_ui_manager_insert_action_group (ui, actions, 0);
      g_object_unref (actions);
      gtk_window_add_accel_group (GTK_WINDOW (window),
                  gtk_ui_manager_get_accel_group (ui));
      gtk_window_set_title (GTK_WINDOW (window), &quot;UI Manager&quot;);
      gtk_container_set_border_width (GTK_CONTAINER (window), 0);


      if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &amp;error))
        {
          g_message (&quot;building menus failed: %s&quot;, error-&gt;message);
          g_error_free (error);
        }

      box1 = gtk_vbox_new (FALSE, 0);
      gtk_container_add (GTK_CONTAINER (window), box1);

      gtk_box_pack_start (GTK_BOX (box1),
              gtk_ui_manager_get_widget (ui, &quot;/MenuBar&quot;),
              FALSE, FALSE, 0);

      label = gtk_label_new (&quot;Type\n&lt;alt&gt;\nto start&quot;);
      gtk_widget_set_size_request (label, 200, 200);
      gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
      gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);


      separator = gtk_hseparator_new ();
      gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);


      box2 = gtk_vbox_new (FALSE, 10);
      gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
      gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);

      button = gtk_button_new_with_label (&quot;close&quot;);
      g_signal_connect_swapped (button, &quot;clicked&quot;,
                G_CALLBACK (gtk_widget_destroy), window);

   /* added by SNK 21.05.2012 */
//    g_signal_connect (window, &quot;destroy&quot;, gtk_main_quit, NULL);
//    g_signal_connect_swapped (button, &quot;clicked&quot;, G_CALLBACK (gtk_main_quit), window);

      gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
      gtk_widget_grab_default (button);

      gtk_widget_show_all (window);
      g_object_unref (ui);
    }
  else
    {
      gtk_widget_destroy (window);
      window = NULL;
    }

  return window;
}
/*---------------------------------------------------------------------------*/

/* all as downwrited added by SNK 21.06.2012 */
/* makes the widget-dialog &quot;Message Box&quot;, used global string strMsg for messages */
GtkWidget* msgbox (void)
{
    GtkWidget *msgbox; // non-modal dialog
    GtkWidget * content_area;
    GtkWidget * label;
    //strMsg = &quot;Test MessageBox&quot;;

    msgbox = gtk_dialog_new_with_buttons (&quot;Message Box&quot;, NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                                 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);

   content_area = gtk_dialog_get_content_area (GTK_DIALOG (msgbox));
   label = gtk_label_new (strMsg);
   gtk_container_add (GTK_CONTAINER (content_area), label);
   gtk_widget_show_all (msgbox);

    if (gtk_dialog_run(GTK_DIALOG (msgbox)) == GTK_RESPONSE_OK)
    gtk_widget_destroy (msgbox);

  return msgbox;
}
/*---------------------------------------------------------------------------*/

static void button_clicked(GtkWidget* widget, gpointer data)
{
  //g_print(&quot;Button was clicked!\n&quot;);
    strMsg = &quot;Button1 &#039;Quit&#039; was clicked...&quot;;
    msgbox();
}

static void button2_clicked(GtkWidget* widget, gpointer data)
{
  //g_print(&quot;Button2 was clicked!\n&quot;);
    strMsg = &quot;Button2 &#039;Show-hide_UI&#039; was clicked...&quot;;
    msgbox();
  do_ui_manager (data);
}

static gboolean delete_event(GtkWidget * widget, GdkEvent * event, gpointer data)
{
  //g_print(&quot;Delete event occurred\n&quot;);
    strMsg = &quot;Delete event occurred&quot;;
    msgbox();

  return FALSE;
}

static void destroy(GtkWidget * widget, gpointer data)
{
  //g_print(&quot;Destroy signal was sent\n&quot;);
    strMsg = &quot;Destroy signal was sent&quot;;
    msgbox();
  gtk_main_quit();
}
/*---------------------------------------------------------------------------*/

int main(int argc, char ** argv)
{
    GtkWidget *win = NULL;

    GtkWidget * window;
    GtkWidget *vbox;
    GtkWidget * button1;
    GtkWidget *button2;
    const gchar * title = &quot;Supervisor&quot;;
    gtk_init(&amp;argc, &amp;argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), title);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    g_signal_connect(G_OBJECT(window), &quot;delete_event&quot;, G_CALLBACK(delete_event), NULL);
    g_signal_connect(G_OBJECT(window), &quot;destroy&quot;, G_CALLBACK(destroy), NULL);
    button1 = gtk_button_new_with_label(&quot;Quit&quot;);
    button2 = gtk_button_new_with_label(&quot;Show-hide_UI&quot;);
    /* Callbacks to destroy window  &quot;UI Manager&quot; show&lt;--&gt;hide */
    g_signal_connect(G_OBJECT(button1), &quot;clicked&quot;, G_CALLBACK(button_clicked), NULL);
    g_signal_connect_swapped(G_OBJECT(button1), &quot;clicked&quot;, G_CALLBACK(gtk_widget_destroy), G_OBJECT(window));
    /* Callback to switch window  &quot;UI Manager&quot; show&lt;--&gt;hide */
    g_signal_connect(G_OBJECT(button2), &quot;clicked&quot;, G_CALLBACK(button2_clicked), win);
    /* create vertical-box frame on current window  &quot;Supervisor&quot; */
    vbox = gtk_vbox_new (FALSE, 3);
    gtk_container_add (GTK_CONTAINER (window), vbox);
    gtk_widget_show (vbox);
    gtk_container_add(GTK_CONTAINER(vbox), button1);
    gtk_container_add(GTK_CONTAINER(vbox), button2);

    // go to window &quot;UI Manager&quot;
    do_ui_manager (win);

    gtk_widget_show(button1);
    gtk_widget_show(button2);
    gtk_widget_show(window);
    gtk_main();
    return 0;
}
/*---------------------------------------------------------------------------*/</code></pre></div><p>В примере используется (в виде строк) вставка предварительно сделанного (в Glade ?) пользовательского интерфейса<br /></p><div class="codebox"><pre><code>static const gchar *ui_info =
&quot;&lt;ui&gt;&quot;
&quot;  &lt;menubar name=&#039;MenuBar&#039;&gt;&quot;
... ... ...
&quot;&lt;/ui&gt;&quot;;</code></pre></div><p>Makefile<br /></p><div class="codebox"><pre><code>TARGET = UIManager
CC = gcc
LDLIBS=`pkg-config --libs gtk+-2.0 gmodule-2.0`
CFLAGS=-Wall -g `pkg-config --cflags gtk+-2.0 gmodule-2.0`

all:
    $(CC) -o $(TARGET) main.c $(LDLIBS) $(CFLAGS)

clean:
    rm $(TARGET)</code></pre></div><p>т.е. это в развитие того, что <strong>Mike53</strong> рассказывал в начале этой темы.</p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-07-27T14:09:22Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=290007#p290007</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=289624#p289624" />
			<content type="html"><![CDATA[<p>Привет <strong>Mike53</strong>!<br /></p><div class="quotebox"><blockquote><p>Рискуя оказаться КОпетаном, упомяну zenity. Я не сравниваю эти инструменты, я только напоминаю о существовании одного из них. К примеру, мне, в своё время, очень не хватало подобной утилитки. Возможно, для кого-то эта ложка окажется как раз к обеду</p></blockquote></div><p>В таком разе вот еще &quot;ложечки из сервиза&quot;:<br /><a href="http://freecode.com/projects/xdialog">http://freecode.com/projects/xdialog</a><br /><a href="http://invisible-island.net/dialog/">http://invisible-island.net/dialog/</a><br /><a href="http://hightek.org/dialog/">http://hightek.org/dialog/</a><br /><a href="http://xdialog.free.fr/">http://xdialog.free.fr/</a><br /><a href="http://code.google.com/p/yad/">http://code.google.com/p/yad/</a><br /> - диалоги на самые разные вкусы.</p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-07-25T10:27:28Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=289624#p289624</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=289526#p289526" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>sklimkin пишет:</cite><blockquote><p>Есть такой инструмент gtkdialog связывающий скриптование на bash с графическим окном на GTK</p></blockquote></div><p> Рискуя оказаться КОпетаном, упомяну zenity. Я не сравниваю эти инструменты, я только напоминаю о существовании одного из них. К примеру, мне, в своё время, очень не хватало подобной утилитки. Возможно, для кого-то эта ложка окажется как раз к обеду <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /><br /></p><div class="codebox"><pre><code>#!/bin/bash
 
if zenity --question --text=&quot;Please press a button.&quot;; then
    zenity --info --text=&quot;You pressed Yes\!&quot;
else
    zenity --error --text=&quot;You pressed No\!&quot;
fi</code></pre></div><p><span class="postimg"><img src="http://upload.wikimedia.org/wikipedia/commons/2/29/Zenity-ubuntu-lucid.png" alt="http://upload.wikimedia.org/wikipedia/commons/2/29/Zenity-ubuntu-lucid.png" /></span></p>]]></content>
			<author>
				<name><![CDATA[Mike53]]></name>
				<uri>https://linuxforum.ru/profile.php?id=19907</uri>
			</author>
			<updated>2012-07-24T18:31:24Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=289526#p289526</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=287604#p287604" />
			<content type="html"><![CDATA[<p><strong>Есть такой инструмент gtkdialog связывающий скриптование на bash с графическим окном на GTK</strong><br /><a href="http://linux.pte.hu/~pipas/gtkdialog/">http://linux.pte.hu/~pipas/gtkdialog/</a> - автор Laszlo Pere.<br />Сайт <a href="http://code.google.com/p/gtkdialog/">http://code.google.com/p/gtkdialog/</a> давно (около года) не обновлялся.<br />Загружать программу (400 КБ) надо с него.</p><p>Может быть здесь будет по теме.<br />gtkdialog имеет много хороших примеров bash-script.<br />Автор Laszlo Pere предоставил возможность делать программы и на языке СИ, но пример такой программы всего один (и очень маленький).<br />Возможности программы gtkdialog в этом случае значительно беднее, чем у bash-script.<br />Некоторые пользователи могут писать на bash-script хуже, чем на СИ (как я например).<br />Учитывая это я сделал пример на языке СИ.</p><p>Конструкции gtkdialog для СИ не позволяют например такие вещи: <br />&lt;window window_position=&quot;1&quot; title=&quot;System Tools&quot;&gt;<br />или:<br />&lt;action when=&quot;file-activated&quot;&gt;echo File: $FILE &lt;/action&gt;<br />Это удалось обойти таким способом:<br />&quot;&lt;action&gt;cat [ echo $FILE ] | zenity --text-info&nbsp; --width=720 --height=400 --title $FILE&lt;/action&gt;&quot;<br />Но даже с такими ограничениями мне было интересно сделать программу, которая не требует тяжелых библиотек (так я во всяком случае думаю).</p><p>Вот как выглядит самый простой пример с двумя кнопками в окне:<br /></p><div class="codebox"><pre><code>#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

main(){
    FILE *stream;
    char line[256];
    
    putenv(
&quot;MAIN_DIALOG=&lt;hbox&gt;&quot;
&quot;  &lt;button ok&gt;&lt;/button&gt;&quot;
&quot;  &lt;button cancel&gt;&lt;/button&gt;&quot;
&quot;&lt;/hbox&gt;&quot;);
    
    stream = popen(&quot;gtkdialog --program=MAIN_DIALOG&quot;, &quot;r&quot;);
    fgets(line, 255, stream);
    if (strstr(line, &quot;OK&quot;) != NULL)
        printf(&quot;You pressed the OK button.\n&quot;);
    else
        printf(&quot;This is not the OK button.\n&quot;);
    pclose(stream);
    
}</code></pre></div><p>Архив с кодом программы, исполняемым файлом и скриншотом:<br /><a href="http://www.mediafire.com/?6vlarpi86332bom">http://www.mediafire.com/?6vlarpi86332bom</a></p><p>Увидеть скриншот (и скачать пример) можно на мурге:<br /><a href="http://www.murga-linux.com/puppy/viewtopic.php?p=639831#639831">http://www.murga-linux.com/puppy/viewto … 831#639831</a></p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-07-11T22:15:45Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=287604#p287604</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=253327#p253327" />
			<content type="html"><![CDATA[<p>Полезный материал. Спасибо, что взяли на себя труд поделиться плодами собственных поисков!</p>]]></content>
			<author>
				<name><![CDATA[Mike53]]></name>
				<uri>https://linuxforum.ru/profile.php?id=19907</uri>
			</author>
			<updated>2012-02-23T08:44:55Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=253327#p253327</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=253027#p253027" />
			<content type="html"><![CDATA[<p><strong>Как программировать рисование векторной графики в СИ на GTK+</strong></p><p>Долгое время не мог &quot;подступиться&quot; к вопросу программирование РИСОВАНИЯ на СИ.<br />Речь не о том, как вставить в окно программы картинку/фото, или иконки - с этим как раз все просто.<br />Речь о &quot;математическом&quot; рисовании - линий, мультилиний, полигонов, дуг и т.п. - то есть о векторной графике.</p><p>Читал, искал примеры, вчитывался в справочную программу Devhelp, но не прояснялось.<br />Взялся за примеры из Devhelp под названием scribble (каракули).<br />Пример не компилировался по причине грубых ошибок в тексте программы.<br />Наконец нашел краткий и внятный пример-урок: Осциллограф, пример рисования в GTK2+ &amp; Cairo<br /><a href="http://programmersforum.ru/showthread.php?t=59858">http://programmersforum.ru/showthread.php?t=59858</a><br /><a href="http://programmersforum.ru/showthread.php?t=59503">http://programmersforum.ru/showthread.php?t=59503</a></p><p>После него стал понятен пример из Devhelp scribble-simple.c который немного подправил и к рисованию отрезков прямых добавил рисование окружностей (эллипсов если быть точным) и прямоугольников. Хотя надо сказать, что пример все-равно очень убогий, хотя бы на фоне &quot;Осциллографа&quot;.<br />scribble-simple.c - draw accumulated array of points on Cairo contexts, draw lines (+ circles &amp; rectangles) from every point to every point.<br /><a href="http://cairographics.org/threaded_animation_with_cairo/">http://cairographics.org/threaded_animation_with_cairo/</a> - GTK+ &amp; Cairo - пример анимации.</p><p>А на основе примера &quot;Осциллограф&quot; написал то, что требовалось мне:<br />1. Исправленный/расширенный scribble-simple - gtkcairo<br />2. Немного переделанный/упрощенный &quot;Осциллограф&quot; - oscillator<br />3. Пример рисования в GTK2+ &amp; Cairo &quot;Небосвод - SKY&quot; - sky<br />Переделывал исходные примеры, чтобы понять, как работает, ну и приближая к своим задачам.</p><p>Все примеры содержат по 3 файла: *.c&nbsp; Makefile&nbsp; и исполняемый бинарный.<br />Частенько в примерах на &quot;рисование&quot; окно не имеет никаких элементов управления - кнопок в частности.<br />В примере sky добавил 2 кнопки внизу окна - &quot;HIDE WINDOW&quot; и &quot;REFRESH&quot;.<br />Кнопка &quot;HIDE WINDOW&quot; декоративная, она ничего не делает, потому что не имеет функции callback.<br />А кнопка &quot;REFRESH&quot; обновляет окно. Если подвигать окно по экрану и даже частично за пределы экрана, то на окне появляются &quot;артефакты&quot; - вот они и удаляются кнопкой &quot;REFRESH&quot;, она связана с callback функцией button2_clicked, которая &quot;обменивается&quot; с функцией time_handler. Так принято в GTK.</p><p>Средствами ТОЛЬКО Cairo рисуется: <br />1 полусфера-небосвод, <br />2 главные оси,<br />3 окружности в 22 45 68 градусов на полусфере,<br />4 подграфка этих окружностей слева и снизу (корявенько, но показывает как выводить текст и цвет на картинку),<br />5 на небосвод выводится положение GPS-GLONASS спутников (квадратики с номерами спутников),<br />6 ниже небосвода рисуются столбики уровня сигналов от спутников,<br />7 ниже столбиков номера спутников,<br />8 а выше величины сигнал/шум в dB,<br />9 в самом низу 2 кнопки управления окном/программой.<br />10 Продемонстрирована заливка контуров цветом - зеленоватый для неба и коричневатый для уровня сигналов (чтобы не напрягало глаза).</p><p>Ссылка для скачивания:<br /><a href="http://www.mediafire.com/?3w34do3fmgbd1wu">http://www.mediafire.com/?3w34do3fmgbd1wu</a><br />(навязчивая реклама - расплата за бесплатный хостинг, выскакивает окно с поздравлением - Вы выиграли! - его надо закрыть).</p><p>Несколько ссылок по программированию в GTK+ на СИ:<br />нашел блог <a href="http://blog.borovsak.si/2009/04/">http://blog.borovsak.si/2009/04/</a> (Posted 29th April 2009 by Tadej Borovšak) - автор рассквзывает внятно и с примерами кода.<br /><a href="http://zetcode.com/tutorials/gtktutorial/">http://zetcode.com/tutorials/gtktutorial/</a> - хорошие небольшие примеры.<br /><a href="http://www.opennet.ru/docs/124.shtml">http://www.opennet.ru/docs/124.shtml</a> - описания и примеры на русском языке.<br /><a href="http://www.opennet.ru/docs/RUS/gtk_plus/gtk_plus-prog.html.gz">http://www.opennet.ru/docs/RUS/gtk_plus … og.html.gz</a> - преревод учебника на русский язык, один большой файл html.gz<br /><a href="http://symmetrica.net/uploads/gtk/lesson1.htm">http://symmetrica.net/uploads/gtk/lesson1.htm</a> - Программирование графического интерфейса с помощью GTK+&nbsp; 2006-2007 Андрей Боровский &lt;anb @ symmetrica.net&gt;&nbsp; - на мой взгляд самые внятные уроки на русском языке.</p><p>Тяжеловесность Linux-ubuntu (я работаю на версии lucid-lynx 10.04) и тенденции ubuntu к дальнейшему утяжелению за счет &quot;свистелок-перделок&quot; при не очень видимом движении в сторону &quot;функционал + скорость&quot; заставляют искать альтернативные решения. Меня очень заинтересовали сборки Линукса размером менее 1 ГБ, которые можно установить как на винчестер, так и на USB-flash в разделы форматированные под ext2--ext4 и FAT32. Это конечно отдельная и серьезная тема, но ...</p><p>Сейчас тестирую некоторые из них:<br /><a href="http://ru.wikipedia.org/wiki/Damn_Small_Linux">http://ru.wikipedia.org/wiki/Damn_Small_Linux</a><br /><a href="http://ru.wikipedia.org/wiki/Puppy_Linux">http://ru.wikipedia.org/wiki/Puppy_Linux</a> и русские версии <a href="http://uco.puppyrus.org">http://uco.puppyrus.org</a>/<br /><a href="http://ru.wikipedia.org/wiki/Tiny_Core_Linux">http://ru.wikipedia.org/wiki/Tiny_Core_Linux</a><br /><a href="http://ru.wikipedia.org/wiki/SliTaz">http://ru.wikipedia.org/wiki/SliTaz</a><br /><a href="http://tuxologia.blogspot.com/2009/08/austrumi.html">http://tuxologia.blogspot.com/2009/08/austrumi.html</a>&nbsp; <a href="http://zenway.ru/page/austrumi-xxx">http://zenway.ru/page/austrumi-xxx</a><br /><a href="http://www.cdlinux.info/wiki/doku.php/">http://www.cdlinux.info/wiki/doku.php/</a><br />и до кучи: <a href="http://wiki.kolibrios.org/wiki/Main_Page">http://wiki.kolibrios.org/wiki/Main_Page</a></p><p>Список &quot;маленьких&quot; Линуксов намного больше приведенных мной, но тенденция к уменьшению и оптимизации ОС прослеживается.</p><p>В процессе &quot;рассмотрения&quot; особенностей различных сборок Линуксов (Linux-Ubuntu, Arch-linux, PuppyLinux, TinyCoreLinux, Austrimi-linux, CDLinux ...) и после установки в них компонентов для программирования на СИ (gcc/g++ CodeBlocks Glade ...) можно обнаружись отсутствие некоторых важных компонентов/библиотек.</p><p>Например программа сделанная ранее в Glade не исполняется в новой конфигурации системы, хотя Glade и установлена.<br />Или CodeBlocks при попытке скомпилировать программу может сообщить об отсутствии /usr/include/gtk-2.0/gtk/gtk/h<br />При попытке выполнить на стороннем компьютере скомпилированную и собранную в бинарный файл маленькую программу, можно долго бродить по отсутствующим зависимостям и доустанавливать на этот компьютер много чего.<br />Эти обстоятельства заставляют задуматься над вопросом: минимальный и достаточный набор инструментов для программирования в любом Линуксе, вплоть до самых &quot;tiny&quot;. Такой, чтобы зависимостей было как можно меньше.</p><p>Вот мой набор:<br />компилятор gcc/g++<br />доп. пакет разработчика gtk-dev(elopment)<br />отладчик gdb<br />make<br />cmake<br />текстовый редактор gedit, или geany (среда разработки и редактор)<br />файл-менеджер gnome-commander, или mc (midnight-commander)</p><p>далее не обязательно, но желательно:<br />glade-gnome (glade-3 glade)<br />codeblocks 8.04 (codeblocks 10.05)<br />file-roller или xarchiver<br />sqlite и sqlite3<br />hexedit или тяжеловесный (.net-framework), но богатый bless.</p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2012-02-22T11:03:08Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=253027#p253027</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=220265#p220265" />
			<content type="html"><![CDATA[<p>Я тоже рад приветствовать, <strong>sklimkin</strong>!<br /></p><div class="quotebox"><cite>sklimkin пишет:</cite><blockquote><p>Привет Mike53, куда пропал/переехал ?</p></blockquote></div><p>см. PM</p><p>Вроде бы основная проблема старта решена, понятно &quot;как можно делать&quot; и теперь остается только расшариваться в самой GTK+. Но меня волнует еще вопрос целесообразности применения тредов (в смысле разделения программы на несколько параллельных нитей/потоков, в одном из которых будет графический интерфейс программы, а в другом(других) основной алгоритм). Каковы &quot;накладные расходы&quot; системы в случае переключения между процессами (сохранение контекста и т.п.) и в случае обслуживания очереди в главном цикле gtk_main()? Т.е. хотелось бы понять &quot;как правильно делать&quot;.</p><p>Для своих текущих задач я решил использовать вызов пользовательских функций из главного цикла GTK+. Насколько это хорошо/правильно будет видно в процессе использования <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /></p>]]></content>
			<author>
				<name><![CDATA[Mike53]]></name>
				<uri>https://linuxforum.ru/profile.php?id=19907</uri>
			</author>
			<updated>2011-10-23T09:34:08Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=220265#p220265</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=219265#p219265" />
			<content type="html"><![CDATA[<p><strong>Привет Mike53, куда пропал/переехал ?</strong></p><p>Я поковырялся с Glade и Вашим примером и мне это понравилось.<br />Не удержался и самовольно кое-что доделал.<br />1. дочернее окно window2 сделал немодальным и вот почему:<br />2. добавил 2-й таймер в 1 сек., который вкл.-выкл. в дочернем окне<br />3. добавил переключение между окнами show &lt;--&gt; hide<br />4. включение 1-го таймера в 0.5 сек. перенес из старта программы (main.c) на кнопку в окне window1<br />5. ну и немного по мелочам.</p><p>Все это конечно непричесанное, но порадовала возможность легко и без pthread создавать/убирать<br />таймеры на таймаутах, которые (и в которые) можно &quot;запихать&quot; все, что потребуется для программы.<br />Еще раз СПАСИБО за подсказку!</p><p>Вот как выглядит включалка/выключалка 1-го таймера:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>/* Switch Timer 1 */
void on_button5_clicked (GtkObject *object, gpointer user_data)
{
    //printf(&quot;blnTimeout1State = %d\n&quot;, (int)blnTimeout1State);
    //printf(&quot;blnTimeout2State = %d\n&quot;, (int)blnTimeout2State);
    //printf(&quot;blnTimeout1Work = %d\n&quot;, (int)blnTimeout1Work);
    blnTimeout1State = TRUE;  // Timer 1 can Start in future

    if(blnTimeout2State == TRUE)  // First Stop Timer 2
    {
        blnTimeout2State = FALSE;
        blnTimeout2State = timeout2_callback(user_data);
    }
    if(blnTimeout1Work == FALSE)  // Timer 1 NOT worked
    {
        // Now Start Timer 1
        g_timeout_add(500, timeout1_callback, NULL);
        blnTimeout1Work = TRUE;  // Timer 1 IS worked
        gtk_button_set_label(object, &quot;STOP TimeOut1&quot;);
        g_print(&quot;Now START TimeOut1\n&quot;);
    }
    else  // Timer 1 IS worked
    {
        // Now Stop Timer 1
        blnTimeout1State = FALSE;  // to Stop Timer 1
        g_timeout_add(500, timeout1_callback, NULL);
        blnTimeout1Work = FALSE;  // Timer 1 NOT worked
        gtk_button_set_label(object, &quot;START TimeOut1&quot;);
        g_print(&quot;Now STOP TimeOut1\n&quot;);
    }
}</code></pre></div></div></div><p>Вот картинка работающей программы:<br /><a href="http://webfile.ru/5603267">http://webfile.ru/5603267</a><br />Файлы проекта положил здесь:<br /><a href="http://webfile.ru/5603231">http://webfile.ru/5603231</a></p><p>Добавление 21 янв. 2012г.<br />------------------------------<br />Прошу прощения, файлы по предыдущему адресу давно затерты.<br />Вот новый адрес хранения, надеюсь более долговечный:<br /><a href="http://www.mediafire.com/download.php?paqdkv8ryfuft18">http://www.mediafire.com/download.php?paqdkv8ryfuft18</a><br />Вот скриншот работающей программы (оба окна в терминале):<br /><a href="http://www.mediafire.com/i/?qs11r111ntrvk9v">http://www.mediafire.com/i/?qs11r111ntrvk9v</a></p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2011-10-13T22:52:05Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=219265#p219265</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: GTK+ пример программы на чистом СИ с графическим интерфейсом]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=218863#p218863" />
			<content type="html"><![CDATA[<p>To Mime53:<br /></p><div class="quotebox"><blockquote><p>(готовлюсь к отъезду)</p></blockquote></div><p>АмерЫка, Эсраэль, КНР, Индустан ?<br /></p><div class="quotebox"><blockquote><p>Что-то я никак в толк не возьму, как тут файлы к сообщениям прикреплять</p></blockquote></div><p>А никак. Только размещать на бесплатных файлообменниках.<br /></p><div class="quotebox"><blockquote><p>По теме накину, пожалуй, несколько хороших ссылок:</p></blockquote></div><p>Вот за это спасибо!</p><p>Может быть этого еще нет:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>&quot;The Linux Programming Interface&quot;<br /><a href="http://depositfiles.com/files/fdzhtnib4">http://depositfiles.com/files/fdzhtnib4</a></p></div></div><div class="quotebox"><blockquote><p>в свойствах дочернего окна я указал свойство &quot;модальное&quot;</p></blockquote></div><p>Мотивация? (Это window2 ?)</p><p>Комментарии на 5+<br /></p><div class="quotebox"><blockquote><p>После ручного редактирования проект можно открыть в Glade и это свойство там будет доступно</p></blockquote></div><p>Ценное указание, может съэкономить нервы и время.<br />Реп. +1</p>]]></content>
			<author>
				<name><![CDATA[sklimkin]]></name>
				<uri>https://linuxforum.ru/profile.php?id=18807</uri>
			</author>
			<updated>2011-10-12T13:02:44Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=218863#p218863</id>
		</entry>
</feed>
