missing NULL terminator in set_config_x
[geda-gaf.git] / docs / wiki / geda-devel-tips.ru.html
blob0bab5456d79aeb20306bfa976ec2b2249f26e740
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html>
4 <head>
5 <link rel="stylesheet" media="screen" type="text/css" href="./style.css" />
6 <link rel="stylesheet" media="screen" type="text/css" href="./design.css" />
7 <link rel="stylesheet" media="print" type="text/css" href="./print.css" />
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10 </head>
11 <body>
13 <p>
14 <em>Эта страница доступна также на следующих языках:</em> <a href="geda-devel-tips.html" class="wikilink1" title="geda-devel-tips.html">English</a>
15 </p>
17 <h1 class="sectionedit1" id="советы_подсказки_и_хитрости_для_разработчиков_geda">Советы, подсказки и хитрости для разработчиков gEDA</h1>
18 <div class="level1">
20 </div>
21 <!-- EDIT1 SECTION "Советы, подсказки и хитрости для разработчиков gEDA" [119-226] -->
22 <h2 class="sectionedit2" id="структура_данных_схемы">Структура данных схемы</h2>
23 <div class="level2">
25 <p>
26 Внутри gaf схема представляется набором
27 <a href="http://ru.wikipedia.org/wiki/Связный_список" class="urlextern" title="http://ru.wikipedia.org/wiki/Связный_список" rel="nofollow">двусвязных списков</a>.
28 Центральным типом связи в списках является OBJECT. Он может быть
29 представлением какого-нибудь символа, строки текста, графического примитива,
30 соединения или атрибута.
31 </p>
33 <p>
34 Обзор структуры данных схемы можно найти
35 <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>. Этот
36 набросок сделан Стюартом Брорсоном (Stuart Brorson) в 2005 году.
37 </p>
39 </div>
40 <!-- EDIT2 SECTION "Структура данных схемы" [227-1019] -->
41 <h2 class="sectionedit3" id="комментарии_и_стили_doxygen">Комментарии и стили Doxygen</h2>
42 <div class="level2">
44 <p>
45 <strong>Doxygen</strong> представляет собой утилиту для извлечения документации по <abbr title="Application Programming Interface">API</abbr> из комментариев в исходном коде. В комментариях может указываться разметка, которая впоследствии может быть преобразована программой Doxygen в код <abbr title="HyperText Markup Language">HTML</abbr> или LaTeX. Это позволяет, к примеру, одной функции сослаться на другую, связанную с ней, а также даёт возможность приводить документацию об аргументах и возвращаемых значениях.
46 </p>
48 <p>
49 Некоторые части исходных текстов gaf уже подготовлены для работы с
50 <strong>doxygen</strong>. Сейчас сюда входят libgeda, gschem, gnetlist, gsymcheck и
51 gattrib. Файлы Makefile этих утилит в каталоге <em><code>docs</code></em> содержат цель
52 «doxygen». Или же вывод doxygen можно посмотреть
53 <a href="http://www.xs4all.nl/~ljh4timm/gaf/dox.html" class="urlextern" title="http://www.xs4all.nl/~ljh4timm/gaf/dox.html" rel="nofollow">на этой странице</a>,
54 подготовленной Бертом Тиммерманом (Bert Timmerman).
55 </p>
57 <p>
58 Если вы хотите узнать заложенные в Doxygen идеи о том, как надо
59 форматировать документацию, см.
60 <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>.
61 Отдельные команды документированы
62 <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
63 есть также несколько очень удобных
64 <a href="http://www.digilife.be/quickreferences/QRC/Doxygen Quick
65 Reference.pdf" class="urlextern" title="http://www.digilife.be/quickreferences/QRC/Doxygen Quick
66 Reference.pdf" rel="nofollow">кратких справочных страниц</a>.
67 </p>
69 <p>
70 В следующих разделах предлагается вводная информация о том, как обычно
71 документируются gschem и libgeda. Обратите внимание, что для комментариев,
72 разрешённых в Doxygen, предпочтительным является стиль QT вида <strong>/*! здесь
73 идут комментарии */</strong>.
74 </p>
76 </div>
77 <!-- EDIT3 SECTION "Комментарии и стили Doxygen" [1020-3363] -->
78 <h3 class="sectionedit4" id="документирование_файлов">Документирование файлов</h3>
79 <div class="level3">
81 <p>
82 При создании нового файла в нём, очевидно, должен быть обычный текст лицензии GNU. После лицензии нужно включить комментарий о файле с описанием того, для чего этот файл, и с любым другим текстом, относящимся ко всему файлу как целому<sup><a href="#fn__22" id="fnt__22" class="fn_top">22)</a></sup>.
83 </p>
84 <pre class="code c"> <span class="coMULTI">/*! \file &lt;filename.ext&gt;
85 \brief Здесь краткое изложение того, для чего этот файл...
86 \par Описание
87 Более длинное описание того, для чего этот файл (необязательно).
88 */</span></pre>
90 </div>
91 <!-- EDIT4 SECTION "Документирование файлов" [3364-4296] -->
92 <h3 class="sectionedit5" id="документирование_переменных_определений_описаний_типов">Документирование переменных/определений/описаний типов</h3>
93 <div class="level3">
95 <p>
96 Глобальные переменные в файле можно документировать с помощью команды
97 <strong>\var</strong> или просто написав комментарий с помощью команды <strong>\brief</strong> прямо
98 перед определением.
99 </p>
100 <pre class="code c"> <span class="coMULTI">/*! \brief fill style of objects like cirle, rect, path */</span>
101 <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>
103 </div>
104 <!-- EDIT5 SECTION "Документирование переменных/определений/описаний типов" [4297-4887] -->
105 <h3 class="sectionedit6" id="документирование_функций">Документирование функций</h3>
106 <div class="level3">
109 Функции можно документировать точно так же, как и переменные и т. д.
110 Достаточно вставить блок комментария выше документируемой им функции и
111 начать его командой <strong>\brief</strong>.
112 </p>
115 Обычно для длинного описания назначения функции используется дополнительный
116 параграф <strong>Function Description</strong>. Также, для определения того, будут ли
117 параметры функции изменяться в ней самой, в командах <strong>\param</strong> используются
118 атрибуты [in] или [out].
119 </p>
120 <pre class="code c"> <span class="coMULTI">/*! \brief &quot;Save&quot; a file into a string buffer
121 * \par Function Description
122 * This function saves a whole schematic into a buffer in libgeda
123 * format. The buffer should be freed when no longer needed.
125 * \param [in] toplevel The current TOPLEVEL.
126 * \param [in] object_list The head of a GList of OBJECTs to save.
127 * \return a buffer containing schematic data or NULL on failure.
128 */</span></pre>
130 </div>
131 <!-- EDIT6 SECTION "Документирование функций" [4888-6111] -->
132 <h3 class="sectionedit7" id="документирование_структур">Документирование структур</h3>
133 <div class="level3">
136 Структуры документируются так же, как указано в предыдущих разделах.
137 Учтите, что комментарии для членов структур могут как быть встроенными в их
138 собственные строки, так и указываться с помощью того же синтаксиса
139 <strong>\brief</strong>, что и для переменных. Для встраивания документации в строку в её
140 конце должен помещаться комментарий особого вида, начинающийся с
141 <strong>/*!&lt;</strong>.
142 </p>
143 <pre class="code c"> <span class="coMULTI">/*! \brief Structure for connections between OBJECTs
145 * The st_conn structure contains a single connection
146 * to another object.
147 * The connection system in s_conn.c uses this struct
148 */</span>
149 <span class="kw4">struct</span> st_conn <span class="br0">&#123;</span>
150 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>
151 <span class="coMULTI">/*! \brief type of connection. Always in reference to how the &quot;other&quot;
152 object is connected to the current one */</span>
153 <span class="kw4">int</span> type<span class="sy0">;</span>
154 <span class="kw4">int</span> x<span class="sy0">;</span> <span class="coMULTI">/*!&lt; x coord of the connection position */</span>
155 <span class="kw4">int</span> y<span class="sy0">;</span> <span class="coMULTI">/*!&lt; y coord of the connection position */</span>
156 <span class="kw4">int</span> whichone<span class="sy0">;</span> <span class="coMULTI">/*!&lt; which endpoint of the current object caused this connection */</span>
157 <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>
158 <span class="br0">&#125;</span><span class="sy0">;</span></pre>
160 </div>
161 <!-- EDIT7 SECTION "Документирование структур" [6112-7573] -->
162 <h3 class="sectionedit8" id="команды_bug_todo">Команды Bug/Todo</h3>
163 <div class="level3">
166 <strong>\bug</strong> и <strong>\todo</strong> полезны для отметки мест с недостатками или отсутствующими возможностями в коде. Эти команды могут быть вставлены в любое место внутри комментариев Doxygen, и служат они для создания записей на специальных страницах в документации, позволяющих легко найти соответствующее место.
167 </p>
169 </div>
170 <!-- EDIT8 SECTION "Команды Bug/Todo" [7574-8140] -->
171 <h2 class="sectionedit9" id="диалоговые_окнадизайн_и_поведение">Диалоговые окна: дизайн и поведение</h2>
172 <div class="level2">
174 </div>
175 <!-- EDIT9 SECTION "Диалоговые окна: дизайн и поведение" [8141-8221] -->
176 <h3 class="sectionedit10" id="создание_диалоговых_окон">Создание диалоговых окон</h3>
177 <div class="level3">
180 Есть прекрасный документ от ребят из gnome под названием
181 <a href="http://library.gnome.org/devel/hig-book/" class="urlextern" title="http://library.gnome.org/devel/hig-book/" rel="nofollow"> Gnome HIG</a>. Насчёт дизайна
182 диалоговых окон и насчёт того, как они должны себя вести, предложений
183 несколько.
184 </p>
187 <strong>Дизайн диалоговых окон — это, в общем-то, дело вкуса:</strong>
188 </p>
189 <ul>
190 <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>
191 </li>
192 <li class="level1"><div class="li"> правое выравнивание кнопок диалога</div>
193 </li>
194 <li class="level1"><div class="li"> некоторое расстояние вокруг диалога (но какое?)</div>
195 </li>
196 <li class="level1"><div class="li"> некоторое расстояние между элементами (по вертикали и по горизонтали)</div>
197 </li>
198 <li class="level1"><div class="li"> группы переключателя в рамках или со сдвигом?</div>
199 </li>
200 <li class="level1"><div class="li"> метки рамок или жирные заголовки?</div>
201 </li>
202 </ul>
204 </div>
205 <!-- EDIT10 SECTION "Создание диалоговых окон" [8222-9301] -->
206 <h3 class="sectionedit11" id="модальные_и_немодальные_диалоговые_окна">Модальные и немодальные диалоговые окна</h3>
207 <div class="level3">
210 Модальное окно диалога требуется во всех тех случаях, когда данные для окна
211 обеспечиваются основным приложением.
212 </p>
213 <pre class="code">Пример:
214 Окно диалога вызывается со списком выбора и должно работать только
215 с данными этого списка.</pre>
218 Модальное окно подходит также тогда, когда диалог вызывается очень редко.
219 Диалоговое окно открытия файла могло бы быть немодальным, так как для него
220 не требуется ввод никаких данных из приложения.
221 </p>
224 Модальное окно не подходит, если пользователь много взаимодействует с этим
225 окном. Хороший пример — выбор компонентов.
226 </p>
228 </div>
229 <!-- EDIT11 SECTION "Модальные и немодальные диалоговые окна" [9302-10370] -->
230 <h3 class="sectionedit12" id="где_размещать_диалоговое_окно">Где размещать диалоговое окно</h3>
231 <div class="level3">
234 Диалоговое окно можно поместить в различные места экрана. Список возможных
235 мест можно найти в
236 <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>
237 </p>
240 В настоящее время диалоги помещаются или в позиции мыши (GTK_WIN_POS_MOUSE)
241 или ни в какой предустановленной позиции (GTK_WIN_POS_NONE). В Gnome HID по
242 этой теме ничего не сказано.
243 </p>
246 Настройкой по умолчанию для 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 является
247 GTK_WIN_POS_CENTER_ON_PARENT
248 (<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
249 GtkDialog source</a>).
250 </p>
252 </div>
253 <!-- EDIT12 SECTION "Где размещать диалоговое окно" [10371-11426] -->
254 <h3 class="sectionedit13" id="помещение_диалоговых_окон_перед_их_родительскими_окнами">Помещение диалоговых окон перед их родительскими окнами</h3>
255 <div class="level3">
258 Большинство диалоговых окон размещается перед их родительскими окнами с
259 помощью свойства transient_for (см.
260 <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>). Это свойство должно быть установлено для всех модальных
261 диалоговых окон.
262 </p>
265 Для немодальных диалоговых окон установка свойства transient_for не
266 очевидна. В то время как, например, в gschem диалоговое окно координат
267 должно находиться над родительским окном, окно журнала вешать перед ним
268 нужды нет.
269 </p>
272 <strong>Примечание:</strong> Существует более старый механизм, удерживающий эти окна перед gschem. Если переменная <em>raise-dialog-boxes-on-expose</em> устанавливается в <em>enabled</em> в одном из файлов настроек gschem, она может вызвать проблемы с некоторыми оконными менеджерами.
273 Если диалоговые окна мерцают при 100%-ной загрузке CPU, запретите эту настройку.
274 </p>
275 <pre class="code lisp"><span class="co1">; raise-dialog-boxes-on-expose string</span>
276 <span class="co1">;</span>
277 <span class="co1">; Должны ли диалоговые окна подниматься всякий раз, когда появится</span>
278 <span class="co1">; событие expose</span>
279 <span class="co1">; По умолчанию включено (enabled)</span>
280 <span class="co1">;</span>
281 <span class="co1">;(raise-dialog-boxes-on-expose &quot;enabled&quot;)</span>
282 <span class="br0">&#40;</span>raise-dialog-boxes-on-expose <span class="st0">&quot;disabled&quot;</span><span class="br0">&#41;</span></pre>
284 </div>
285 <!-- EDIT13 SECTION "Помещение диалоговых окон перед их родительскими окнами" [11427-13280] -->
286 <h3 class="sectionedit14" id="порядок_кнопок_в_диалоговых_окнах">Порядок кнопок в диалоговых окнах</h3>
287 <div class="level3">
290 Порядок кнопок внизу диалогового окна зависит от используемой операционной
291 системы. GTK обрабатывает это автоматически, но требует, чтобы разработчики
292 установили альтернативный порядок кнопок. Более подробно об этом написано в
293 документации по GTK
294 <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>.
295 </p>
298 Альтернативный порядок кнопок задаётся только с помощью одного вызова GTK-функции:
299 </p>
300 <pre class="code C"><span class="coMULTI">/* Настройка альтернативного порядка кнопок (ok, no, cancel, help) для других систем */</span>
301 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>
302 GTK_RESPONSE_OK<span class="sy0">,</span>
303 GTK_RESPONSE_NO<span class="sy0">,</span>
304 GTK_RESPONSE_CANCEL<span class="sy0">,</span>
305 GTK_RESPONSE_HELP<span class="sy0">,</span>
306 <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></pre>
309 Это должно быть сделано перед запуском каждого нового создаваемого
310 диалогового окна.
311 </p>
313 </div>
314 <!-- EDIT14 SECTION "Порядок кнопок в диалоговых окнах" [13281-14570] -->
315 <h3 class="sectionedit15" id="дизайн_текущих_диалогов">Дизайн текущих диалогов</h3>
316 <div class="level3">
319 <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>
320 </p>
321 <ul>
322 <li class="level1"><div class="li"> Вокруг всего окна есть некоторое пространство (<em>DIALOG_BORDER_SPACING</em>).</div>
323 </li>
324 <li class="level1"><div class="li"> Некоторый сдвиг для выделения тематической группы (<em>DIALOG_INDENTATION</em>) под её жирным заголовком.</div>
325 </li>
326 <li class="level1"><div class="li"> Вертикальное и горизонтальное разделение производится с помощью <em>DIALOG_H_SPACING</em> и <em>DIALOG_V_SPACING</em>.</div>
327 </li>
328 </ul>
330 </div>
331 <!-- EDIT15 SECTION "Дизайн текущих диалогов" [14571-15122] -->
332 <h3 class="sectionedit16" id="шаблон_исходного_кода_для_простых_диалоговых_окон">Шаблон исходного кода для простых диалоговых окон</h3>
333 <div class="level3">
336 Этот шаблон не предназначен для компиляции, но отсюда легко скопировать
337 нужный вам блок кода.
338 </p>
339 <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>
340 <span class="br0">&#123;</span>
341 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>
342 GtkWidget <span class="sy0">*</span>dialog<span class="sy0">;</span>
343 &nbsp;
344 <span class="coMULTI">/* Создавать диалоговое окно только тогда, когда его ещё нет. Обычно
345 это указатель на виджет в структуре w_current:
346 dialog = w_current-&gt;tewindow */</span>
347 <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>
348 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>
349 <span class="coMULTI">/* родительское окно или NULL */</span>
350 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>
351 <span class="coMULTI">/* свойства диалога */</span>
352 GTK_DIALOG_MODAL<span class="sy0">,</span> <span class="coMULTI">/* 0 для немодальных диалоговых окон */</span>
353 <span class="coMULTI">/* кнопки окна и сигналы ответа */</span>
354 GTK_STOCK_CANCEL<span class="sy0">,</span>
355 GTK_RESPONSE_REJECT<span class="sy0">,</span>
356 GTK_STOCK_OK<span class="sy0">,</span>
357 GTK_RESPONSE_ACCEPT<span class="sy0">,</span>
358 NULL<span class="br0">&#41;</span><span class="sy0">;</span>
359 &nbsp;
360 <span class="coMULTI">/* Настройка альтернативного порядка кнопок (ok, no, cancel, help) для других систем */</span>
361 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>
362 GTK_RESPONSE_OK<span class="sy0">,</span>
363 GTK_RESPONSE_NO<span class="sy0">,</span>
364 GTK_RESPONSE_CANCEL<span class="sy0">,</span>
365 GTK_RESPONSE_HELP<span class="sy0">,</span>
366 <span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span>
367 &nbsp;
368 <span class="coMULTI">/* Установить сигнал ответа по умолчанию. Он обычно вызывается
369 по нажатию &quot;Return&quot; */</span>
370 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>
371 GTK_RESPONSE_ACCEPT<span class="br0">&#41;</span><span class="sy0">;</span>
372 &nbsp;
373 <span class="coMULTI">/* Задать функцию для обработки ответов кнопок и закрытия диалогового окна,
374 для немодальных окон можно также использовать dialog_run().*/</span>
375 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>
376 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>
377 &nbsp;
378 <span class="coMULTI">/* Где размещать диалоговое окно: GTK_WIN_POS_MOUSE или GTK_WIN_POS_NONE */</span>
379 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>
380 &nbsp;
381 <span class="coMULTI">/* Задать расстояние от границы окна и расстояние между элементами по вертикали */</span>
382 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>
383 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>
384 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>
385 &nbsp;
386 <span class="coMULTI">/* Создать метку (со спецразметкой) и упаковать её в диалоговое окно */</span>
387 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>
388 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>
389 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>
390 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>
391 &nbsp;
392 <span class="coMULTI">/* Создать контейнер выравнивания с DIALOG_INDENTATION слева */</span>
393 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>
394 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>
395 DIALOG_INDENTATION<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
396 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>
397 &nbsp;
398 <span class="coMULTI">/* Таблица может содержать несколько записей. Она сохраняется в контейнере выравнивания.
399 Примечание: расстояния между ячейками по вертикали и горизонтали */</span>
400 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>
401 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>
402 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>
403 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>
404 &nbsp;
405 <span class="coMULTI">/* Простая текстовая метка в одной ячейке таблицы с левым выравниванием.
406 Примечание: GTK_FILL в третьей строке обязательно */</span>
407 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>
408 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>
409 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>
410 &nbsp;
411 <span class="coMULTI">/* Простое поле ввода текста завершает ряд опций */</span>
412 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>
413 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>
414 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>
415 &nbsp;
416 <span class="coMULTI">/* ..... ещё строки таблицы с опциями или новые разделы */</span>
417 &nbsp;
418 <span class="coMULTI">/* Создать ссылки на все виджеты, которые потребуются в дальнейшем */</span>
419 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>
420 &nbsp;
421 <span class="coMULTI">/* Показывать все значения рекурсивно */</span>
422 gtk_widget_show_all<span class="br0">&#40;</span>dialog<span class="br0">&#41;</span><span class="sy0">;</span>
423 <span class="br0">&#125;</span>
424 &nbsp;
425 <span class="kw1">else</span> <span class="br0">&#123;</span>
426 <span class="coMULTI">/* Окно уже здесь. Показать его пользователю.
427 Это необходимо только для немодального диалогового окна */</span>
428 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>
429 <span class="br0">&#125;</span>
430 &nbsp;
431 <span class="coMULTI">/* Всегда задавать в диалоговом окне текущие значения
432 Если поместить эту часть в конец функции диалогового окна, это
433 позволит легко создавать диалоги, которые можно будет
434 вызывать, даже если они уже открыты */</span>
435 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>
436 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>
437 <span class="coMULTI">/* Выделение области текста, которую пользовать обычно любит заменять */</span>
438 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> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html"><span class="kw3">strlen</span></a><span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
439 <span class="br0">&#125;</span></pre>
442 Функция ответа для такого диалогового окна может выглядеть так:
443 </p>
444 <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>
445 <span class="br0">&#123;</span>
446 <span class="kw1">switch</span> <span class="br0">&#40;</span>response<span class="br0">&#41;</span> <span class="br0">&#123;</span>
447 <span class="kw1">case</span> GTK_RESPONSE_ACCEPT<span class="sy0">:</span>
448 <span class="coMULTI">/* Применить установки диалогового окна:
449 просто вставьте свой код здесь, если он короткий;
450 или вызовите внешнюю функцию применения, если требуемый код длинный */</span>
451 <span class="kw2">break</span><span class="sy0">;</span>
452 <span class="kw1">case</span> GTK_RESPONSE_REJECT<span class="sy0">:</span>
453 <span class="kw1">case</span> GTK_RESPONSE_DELETE_EVENT<span class="sy0">:</span>
454 <span class="coMULTI">/* Для модальных окон просто ничего не делаем,
455 для немодальных окон, уничтожаем диалог и прибираемся */</span>
456 <span class="kw2">break</span><span class="sy0">;</span>
457 <span class="kw1">default</span><span class="sy0">:</span>
458 <span class="coMULTI">/* Ловим ошибочные сигналы (параноидальная проверка ошибок ;-)) */</span>
459 <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>
460 <span class="br0">&#125;</span>
461 &nbsp;
462 <span class="coMULTI">/* Для немодальных окон просто ничего не делаем,
463 для модальных окон всегда уничтожаем диалог и прибираемся */</span>
464 <span class="br0">&#125;</span></pre>
466 </div>
467 <!-- EDIT16 SECTION "Шаблон исходного кода для простых диалоговых окон" [15123-22207] -->
468 <h3 class="sectionedit17" id="текущие_проблемы_с_диалоговыми_окнами_в_gschem">Текущие проблемы с диалоговыми окнами в gschem</h3>
469 <div class="level3">
470 <ul>
471 <li class="level1"><div class="li"> у каждого диалогового окна свой собственный дизайн</div>
472 </li>
473 <li class="level1"><div class="li"> размещение окон: в позиции мыши или в непредопределённой позиции?</div>
474 </li>
475 <li class="level1"><div class="li"> диалоговые окна не запоминают своего последнего размера, положения и содержимого</div>
476 </li>
477 <li class="level1"><div class="li"> отсутствуют «горячие клавиши»</div>
478 </li>
479 </ul>
482 <strong>Здесь список вещей, которые могли бы быть улучшены:</strong>
483 </p>
485 </div>
487 <h5 id="диалоговое_окно_печати">Диалоговое окно печати</h5>
488 <div class="level5">
489 <ul>
490 <li class="level1"><div class="li"> Изменить дизайн?</div>
491 </li>
492 </ul>
494 </div>
496 <h5 id="сохранение_изображений">Сохранение изображений</h5>
497 <div class="level5">
498 <ul>
499 <li class="level1"><div class="li"> В окне выбора файла отсутствует имя файла по умолчанию, если файл не существует</div>
500 </li>
501 <li class="level1"><div class="li"> Клавиша Return не работает в поле записи имени файла</div>
502 </li>
503 </ul>
505 </div>
507 <h5 id="выполнить_скрипт">Выполнить скрипт</h5>
508 <div class="level5">
509 <ul>
510 <li class="level1"><div class="li"></div>
511 </li>
512 </ul>
514 </div>
516 <h5 id="правка_текста">Правка текста</h5>
517 <div class="level5">
518 <ul>
519 <li class="level1"><div class="li"> отсутствует несколько сочетаний клавиш</div>
520 </li>
521 <li class="level1"><div class="li"> добавить теги *unmodified*, если есть несколько выделенных объектов</div>
522 </li>
523 <li class="level1"><div class="li"> может быть добавить несколько цветных pixbuf для выбора цвета</div>
524 </li>
525 <li class="level1"><div class="li"> может быть заменить выравнивание текста девятью селективными кнопками, переключать кнопки с иконками или …</div>
526 </li>
527 </ul>
529 </div>
531 <h5 id="правка_цвета">Правка цвета</h5>
532 <div class="level5">
533 <ul>
534 <li class="level1"><div class="li"> может быть добавить несколько цветных pixbuf для выбора цвета</div>
535 </li>
536 </ul>
538 </div>
540 <h5 id="свойства_линии">Свойства линии</h5>
541 <div class="level5">
542 <ul>
543 <li class="level1"><div class="li"> отсутствуют «горячие клавиши»</div>
544 </li>
545 <li class="level1"><div class="li"> иконки для типов линии</div>
546 </li>
547 </ul>
549 </div>
551 <h5 id="тип_заполнения">Тип заполнения</h5>
552 <div class="level5">
553 <ul>
554 <li class="level1"><div class="li"> отсутствуют «горячие клавиши»</div>
555 </li>
556 <li class="level1"><div class="li"> иконки для типов заполнения</div>
557 </li>
558 </ul>
560 </div>
562 <h5 id="смещение_символа">Смещение символа</h5>
563 <div class="level5">
564 <ul>
565 <li class="level1"><div class="li"></div>
566 </li>
567 </ul>
569 </div>
571 <h5 id="менеджер_страниц">Менеджер страниц</h5>
572 <div class="level5">
573 <ul>
574 <li class="level1"><div class="li"> неправильный порядок кнопок? Зависит от того, считаете ли вы кнопку обновления основной действующей кнопкой или просто дополнительной кнопкой</div>
575 </li>
576 <li class="level1"><div class="li"> может быть клавиша «Return» должна вызывать обновление</div>
577 </li>
578 </ul>
580 </div>
582 <h5 id="выбор_компонентов">Выбор компонентов</h5>
583 <div class="level5">
584 <ul>
585 <li class="level1"><div class="li"> странный виджет редактирования, когда производится набор текста при выделенном дереве (этот виджет — помощник в поиске, запретить его?!)</div>
586 </li>
587 </ul>
589 </div>
591 <h5 id="редактор_атрибута">Редактор атрибута</h5>
592 <div class="level5">
593 <ul>
594 <li class="level1 node"><div class="li"> некоторые проблемы при выделении нескольких элементов и вызове функции редактирования (ee):</div>
595 <ul>
596 <li class="level3"><div class="li"> если первый объект является текстом, то открывается это диалоговое окно (но с неправильным параметром списка)</div>
597 </li>
598 <li class="level3"><div class="li"> если первый объект является комплексным (complex), то вызывается Правка атрибутов</div>
599 </li>
600 </ul>
601 </li>
602 </ul>
604 </div>
606 <h5 id="правка_атрибутов">Правка атрибутов</h5>
607 <div class="level5">
608 <ul>
609 <li class="level1"><div class="li"></div>
610 </li>
611 </ul>
613 </div>
615 <h5 id="ввод_текста">Ввод текста</h5>
616 <div class="level5">
617 <ul>
618 <li class="level1"><div class="li"></div>
619 </li>
620 </ul>
622 </div>
624 <h5 id="параметры_дуги">Параметры дуги</h5>
625 <div class="level5">
626 <ul>
627 <li class="level1"><div class="li"> Добавить в диалоговое окно диаметр, но выбирать поле ввода начального угла (increment = grid)</div>
628 </li>
629 <li class="level1"><div class="li"> пусть «ee» вызывает диалог, если выделена только одна дуга</div>
630 </li>
631 <li class="level1"><div class="li"> может быть добавить метку раздела</div>
632 </li>
633 </ul>
635 </div>
637 <h5 id="вставка_изображения">Вставка изображения</h5>
638 <div class="level5">
639 <ul>
640 <li class="level1"><div class="li"></div>
641 </li>
642 </ul>
644 </div>
646 <h5 id="замена_изображения">Замена изображения</h5>
647 <div class="level5">
648 <ul>
649 <li class="level1"><div class="li"> новое изображение использует отношение сторон старого</div>
650 </li>
651 <li class="level1"><div class="li"> диалоговое окно имеет много общего с диалоговым окном вставки изображения. Они могли бы совместно использовать общий код</div>
652 </li>
653 </ul>
655 </div>
657 <h5 id="найти_текст">Найти текст...</h5>
658 <div class="level5">
659 <ul>
660 <li class="level1"><div class="li"> манипулирует указателем мыши (может быть виновником является код изменения масштаба). Просто нажать «Return» чтобы вызвать FindNext (найти следующий)</div>
661 </li>
662 <li class="level1"><div class="li"> если вы выбираете поиск по иерархии и найденный текст находится на другой схеме, то имя файла в заголовке окна не обновляется</div>
663 </li>
664 <li class="level1"><div class="li"> может быть добавить опцию: «Выделить все соответствующие выражению текстовые объекты», запретить иерархию для этого случая!</div>
665 </li>
666 <li class="level1"><div class="li"> <img src="images/smileys/fixme.gif" align="middle" alt="FIXME" /> gschem виснет, если это диалоговое окно используется с иерархической схемой, в которой есть циклические зависимости (например, автонумерация тестовой схемы)</div>
667 </li>
668 <li class="level1"><div class="li"> добавить опцию «поиск только в видимом тексте»</div>
669 </li>
670 <li class="level1"><div class="li"> может быть для поиска текста вместо части строки использовать регулярные выражения</div>
671 </li>
672 </ul>
674 </div>
676 <h5 id="скрыть_текст">Скрыть текст...</h5>
677 <div class="level5">
678 <ul>
679 <li class="level1"><div class="li"> использовать регулярные выражения вместо начала строки</div>
680 </li>
681 </ul>
683 </div>
685 <h5 id="показать_текст">Показать текст...</h5>
686 <div class="level5">
687 <ul>
688 <li class="level1"><div class="li"> использовать регулярные выражения вместо начала строки</div>
689 </li>
690 <li class="level1"><div class="li"> может быть объединить это окно с окном «Скрыть текст…»</div>
691 </li>
692 </ul>
694 </div>
696 <h5 id="автонумерация">Автонумерация...</h5>
697 <div class="level5">
698 <ul>
699 <li class="level1"><div class="li"> может быть запретить опцию пропуска, если областью перенумерации является «Выделенные объекты». Другие варианты пропуска («Текущая страница» и «Вся иерархия») чесслово глупые.</div>
700 </li>
701 </ul>
703 </div>
705 <h5 id="размер_текста">Размер текста</h5>
706 <div class="level5">
707 <ul>
708 <li class="level1"><div class="li"></div>
709 </li>
710 </ul>
712 </div>
714 <h5 id="шаг_сетки_привязки">Шаг сетки привязки...</h5>
715 <div class="level5">
716 <ul>
717 <li class="level1"><div class="li"></div>
718 </li>
719 </ul>
721 </div>
723 <h5 id="окно_координат">Окно координат...</h5>
724 <div class="level5">
725 <ul>
726 <li class="level1"><div class="li"> может быть перенести координаты всей рабочей области в панель состояния основного окна?</div>
727 </li>
728 </ul>
730 </div>
732 <h5 id="окно_о_программе">Окно О программе</h5>
733 <div class="level5">
734 <ul>
735 <li class="level1"><div class="li"></div>
736 </li>
737 </ul>
739 </div>
741 <h5 id="горячие_клавиши">Горячие клавиши</h5>
742 <div class="level5">
743 <ul>
744 <li class="level1"><div class="li"></div>
745 </li>
746 </ul>
748 </div>
749 <!-- EDIT17 SECTION "Текущие проблемы с диалоговыми окнами в gschem" [22208-] --><div class="footnotes">
750 <div class="fn"><sup><a href="#fnt__22" id="fn__22" class="fn_bot">22)</a></sup>
751 <div class="content">Здесь и далее в коде всё конечно же должно быть по-английски. — <em>Прим. перев.</em> </div></div>
752 </div>
753 </body>
754 </html>