Sophie

Sophie

distrib > Mageia > 5 > x86_64 > media > core-release > by-pkgid > f2f28f61487f3042d93877451f0a311f > files > 25

geda-docs-1.8.2-4.mga5.x86_64.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <title></title>
  <link rel="stylesheet" media="screen" type="text/css" href="./style.css" />
  <link rel="stylesheet" media="screen" type="text/css" href="./design.css" />
  <link rel="stylesheet" media="print" type="text/css" href="./print.css" />

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>


<h1 class="sectionedit1525"><a name="советы_подсказки_и_хитрости_для_разработчиков_geda" id="советы_подсказки_и_хитрости_для_разработчиков_geda">Советы, подсказки и хитрости для разработчиков gEDA</a></h1>
<div class="level1">

</div>
<!-- EDIT1525 SECTION "Советы, подсказки и хитрости для разработчиков gEDA" [1-108] -->
<h2 class="sectionedit1526"><a name="структура_данных_схемы" id="структура_данных_схемы">Структура данных схемы</a></h2>
<div class="level2">

<p>
Внутри gaf схема представляется набором двунаправленно-связанных списков.
Центральным типом связи в списках является OBJECT. Он может быть представлением
какого-нибудь символа, строки текста, графического примитива, соединения или
атрибута.
</p>

<p>
Обзор структуры данных схемы можно найти
<a href="http://www.brorson.com/gEDA/gEDA_Structures_20050108.pdf" class="urlextern" title="http://www.brorson.com/gEDA/gEDA_Structures_20050108.pdf"  rel="nofollow">здесь</a>. Этот
набросок сделан Стюартом Брорсоном (Stuart Brorson) в 2005 году.
</p>

</div>
<!-- EDIT1526 SECTION "Структура данных схемы" [109-865] -->
<h2 class="sectionedit1527"><a name="комментарии_и_стили_doxygen" id="комментарии_и_стили_doxygen">Комментарии и стили Doxygen</a></h2>
<div class="level2">

<p>
<strong>Doxygen</strong> представляет собой утилиту для извлечения документации по <acronym title="Application Programming Interface">API</acronym> из
комментариев в исходном коде. В комментариях может указываться разметка,
которая впоследствии может быть преобразована программой Doxygen в код <acronym title="HyperText Markup Language">HTML</acronym> или
LaTeX. Это позволяет, к примеру, одной функции сослаться на другую, связанную
с ней, а также даёт возможность приводить документацию об аргументах и возвращаемых
значениях.
</p>

<p>
Некоторые части исходных текстов gaf уже подготовлены для работы с
<strong>doxygen</strong>. Сейчас сюда входят libgeda, gschem, gnetlist, gsymcheck и gattrib.
Файлы Makefile этих утилит в каталоге <em><code>docs</code></em> содержат цель “doxygen”.
Или же вывод doxygen можно посмотреть
<a href="http://www.xs4all.nl/~ljh4timm/gaf/dox.html" class="urlextern" title="http://www.xs4all.nl/~ljh4timm/gaf/dox.html"  rel="nofollow">на этой странице</a>, подготовленной
Бертом Тиммерманом (Bert Timmerman).
</p>

<p>
Если вы хотите узнать заложенные в Doxygen идеи о том, как надо
форматировать документацию, см.
<a href="http://www.stack.nl/~dimitri/doxygen/docblocks.html" class="urlextern" title="http://www.stack.nl/~dimitri/doxygen/docblocks.html"  rel="nofollow">веб-сайт Doxygen</a>.
Отдельные команды документированы
<a href="http://www.stack.nl/~dimitri/doxygen/commands.html" class="urlextern" title="http://www.stack.nl/~dimitri/doxygen/commands.html"  rel="nofollow">здесь</a>. По
Doxygen есть также несколько очень удобных
<a href="http://www.digilife.be/quickreferences/QRC/Doxygen%20Quick%20Reference.pdf" class="urlextern" title="http://www.digilife.be/quickreferences/QRC/Doxygen%20Quick%20Reference.pdf"  rel="nofollow">кратких
справочных страниц</a>.
</p>

<p>
В следующих разделах предлагается вводная информация о том, как обычно
документируются gschem и libgeda. Обратите внимание, что для
комментариев, разрешённых в Doxygen, предпочтительным является стиль
QT вида <strong>/*! здесь идут комментарии */</strong>.
</p>

</div>
<!-- EDIT1527 SECTION "Комментарии и стили Doxygen" [866-3209] -->
<h3 class="sectionedit1528"><a name="документирование_файлов" id="документирование_файлов">Документирование файлов</a></h3>
<div class="level3">

