<!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 <filename.ext> \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">{</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">}</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 "Save" 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>/*!<</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">{</span> OBJECT <span class="sy0">*</span>other_object<span class="sy0">;</span> <span class="coMULTI">/*!< The "other" object connected to this one */</span> <span class="coMULTI">/*! \brief type of connection. Always in reference to how the "other" 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">/*!< x coord of the connection position */</span> <span class="kw4">int</span> y<span class="sy0">;</span> <span class="coMULTI">/*!< y coord of the connection position */</span> <span class="kw4">int</span> whichone<span class="sy0">;</span> <span class="coMULTI">/*!< which endpoint of the current object caused this connection */</span> <span class="kw4">int</span> other_whichone<span class="sy0">;</span> <span class="coMULTI">/*!< which endpoint of the "other" object caused this connection */</span> <span class="br0">}</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 "enabled")</span> <span class="br0">(</span>raise-dialog-boxes-on-expose <span class="st0">"disabled"</span><span class="br0">)</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">(</span>GTK_DIALOG<span class="br0">(</span>dialog<span class="br0">)</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">)</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">(</span>TOPLEVEL <span class="sy0">*</span>w_current<span class="br0">)</span> <span class="br0">{</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> <span class="coMULTI">/* Создавать диалоговое окно только тогда, когда его ещё нет. Обычно это указатель на виджет в структуре w_current: dialog = w_current->tewindow */</span> <span class="kw1">if</span> <span class="br0">(</span><span class="sy0">!</span>dialog<span class="br0">)</span> <span class="br0">{</span> dialog <span class="sy0">=</span> gtk_dialog_new_with_buttons<span class="br0">(</span>_<span class="br0">(</span><span class="st0">"Dialog title"</span><span class="br0">)</span><span class="sy0">,</span> <span class="coMULTI">/* родительское окно или NULL */</span> GTK_WINDOW<span class="br0">(</span>w_current<span class="sy0">-></span>main_window<span class="br0">)</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">)</span><span class="sy0">;</span> <span class="coMULTI">/* Настройка альтернативного порядка кнопок (ok, no, cancel, help) для других систем */</span> gtk_dialog_set_alternative_button_order<span class="br0">(</span>GTK_DIALOG<span class="br0">(</span>dialog<span class="br0">)</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">)</span><span class="sy0">;</span> <span class="coMULTI">/* Установить сигнал ответа по умолчанию. Он обычно вызывается по нажатию "Return" */</span> gtk_dialog_set_default_response<span class="br0">(</span>GTK_DIALOG<span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">,</span> GTK_RESPONSE_ACCEPT<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Задать функцию для обработки ответов кнопок и закрытия диалогового окна, для немодальных окон можно также использовать dialog_run().*/</span> gtk_signal_connect<span class="br0">(</span>GTK_OBJECT<span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">,</span> <span class="st0">"response"</span><span class="sy0">,</span> GTK_SIGNAL_FUNC<span class="br0">(</span>dialog_response<span class="br0">)</span><span class="sy0">,</span> w_current<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Где размещать диалоговое окно: GTK_WIN_POS_MOUSE или GTK_WIN_POS_NONE */</span> gtk_window_position<span class="br0">(</span>GTK_WINDOW <span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">,</span> GTK_WIN_POS_MOUSE<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Задать расстояние от границы окна и расстояние между элементами по вертикали */</span> vbox <span class="sy0">=</span> GTK_DIALOG<span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">-></span>vbox<span class="sy0">;</span> gtk_container_set_border_width<span class="br0">(</span>GTK_CONTAINER<span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">,</span>DIALOG_BORDER_SPACING<span class="br0">)</span><span class="sy0">;</span> gtk_box_set_spacing<span class="br0">(</span>GTK_BOX<span class="br0">(</span>vbox<span class="br0">)</span><span class="sy0">,</span> DIALOG_V_SPACING<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Создать метку (со спецразметкой) и упаковать её в диалоговое окно */</span> label <span class="sy0">=</span> gtk_label_new<span class="br0">(</span>_<span class="br0">(</span><span class="st0">"<b>Section label</b>"</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> gtk_label_set_use_markup<span class="br0">(</span>GTK_LABEL<span class="br0">(</span>label<span class="br0">)</span><span class="sy0">,</span> TRUE<span class="br0">)</span><span class="sy0">;</span> gtk_misc_set_alignment<span class="br0">(</span>GTK_MISC<span class="br0">(</span>label<span class="br0">)</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> gtk_box_pack_start<span class="br0">(</span>GTK_BOX<span class="br0">(</span>vbox<span class="br0">)</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">)</span><span class="sy0">;</span> <span class="coMULTI">/* Создать контейнер выравнивания с DIALOG_INDENTATION слева */</span> alignment <span class="sy0">=</span> gtk_alignment_new<span class="br0">(</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">)</span><span class="sy0">;</span> gtk_alignment_set_padding<span class="br0">(</span>GTK_ALIGNMENT<span class="br0">(</span>alignment<span class="br0">)</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">)</span><span class="sy0">;</span> gtk_box_pack_start<span class="br0">(</span>GTK_BOX<span class="br0">(</span>vbox<span class="br0">)</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">)</span><span class="sy0">;</span> <span class="coMULTI">/* Таблица может содержать несколько записей. Она сохраняется в контейнере выравнивания. Примечание: расстояния между ячейками по вертикали и горизонтали */</span> table <span class="sy0">=</span> gtk_table_new <span class="br0">(</span><span class="nu0">3</span><span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">,</span> FALSE<span class="br0">)</span><span class="sy0">;</span> gtk_table_set_row_spacings<span class="br0">(</span>GTK_TABLE<span class="br0">(</span>table<span class="br0">)</span><span class="sy0">,</span> DIALOG_V_SPACING<span class="br0">)</span><span class="sy0">;</span> gtk_table_set_col_spacings<span class="br0">(</span>GTK_TABLE<span class="br0">(</span>table<span class="br0">)</span><span class="sy0">,</span> DIALOG_H_SPACING<span class="br0">)</span><span class="sy0">;</span> gtk_container_add<span class="br0">(</span>GTK_CONTAINER<span class="br0">(</span>alignment<span class="br0">)</span><span class="sy0">,</span> table<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Простая текстовая метка в одной ячейке таблицы с левым выравниванием. Примечание: GTK_FILL в третьей строке обязательно */</span> label <span class="sy0">=</span> gtk_label_new<span class="br0">(</span>_<span class="br0">(</span><span class="st0">"Text:"</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> gtk_misc_set_alignment<span class="br0">(</span>GTK_MISC<span class="br0">(</span>label<span class="br0">)</span><span class="sy0">,</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> gtk_table_attach<span class="br0">(</span>GTK_TABLE<span class="br0">(</span>table<span class="br0">)</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">)</span><span class="sy0">;</span> <span class="coMULTI">/* Простое поле ввода текста завершает ряд опций */</span> textentry <span class="sy0">=</span> gtk_entry_new_with_max_length <span class="br0">(</span><span class="nu0">10</span><span class="br0">)</span><span class="sy0">;</span> gtk_table_attach_defaults<span class="br0">(</span>GTK_TABLE<span class="br0">(</span>table<span class="br0">)</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">)</span><span class="sy0">;</span> gtk_entry_set_activates_default<span class="br0">(</span>GTK_ENTRY<span class="br0">(</span>textentry<span class="br0">)</span><span class="sy0">,</span> TRUE<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* ..... ещё строки таблицы с опциями или новые разделы */</span> <span class="coMULTI">/* Создать ссылки на все виджеты, которые потребуются в дальнейшем */</span> GLADE_HOOKUP_OBJECT<span class="br0">(</span>dialog<span class="sy0">,</span> sizeentry<span class="sy0">,</span><span class="st0">"textentry"</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Показывать все значения рекурсивно */</span> gtk_widget_show_all<span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span> <span class="coMULTI">/* Окно уже здесь. Показать его пользователю. Это необходимо только для немодального диалогового окна */</span> gtk_window_present<span class="br0">(</span>GTK_WINDOW<span class="br0">(</span>dialog<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="coMULTI">/* Всегда задавать в диалоговом окне текущие значения Если поместить эту часть в конец функции диалогового окна, это позволит легко создавать диалоги, которые можно будет вызывать, даже если они уже открыты */</span> textentry <span class="sy0">=</span> g_object_get_data<span class="br0">(</span>G_OBJECT<span class="br0">(</span>dialog<span class="br0">)</span><span class="sy0">,</span> <span class="st0">"textentry"</span><span class="br0">)</span><span class="sy0">;</span> gtk_entry_set_text<span class="br0">(</span>GTK_ENTRY<span class="br0">(</span>textentry<span class="br0">)</span><span class="sy0">,</span> string<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Выделение области текста, которую пользовать обычно любит заменять */</span> gtk_entry_select_region<span class="br0">(</span>GTK_ENTRY<span class="br0">(</span>textentry<span class="br0">)</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> strlen<span class="br0">(</span>string<span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span></pre> <p> Функция ответа для такого диалогового окна может выглядеть так: </p> <pre class="code c"><span class="kw4">void</span> dialog_response<span class="br0">(</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">)</span> <span class="br0">{</span> <span class="kw1">switch</span> <span class="br0">(</span>response<span class="br0">)</span> <span class="br0">{</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">(</span><span class="st0">"dialog_response(): strange signal %d<span class="es1">\n</span>"</span><span class="sy0">,</span> response<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="coMULTI">/* Для немодальных окон просто ничего не делаем, для модальных окон всегда уничтожаем диалог и прибираемся */</span> <span class="br0">}</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>