<p>
При создании нового файла в нём, очевидно, должен быть обычный текст
лицензии GNU. После лицензии нужно включить комментарий о файле с
описанием того, для чего этот файл, и с любым другим текстом,
относящимся ко всему файлу как целому<sup><a href="#fn__1" name="fnt__1" id="fnt__1" class="fn_top">1)</a></sup>.
</p>
<pre class="code c">  <span class="coMULTI">/*! \file &lt;filename.ext&gt;
      \brief Здесь краткое изложение того, для чего этот файл...
      \par Описание
      Более длинное описание того, для чего этот файл (необязательно).
   */</span></pre>

</div>
<!-- EDIT1528 SECTION "Документирование файлов" [3210-4142] -->
<h3 class="sectionedit1529"><a name="документирование_переменных_определений_описаний_типов" id="документирование_переменных_определений_описаний_типов">Документирование переменных/определений/описаний типов</a></h3>
<div class="level3">

<p>
Глобальные переменные в файле можно документировать с помощью команды <strong>\var</strong>
или просто написав комментарий с помощью команды <strong>\brief</strong> прямо перед
определением.
</p>
<pre class="code c">  <span class="coMULTI">/*! \brief fill style of objects like cirle, rect, path */</span>
  <span class="kw4">typedef</span> <span class="kw2">enum</span> <span class="br0">&#123;</span>FILLING_HOLLOW<span class="sy0">,</span> FILLING_FILL<span class="sy0">,</span> FILLING_MESH<span class="sy0">,</span> FILLING_HATCH<span class="sy0">,</span> FILLING_VOID<span class="br0">&#125;</span> OBJECT_FILLING<span class="sy0">;</span></pre>

</div>
<!-- EDIT1529 SECTION "Документирование переменных/определений/описаний типов" [4143-4733] -->
<h3 class="sectionedit1530"><a name="документирование_функций" id="документирование_функций">Документирование функций</a></h3>
<div class="level3">

<p>
Функции можно документировать точно так же, как и переменные и т. д.
Достаточно вставить блок комментария выше документируемой им функции
и начать его командой <strong>\brief</strong>.
</p>

<p>
Обычно для длинного описания назначения функции используется дополнительный
параграф <strong>Function Description</strong>.
Также, для определения того, будут ли параметры функции изменяться в
ней самой, в командах <strong>\param</strong> используются атрибуты [in] или [out].
</p>
<pre class="code c">  <span class="coMULTI">/*! \brief &quot;Save&quot; a file into a string buffer
   *  \par Function Description
   *  This function saves a whole schematic into a buffer in libgeda
   *  format. The buffer should be freed when no longer needed.
   *
   *  \param [in] toplevel    The current TOPLEVEL.
   *  \param [in] object_list The head of a GList of OBJECTs to save.
   *  \return a buffer containing schematic data or NULL on failure.
   */</span></pre>

</div>
<!-- EDIT1530 SECTION "Документирование функций" [4734-5956] -->
<h3 class="sectionedit1531"><a name="документирование_структур" id="документирование_структур">Документирование структур</a></h3>
<div class="level3">

<p>
Структуры документируются так же, как указано в предыдущих разделах.
Учтите, что комментарии для членов структур могут как быть встроенными
в их собственные строки, так и указываться с помощью того же
синтаксиса <strong>\brief</strong>, что и для переменных. Для встраивания
документации в строку в её конце должен помещаться комментарий особого
вида, начинающийся с <strong>/*!&lt;</strong>.
</p>
<pre class="code c">  <span class="coMULTI">/*! \brief Structure for connections between OBJECTs
   *
   * The st_conn structure contains a single connection
   * to another object.
   * The connection system in s_conn.c uses this struct
   */</span>
  <span class="kw4">struct</span> st_conn <span class="br0">&#123;</span>
    OBJECT <span class="sy0">*</span>other_object<span class="sy0">;</span> <span class="coMULTI">/*!&lt; The &quot;other&quot; object connected to this one */</span>
    <span class="coMULTI">/*! \brief type of connection. Always in reference to how the &quot;other&quot;
        object is connected to the current one */</span>
    <span class="kw4">int</span> type<span class="sy0">;</span>
    <span class="kw4">int</span> x<span class="sy0">;</span> <span class="coMULTI">/*!&lt; x coord of the connection position */</span>
    <span class="kw4">int</span> y<span class="sy0">;</span> <span class="coMULTI">/*!&lt; y coord of the connection position */</span>
    <span class="kw4">int</span> whichone<span class="sy0">;</span> <span class="coMULTI">/*!&lt; which endpoint of the current object caused this connection */</span>
    <span class="kw4">int</span> other_whichone<span class="sy0">;</span> <span class="coMULTI">/*!&lt; which endpoint of the &quot;other&quot; object caused this connection */</span>
  <span class="br0">&#125;</span><span class="sy0">;</span></pre>

</div>
<!-- EDIT1531 SECTION "Документирование структур" [5957-7415] -->
<h3 class="sectionedit1532"><a name="команды_bug_todo" id="команды_bug_todo">Команды Bug/Todo</a></h3>
<div class="level3">

<p>
<strong>\bug</strong> и <strong>\todo</strong> полезны для отметки мест с недостатками или
отсутствующими возможностями в коде. Эти команды могут быть вставлены
в любое место внутри комментариев Doxygen, и служат они для создания
записей на специальных страницах в документации, позволяющих легко
найти соответствующее место.
</p>

</div>
<!-- EDIT1532 SECTION "Команды Bug/Todo" [7416-7984] -->
<h2 class="sectionedit1533"><a name="диалоговые_окнадизайн_и_поведение" id="диалоговые_окнадизайн_и_поведение">Диалоговые окна: дизайн и поведение</a></h2>
<div class="level2">

</div>
<!-- EDIT1533 SECTION "Диалоговые окна: дизайн и поведение" [7985-8063] -->
<h3 class="sectionedit1534"><a name="создание_диалоговых_окон" id="создание_диалоговых_окон">Создание диалоговых окон</a></h3>
<div class="level3">

<p>
Есть прекрасный документ от ребят из gnome под названием
<a href="http://library.gnome.org/devel/hig-book/" class="urlextern" title="http://library.gnome.org/devel/hig-book/"  rel="nofollow"> Gnome HIG</a>.
Насчёт дизайна диалоговых окон и насчёт того, как они должны себя вести,
предложений несколько.
</p>

<p>
<strong>Дизайн диалоговых окон — это, в общем-то, дело вкуса:</strong>
</p>
<ul>
<li class="level1"><div class="li"> выравнивание элементов. См. <a href="http://library.gnome.org/devel/hig-book/nightly/windows.html.en" class="urlextern" title="http://library.gnome.org/devel/hig-book/nightly/windows.html.en"  rel="nofollow"> Window Layout</a></div>
</li>
<li class="level1"><div class="li"> правое выравнивание кнопок диалога</div>
</li>
<li class="level1"><div class="li"> некоторое расстояние вокруг диалога (но какое?)</div>
</li>
<li class="level1"><div class="li"> некоторое расстояние между элементами (по вертикали и по горизонтали)</div>
</li>
<li class="level1"><div class="li"> группы переключателя в рамках или со сдвигом?</div>
</li>
<li class="level1"><div class="li"> метки рамок или жирные заголовки?</div>
</li>
</ul>

</div>
<!-- EDIT1534 SECTION "Создание диалоговых окон" [8064-9142] -->
<h3 class="sectionedit1535"><a name="модальные_и_немодальные_диалоговые_окна" id="модальные_и_немодальные_диалоговые_окна">Модальные и немодальные диалоговые окна</a></h3>
<div class="level3">

<p>
Модальное окно диалога требуется во всех тех случаях, когда данные для
окна обеспечиваются основным приложением.
</p>
<pre class="code">Пример:
  Окно диалога вызывается со списком выбора и должно работать только
  с данными этого списка.</pre>

<p>
Модальное окно подходит также тогда, когда диалог вызывается очень
редко.  Диалоговое окно открытия файла могло бы быть немодальным, так
как для него не требуется ввод никаких данных из приложения.
</p>

<p>
Модальное окно не подходит, если пользователь много
взаимодействует с этим окном. Хороший пример — выбор компонентов.
</p>

</div>
<!-- EDIT1535 SECTION "Модальные и немодальные диалоговые окна" [9143-10212] -->
<h3 class="sectionedit1536"><a name="где_размещать_диалоговое_окно" id="где_размещать_диалоговое_окно">Где размещать диалоговое окно</a></h3>
<div class="level3">

<p>
Диалоговое окно можно поместить в различные места экрана.
Список возможных мест можно найти в
<a href="http://library.gnome.org/devel/gtk/unstable/gtk3-Standard-Enumerations.html#GtkWindowPosition" class="urlextern" title="http://library.gnome.org/devel/gtk/unstable/gtk3-Standard-Enumerations.html#GtkWindowPosition"  rel="nofollow"> GtkReference</a>
</p>

<p>
В настоящее время диалоги помещаются или в позиции мыши (GTK_WIN_POS_MOUSE) или ни в какой предустановленной позиции (GTK_WIN_POS_NONE).
В Gnome HID по этой теме ничего не сказано.
</p>

<p>
Настройкой по умолчанию для GtkWindow является GTK_WIN_POS_NONE, см. <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkWindow.html#GtkWindow--window-position" class="urlextern" title="http://developer.gnome.org/doc/API/2.0/gtk/GtkWindow.html#GtkWindow--window-position"  rel="nofollow"> GtkWindow</a>.
Настройкой по умолчанию для GtkDialog является GTK_WIN_POS_CENTER_ON_PARENT
(<a href="http://git.gnome.org/browse/gtk+/tree/gtk/gtkdialog.c" class="urlextern" title="http://git.gnome.org/browse/gtk+/tree/gtk/gtkdialog.c"  rel="nofollow"> taken from the
GtkDialog source</a>).
</p>

</div>
<!-- EDIT1536 SECTION "Где размещать диалоговое окно" [10213-11265] -->
<h3 class="sectionedit1537"><a name="помещение_диалоговых_окон_перед_их_родительскими_окнами" id="помещение_диалоговых_окон_перед_их_родительскими_окнами">Помещение диалоговых окон перед их родительскими окнами</a></h3>
<div class="level3">

<p>
Большинство диалоговых окон размещается перед их родительскими окнами с помощью
свойства transient_for (см.
<a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkWindow.html#gtk-window-set-transient-for" class="urlextern" title="http://developer.gnome.org/doc/API/2.0/gtk/GtkWindow.html#gtk-window-set-transient-for"  rel="nofollow"> GtkReference</a>). Это свойство должно быть установлено для всех модальных
диалоговых окон.
</p>

<p>
Для немодальных диалоговых окон установка свойства transient_for не
очевидна. В то время как, например, в gschem диалоговое окно координат должно
находиться над родительским окном, окно журнала вешать перед ним нужды нет.
</p>

<p>
<strong>Примечание:</strong> Существует более старый механизм, удерживающий эти
окна перед gschem. Если переменная <em>raise-dialog-boxes-on-expose</em>
устанавливается в <em>enabled</em> в одном из файлов настроек gschem, она может
вызвать проблемы с некоторыми оконными менеджерами.
Если диалоговые окна мерцают при 100%-ной загрузке CPU, запретите эту
настройку.
</p>
<pre class="code lisp"><span class="co1">; raise-dialog-boxes-on-expose string</span>
<span class="co1">;</span>
<span class="co1">; Должны ли диалоговые окна подниматься всякий раз, когда появится</span>
<span class="co1">; событие expose</span>
<span class="co1">; По умолчанию включено (enabled)</span>
<span class="co1">;</span>
<span class="co1">;(raise-dialog-boxes-on-expose &quot;enabled&quot;)</span>
<span class="br0">&#40;</span>raise-dialog-boxes-on-expose <span class="st0">&quot;disabled&quot;</span><span class="br0">&#41;</span></pre>

</div>
<!-- EDIT1537 SECTION "Помещение диалоговых окон перед их родительскими окнами" [11266-13119] -->
<h3 class="sectionedit1538"><a name="порядок_кнопок_в_диалоговых_окнах" id="порядок_кнопок_в_диалоговых_окнах">Порядок кнопок в диалоговых окнах</a></h3>
<div class="level3">

<p>
Порядок кнопок внизу диалогового окна зависит от используемой операционной
системы.
GTK обрабатывает это автоматически, но требует, чтобы разработчики установили
альтернативный порядок кнопок. Более подробно об этом написано в
документации по GTK
<a href="http://library.gnome.org/devel/gtk/unstable/GtkDialog.html#gtk-dialog-set-alternative-button-order" class="urlextern" title="http://library.gnome.org/devel/gtk/unstable/GtkDialog.html#gtk-dialog-set-alternative-button-order"  rel="nofollow">здесь</a>.
</p>

<p>
Альтернативный порядок кнопок задаётся только с помощью одного вызова
GTK-функции:
</p>
<pre class="code C"><span class="coMULTI">/* Настройка альтернативного порядка кнопок (ok, no, cancel, help) для других систем */</span>
gtk_dialog_set_alternative_button_order<span class="br0">&#40;</span>GTK_DIALOG<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span>
			                GTK_RESPONSE_OK<span class="sy0">,</span>
					GTK_RESPONSE_NO<span class="sy0">,</span>
					GTK_RESPONSE_CANCEL<span class="sy0">,</span>
					GTK_RESPONSE_HELP<span class="sy0">,</span>
					<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></pre>

<p>
Это должно быть сделано перед запуском каждого нового создаваемого диалогового окна.
</p>

</div>
<!-- EDIT1538 SECTION "Порядок кнопок в диалоговых окнах" [13120-14408] -->
<h3 class="sectionedit1539"><a name="дизайн_текущих_диалогов" id="дизайн_текущих_диалогов">Дизайн текущих диалогов</a></h3>
<div class="level3">

<p>
<a href="media/devel_tips/dialog_picture.png" class="media" target="_blank" title="devel_tips:dialog_picture.png"><img src="media/devel_tips/dialog_picture.png" class="media" alt="" /></a>
</p>
<ul>
<li class="level1"><div class="li"> Вокруг всего окна есть некоторое пространство (<em>DIALOG_BORDER_SPACING</em>).</div>
</li>
<li class="level1"><div class="li"> Некоторый сдвиг для выделения тематической группы (<em>DIALOG_INDENTATION</em>) под её жирным заголовком.</div>
</li>
<li class="level1"><div class="li"> Вертикальное и горизонтальное разделение производится с помощью <em>DIALOG_H_SPACING</em> и <em>DIALOG_V_SPACING</em>.</div>
</li>
</ul>

</div>
<!-- EDIT1539 SECTION "Дизайн текущих диалогов" [14409-14960] -->
<h3 class="sectionedit1540"><a name="шаблон_исходного_кода_для_простых_диалоговых_окон" id="шаблон_исходного_кода_для_простых_диалоговых_окон">Шаблон исходного кода для простых диалоговых окон</a></h3>
<div class="level3">

<p>
Этот шаблон не предназначен для компиляции, но отсюда легко
скопировать нужный вам блок кода.
</p>
<pre class="code c"><span class="kw4">void</span> dialog <span class="br0">&#40;</span>TOPLEVEL <span class="sy0">*</span>w_current<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
  GtkWidget <span class="sy0">*</span>vbox<span class="sy0">,</span> <span class="sy0">*</span>label<span class="sy0">,</span> <span class="sy0">*</span>alignment<span class="sy0">,</span> <span class="sy0">*</span>table<span class="sy0">;</span>
  GtkWidget <span class="sy0">*</span>dialog<span class="sy0">;</span>
&nbsp;
  <span class="coMULTI">/* Создавать диалоговое окно только тогда, когда его ещё нет. Обычно
     это указатель на виджет в структуре w_current:
     dialog = w_current-&gt;tewindow */</span>
  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>dialog<span class="br0">&#41;</span> <span class="br0">&#123;</span>
    dialog <span class="sy0">=</span> gtk_dialog_new_with_buttons<span class="br0">&#40;</span>_<span class="br0">&#40;</span><span class="st0">&quot;Dialog title&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span>
					 <span class="coMULTI">/* родительское окно или NULL */</span>
					 GTK_WINDOW<span class="br0">&#40;</span>w_current<span class="sy0">-&gt;</span>main_window<span class="br0">&#41;</span><span class="sy0">,</span>
					 <span class="coMULTI">/* свойства диалога */</span>
					 GTK_DIALOG_MODAL<span class="sy0">,</span> <span class="coMULTI">/* 0 для немодальных диалоговых окон */</span>
					 <span class="coMULTI">/* кнопки окна и сигналы ответа */</span>
					 GTK_STOCK_CANCEL<span class="sy0">,</span>
					 GTK_RESPONSE_REJECT<span class="sy0">,</span>
					 GTK_STOCK_OK<span class="sy0">,</span>
					 GTK_RESPONSE_ACCEPT<span class="sy0">,</span>
					 NULL<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Настройка альтернативного порядка кнопок (ok, no, cancel, help) для других систем */</span>
    gtk_dialog_set_alternative_button_order<span class="br0">&#40;</span>GTK_DIALOG<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span>
	  				    GTK_RESPONSE_OK<span class="sy0">,</span>
					    GTK_RESPONSE_NO<span class="sy0">,</span>
					    GTK_RESPONSE_CANCEL<span class="sy0">,</span>
					    GTK_RESPONSE_HELP<span class="sy0">,</span>
					    <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Установить сигнал ответа по умолчанию. Он обычно вызывается
       по нажатию &quot;Return&quot; */</span>
    gtk_dialog_set_default_response<span class="br0">&#40;</span>GTK_DIALOG<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span>
				    GTK_RESPONSE_ACCEPT<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Задать функцию для обработки ответов кнопок и закрытия диалогового окна,
       для немодальных окон можно также использовать dialog_run().*/</span>
    gtk_signal_connect<span class="br0">&#40;</span>GTK_OBJECT<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span> <span class="st0">&quot;response&quot;</span><span class="sy0">,</span>
		       GTK_SIGNAL_FUNC<span class="br0">&#40;</span>dialog_response<span class="br0">&#41;</span><span class="sy0">,</span> w_current<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Где размещать диалоговое окно: GTK_WIN_POS_MOUSE или GTK_WIN_POS_NONE */</span>
    gtk_window_position<span class="br0">&#40;</span>GTK_WINDOW <span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span> GTK_WIN_POS_MOUSE<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Задать расстояние от границы окна и расстояние между элементами по вертикали */</span>
    vbox <span class="sy0">=</span> GTK_DIALOG<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">-&gt;</span>vbox<span class="sy0">;</span>
    gtk_container_set_border_width<span class="br0">&#40;</span>GTK_CONTAINER<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span>DIALOG_BORDER_SPACING<span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_box_set_spacing<span class="br0">&#40;</span>GTK_BOX<span class="br0">&#40;</span>vbox<span class="br0">&#41;</span><span class="sy0">,</span> DIALOG_V_SPACING<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Создать метку (со спецразметкой) и упаковать её в диалоговое окно */</span>
    label <span class="sy0">=</span> gtk_label_new<span class="br0">&#40;</span>_<span class="br0">&#40;</span><span class="st0">&quot;&lt;b&gt;Section label&lt;/b&gt;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_label_set_use_markup<span class="br0">&#40;</span>GTK_LABEL<span class="br0">&#40;</span>label<span class="br0">&#41;</span><span class="sy0">,</span> TRUE<span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_misc_set_alignment<span class="br0">&#40;</span>GTK_MISC<span class="br0">&#40;</span>label<span class="br0">&#41;</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_box_pack_start<span class="br0">&#40;</span>GTK_BOX<span class="br0">&#40;</span>vbox<span class="br0">&#41;</span><span class="sy0">,</span> label<span class="sy0">,</span> FALSE<span class="sy0">,</span> FALSE<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Создать контейнер выравнивания с DIALOG_INDENTATION слева */</span>
    alignment <span class="sy0">=</span> gtk_alignment_new<span class="br0">&#40;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_alignment_set_padding<span class="br0">&#40;</span>GTK_ALIGNMENT<span class="br0">&#40;</span>alignment<span class="br0">&#41;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span>
			      DIALOG_INDENTATION<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_box_pack_start<span class="br0">&#40;</span>GTK_BOX<span class="br0">&#40;</span>vbox<span class="br0">&#41;</span><span class="sy0">,</span> alignment<span class="sy0">,</span> FALSE<span class="sy0">,</span> FALSE<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Таблица может содержать несколько записей. Она сохраняется в контейнере выравнивания.
       Примечание: расстояния между ячейками по вертикали и горизонтали */</span>
    table <span class="sy0">=</span> gtk_table_new <span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">,</span> FALSE<span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_table_set_row_spacings<span class="br0">&#40;</span>GTK_TABLE<span class="br0">&#40;</span>table<span class="br0">&#41;</span><span class="sy0">,</span> DIALOG_V_SPACING<span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_table_set_col_spacings<span class="br0">&#40;</span>GTK_TABLE<span class="br0">&#40;</span>table<span class="br0">&#41;</span><span class="sy0">,</span> DIALOG_H_SPACING<span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_container_add<span class="br0">&#40;</span>GTK_CONTAINER<span class="br0">&#40;</span>alignment<span class="br0">&#41;</span><span class="sy0">,</span> table<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Простая текстовая метка в одной ячейке таблицы с левым выравниванием.
       Примечание: GTK_FILL в третьей строке обязательно */</span>
    label <span class="sy0">=</span> gtk_label_new<span class="br0">&#40;</span>_<span class="br0">&#40;</span><span class="st0">&quot;Text:&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_misc_set_alignment<span class="br0">&#40;</span>GTK_MISC<span class="br0">&#40;</span>label<span class="br0">&#41;</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_table_attach<span class="br0">&#40;</span>GTK_TABLE<span class="br0">&#40;</span>table<span class="br0">&#41;</span><span class="sy0">,</span> label<span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span> GTK_FILL<span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Простое поле ввода текста завершает ряд опций */</span>
    textentry <span class="sy0">=</span> gtk_entry_new_with_max_length <span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_table_attach_defaults<span class="br0">&#40;</span>GTK_TABLE<span class="br0">&#40;</span>table<span class="br0">&#41;</span><span class="sy0">,</span> textentry<span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
    gtk_entry_set_activates_default<span class="br0">&#40;</span>GTK_ENTRY<span class="br0">&#40;</span>textentry<span class="br0">&#41;</span><span class="sy0">,</span> TRUE<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* ..... ещё строки таблицы с опциями или новые разделы */</span>
&nbsp;
    <span class="coMULTI">/* Создать ссылки на все виджеты, которые потребуются в дальнейшем */</span>
    GLADE_HOOKUP_OBJECT<span class="br0">&#40;</span>dialog<span class="sy0">,</span> sizeentry<span class="sy0">,</span><span class="st0">&quot;textentry&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="coMULTI">/* Показывать все значения рекурсивно */</span>
    gtk_widget_show_all<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="kw1">else</span> <span class="br0">&#123;</span>
    <span class="coMULTI">/* Окно уже здесь. Показать его пользователю.
       Это необходимо только для немодального диалогового окна */</span>
    gtk_window_present<span class="br0">&#40;</span>GTK_WINDOW<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="coMULTI">/* Всегда задавать в диалоговом окне текущие значения
     Если поместить эту часть в конец функции диалогового окна, это
     позволит легко создавать диалоги, которые можно будет
     вызывать, даже если они уже открыты */</span>
  textentry <span class="sy0">=</span> g_object_get_data<span class="br0">&#40;</span>G_OBJECT<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">,</span> <span class="st0">&quot;textentry&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  gtk_entry_set_text<span class="br0">&#40;</span>GTK_ENTRY<span class="br0">&#40;</span>textentry<span class="br0">&#41;</span><span class="sy0">,</span> string<span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="coMULTI">/* Выделение области текста, которую пользовать обычно любит заменять */</span>
  gtk_entry_select_region<span class="br0">&#40;</span>GTK_ENTRY<span class="br0">&#40;</span>textentry<span class="br0">&#41;</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> strlen<span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre>

<p>
Функция ответа для такого диалогового окна может выглядеть так:
</p>
<pre class="code c"><span class="kw4">void</span> dialog_response<span class="br0">&#40;</span>GtkWidget <span class="sy0">*</span>widget<span class="sy0">,</span> gint response<span class="sy0">,</span> TOPLEVEL <span class="sy0">*</span>w_current<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
  <span class="kw1">switch</span> <span class="br0">&#40;</span>response<span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">case</span> GTK_RESPONSE_ACCEPT<span class="sy0">:</span>
    <span class="coMULTI">/* Применить установки диалогового окна:
       просто вставьте свой код здесь, если он короткий;
       или вызовите внешнюю функцию применения, если требуемый код длинный */</span>
    <span class="kw2">break</span><span class="sy0">;</span>
  <span class="kw1">case</span> GTK_RESPONSE_REJECT<span class="sy0">:</span>
  <span class="kw1">case</span> GTK_RESPONSE_DELETE_EVENT<span class="sy0">:</span>
    <span class="coMULTI">/* Для модальных окон просто ничего не делаем,
       для немодальных окон, уничтожаем диалог и прибираемся */</span>
    <span class="kw2">break</span><span class="sy0">;</span>
  <span class="kw1">default</span><span class="sy0">:</span>
    <span class="coMULTI">/* Ловим ошибочные сигналы (параноидальная проверка ошибок ;-)) */</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;dialog_response(): strange signal %d<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> response<span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="coMULTI">/* Для немодальных окон просто ничего не делаем,
     для модальных окон всегда уничтожаем диалог и прибираемся */</span>
<span class="br0">&#125;</span></pre>

</div>
<!-- EDIT1540 SECTION "Шаблон исходного кода для простых диалоговых окон" [14961-22045] -->
<h3 class="sectionedit1541"><a name="текущие_проблемы_с_диалоговыми_окнами_в_gschem" id="текущие_проблемы_с_диалоговыми_окнами_в_gschem">Текущие проблемы с диалоговыми окнами в gschem</a></h3>
<div class="level3">
<ul>
<li class="level1"><div class="li"> у каждого диалогового окна свой собственный дизайн</div>
</li>
<li class="level1"><div class="li"> размещение окон: в позиции мыши или в непредопределённой позиции?</div>
</li>
<li class="level1"><div class="li"> диалоговые окна не запоминают своего последнего размера, положения и содержимого</div>
</li>
<li class="level1"><div class="li"> отсутствуют “горячие клавиши”</div>
</li>
</ul>

<p>
<strong>Здесь список вещей, которые могли бы быть улучшены:</strong>
</p>

</div>

<h5><a name="диалоговое_окно_печати" id="диалоговое_окно_печати">Диалоговое окно печати</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> Изменить дизайн?</div>
</li>
</ul>

</div>

<h5><a name="сохранение_изображений" id="сохранение_изображений">Сохранение изображений</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> В окне выбора файла отсутствует имя файла по умолчанию, если файл не существует</div>
</li>
<li class="level1"><div class="li"> Клавиша Return не работает в поле записи имени файла</div>
</li>
</ul>

</div>

<h5><a name="выполнить_скрипт" id="выполнить_скрипт">Выполнить скрипт</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="правка_текста" id="правка_текста">Правка текста</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> отсутствует несколько сочетаний клавиш</div>
</li>
<li class="level1"><div class="li"> добавить теги *unmodified*, если есть несколько выделенных объектов</div>
</li>
<li class="level1"><div class="li"> может быть добавить несколько цветных pixbuf для выбора цвета</div>
</li>
<li class="level1"><div class="li"> может быть заменить выравнивание текста девятью селективными кнопками, переключать кнопки с иконками или …</div>
</li>
</ul>

</div>

<h5><a name="правка_цвета" id="правка_цвета">Правка цвета</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> может быть добавить несколько цветных pixbuf для выбора цвета</div>
</li>
</ul>

</div>

<h5><a name="свойства_линии" id="свойства_линии">Свойства линии</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> отсутствуют “горячие клавиши”</div>
</li>
<li class="level1"><div class="li"> иконки для типов линии</div>
</li>
</ul>

</div>

<h5><a name="тип_заполнения" id="тип_заполнения">Тип заполнения</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> отсутствуют “горячие клавиши”</div>
</li>
<li class="level1"><div class="li"> иконки для типов заполнения</div>
</li>
</ul>

</div>

<h5><a name="смещение_символа" id="смещение_символа">Смещение символа</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="менеджер_страниц" id="менеджер_страниц">Менеджер страниц</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> неправильный порядок кнопок? Зависит от того, считаете ли вы кнопку обновления основной действующей кнопкой или просто дополнительной кнопкой</div>
</li>
<li class="level1"><div class="li"> может быть клавиша “Return” должна вызывать обновление</div>
</li>
</ul>

</div>

<h5><a name="выбор_компонентов" id="выбор_компонентов">Выбор компонентов</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> странный виджет редактирования, когда производится набор текста при выделенном дереве (этот виджет — помощник в поиске, запретить его?!)</div>
</li>
</ul>

</div>

<h5><a name="редактор_атрибута" id="редактор_атрибута">Редактор атрибута</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> некоторые проблемы при выделении нескольких элементов и вызове функции редактирования (ee):</div>
<ul>
<li class="level3"><div class="li"> если первый объект является текстом, то открывается это диалоговое окно (но с неправильным параметром списка)</div>
</li>
<li class="level3"><div class="li"> если первый объект является комплексным (complex), то вызывается Правка атрибутов</div>
</li>
</ul>
</li>
</ul>

</div>

<h5><a name="правка_атрибутов" id="правка_атрибутов">Правка атрибутов</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="ввод_текста" id="ввод_текста">Ввод текста</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="параметры_дуги" id="параметры_дуги">Параметры дуги</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> Добавить в диалоговое окно диаметр, но выбирать поле ввода начального угла (increment = grid)</div>
</li>
<li class="level1"><div class="li"> пусть “ee” вызывает диалог, если выделена только одна дуга</div>
</li>
<li class="level1"><div class="li"> может быть добавить метку раздела</div>
</li>
</ul>

</div>

<h5><a name="вставка_изображения" id="вставка_изображения">Вставка изображения</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="замена_изображения" id="замена_изображения">Замена изображения</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> новое изображение использует отношение сторон старого</div>
</li>
<li class="level1"><div class="li"> диалоговое окно имеет много общего с диалоговым окном вставки изображения. Они могли бы совместно использовать общий код</div>
</li>
</ul>

</div>

<h5><a name="найти_текст" id="найти_текст">Найти текст...</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> манипулирует указателем мыши (может быть виновником является код изменения масштаба). Просто нажать “Return” чтобы вызвать FindNext (найти следующий)</div>
</li>
<li class="level1"><div class="li"> если вы выбираете поиск по иерархии и найденный текст находится на другой схеме, то имя файла в заголовке окна не обновляется</div>
</li>
<li class="level1"><div class="li"> может быть добавить опцию: “Выделить все соответствующие выражению текстовые объекты”, запретить иерархию для этого случая!</div>
</li>
<li class="level1"><div class="li"> <img src="images/smileys/fixme.gif" align="middle" alt="FIXME" /> gschem виснет, если это диалоговое окно используется с иерархической схемой, в которой есть циклические зависимости (например, автонумерация тестовой схемы)</div>
</li>
<li class="level1"><div class="li"> добавить опцию “поиск только в видимом тексте”</div>
</li>
<li class="level1"><div class="li"> может быть для поиска текста вместо части строки использовать регулярные выражения</div>
</li>
</ul>

</div>

<h5><a name="скрыть_текст" id="скрыть_текст">Скрыть текст...</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> использовать регулярные выражения вместо начала строки</div>
</li>
</ul>

</div>

<h5><a name="показать_текст" id="показать_текст">Показать текст...</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> использовать регулярные выражения вместо начала строки</div>
</li>
<li class="level1"><div class="li"> может быть объединить это окно с окном “Скрыть текст…”</div>
</li>
</ul>

</div>

<h5><a name="автонумерация" id="автонумерация">Автонумерация...</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> может быть запретить опцию пропуска, если областью перенумерации является “Выделенные объекты”. Другие варианты пропуска (“Текущая страница” и “Вся иерархия”) чесслово глупые.</div>
</li>
</ul>

</div>

<h5><a name="размер_текста" id="размер_текста">Размер текста</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="шаг_сетки_привязки" id="шаг_сетки_привязки">Шаг сетки привязки...</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="окно_координат" id="окно_координат">Окно координат...</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"> может быть перенести координаты всей рабочей области в панель состояния основного окна?</div>
</li>
</ul>

</div>

<h5><a name="окно_о_программе" id="окно_о_программе">Окно О программе</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>

<h5><a name="горячие_клавиши" id="горячие_клавиши">Горячие клавиши</a></h5>
<div class="level5">
<ul>
<li class="level1"><div class="li"></div>
</li>
</ul>

</div>
<!-- EDIT1541 SECTION "Текущие проблемы с диалоговыми окнами в gschem" [22046-] --><div class="footnotes">
<div class="fn"><sup><a href="#fnt__1" id="fn__1" name="fn__1" class="fn_bot">1)</a></sup> 
Здесь и далее в коде всё
конечно же должно быть по-английски. — <em>Прим. перев.</em> </div>
</div>
</body>
</html>