Implemented the ability to change the color of junctions (code for #1746675).
[geda-gaf.git] / libgeda / src / s_toplevel.c
blob8acadd79fe5fdd6b1e7cc0d6629fd0d8c5a5398d
1 /* gEDA - GPL Electronic Design Automation
2 * libgeda - gEDA's library
3 * Copyright (C) 1998, 1999, 2000 Kazu Hirata / Ales Hvezda
4 * Copyright (C) 1998-2007 Ales Hvezda
5 * Copyright (C) 1998-2007 gEDA Contributors (see ChangeLog for details)
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
21 #include <config.h>
23 #include <stdio.h>
24 #ifdef HAVE_STRING_H
25 #include <string.h>
26 #endif
27 #ifdef HAVE_STRARG_H
28 #include <stdarg.h>
29 #endif
30 #ifdef HAVE_STDLIB_H
31 #include <stdlib.h>
32 #endif
34 #include <gtk/gtk.h>
35 #include <libguile.h>
37 #include "defines.h"
38 #include "struct.h"
39 #include "globals.h"
40 #include "funcs.h"
42 #include "../include/prototype.h"
44 #ifdef HAVE_LIBDMALLOC
45 #include <dmalloc.h>
46 #endif
48 /* global_wid always increments, it needs to be unique per run */
49 static int global_wid = 0;
51 /* head pointer to toplevel structure, this points to all the toplevels that
52 currently exist */
53 static TOPLEVEL *toplevel_head = NULL;
55 /*! \todo Finish function documentation!!!
56 * \brief
57 * \par Function Description
60 void s_toplevel_init (void)
62 toplevel_head = (TOPLEVEL*)g_new (TOPLEVEL, 1);
63 toplevel_head->wid = -1;
64 toplevel_head->next = NULL;
65 toplevel_head->prev = NULL;
68 /*! \todo Finish function documentation!!!
69 * \brief
70 * \par Function Description
73 TOPLEVEL *s_toplevel_new (void)
75 TOPLEVEL *toplevel, *tmp;
77 toplevel = (TOPLEVEL*)g_new (TOPLEVEL, 1);
79 toplevel->wid = global_wid++;
81 toplevel->num_untitled = 0;
83 toplevel->start_x = -1;
84 toplevel->start_y = -1;
85 toplevel->save_x = -1;
86 toplevel->save_y = -1;
87 toplevel->last_x = -1;
88 toplevel->last_y = -1;
89 toplevel->loc_x = -1;
90 toplevel->loc_y = -1;
91 toplevel->distance = -1;
93 toplevel->current_attribute = NULL;
95 toplevel->current_visible = -1; /* not sure on these */
96 toplevel->current_show = -1;
98 toplevel->internal_symbol_name = NULL;
100 toplevel->RC_list = NULL;
102 toplevel->series_name = NULL;
103 toplevel->untitled_name = NULL;
104 toplevel->font_directory = NULL;
105 toplevel->scheme_directory = NULL;
106 toplevel->bitmap_directory = NULL;
108 toplevel->event_state = -1;
110 toplevel->inside_action = 0;
111 toplevel->rotated_inside = 0;
113 toplevel->init_left = 0;
114 toplevel->init_top = 0;
115 /* init_right and _bottom are set before this function is called */
117 toplevel->win_width = 0;
118 toplevel->win_height = 0;
119 toplevel->width = 1;
120 toplevel->height = 1;
121 toplevel->image_width = 0;
122 toplevel->image_height = 0;
123 toplevel->snap = 1;
124 toplevel->grid = 1;
125 toplevel->min_zoom = 0;
126 toplevel->max_zoom = 8;
128 toplevel->starting_width = 0;
130 toplevel->text_alignment = 0;
132 toplevel->line_type = 0;
134 toplevel->fill_type = 0;
136 toplevel->override_color = -1;
137 toplevel->inside_redraw = 0;
138 toplevel->window_aspectratio = 0;
139 toplevel->display_height = 0;
140 toplevel->display_width = 0;
142 toplevel->DONT_DRAW_CONN = 0;
143 toplevel->DONT_RESIZE = 0;
144 toplevel->DONT_EXPOSE = 0;
145 toplevel->DONT_REDRAW = 0;
146 toplevel->DONT_RECALC = 0;
147 toplevel->FORCE_CONN_UPDATE = 0;
148 toplevel->ADDING_SEL = 0;
149 toplevel->REMOVING_SEL = 0;
151 toplevel->drawbounding_action_mode = FREE;
152 toplevel->last_drawb_mode = -1;
154 toplevel->CONTROLKEY = 0;
155 toplevel->SHIFTKEY = 0;
156 toplevel->ALTKEY = 0;
158 toplevel->doing_pan = 0;
160 /* Put head node on page list... */
161 toplevel->page_head = NULL;
162 s_page_init_list (toplevel);
163 toplevel->page_current = NULL;
165 toplevel->buffer_number = 0;
167 toplevel->show_hidden_text = 0;
169 toplevel->complex_rotate = 0;
171 toplevel->last_callback = NULL;
172 toplevel->cwd = NULL;
174 toplevel->major_changed_refdes = NULL;
176 toplevel->main_window = NULL;
177 toplevel->drawing_area = NULL;
178 toplevel->menubar = NULL;
179 toplevel->popup_menu = NULL;
180 toplevel->h_scrollbar = NULL;
181 toplevel->v_scrollbar = NULL;
182 toplevel->h_adjustment = NULL;
183 toplevel->v_adjustment = NULL;
184 toplevel->left_label = NULL;
185 toplevel->middle_label = NULL;
186 toplevel->right_label = NULL;
187 toplevel->filename_label = NULL;
188 toplevel->grid_label = NULL;
189 toplevel->status_label = NULL;
191 toplevel->toolbar_select = NULL;
192 toplevel->toolbar_net = NULL;
193 toplevel->toolbar_bus = NULL;
194 toplevel->toolbar_edit = NULL;
195 toplevel->toolbar_move = NULL;
196 toplevel->toolbar_copy = NULL;
197 toplevel->toolbar_delete = NULL;
198 toplevel->toolbar_rotate = NULL;
199 toplevel->toolbar_mirror = NULL;
201 toplevel->fowindow = NULL;
202 toplevel->fswindow = NULL;
203 toplevel->sowindow = NULL;
204 toplevel->saveas_flag = 0;
206 toplevel->aswindow = NULL;
207 toplevel->attr_list = NULL;
208 toplevel->asentry_name = NULL;
209 toplevel->asentry_value = NULL;
211 toplevel->cswindow = NULL;
212 toplevel->clib_list = NULL;
213 toplevel->basename_list = NULL;
215 /* toplevel->fileselect */
217 toplevel->iwindow = NULL;
218 toplevel->ifilename_entry = NULL;
220 toplevel->pswindow = NULL;
222 toplevel->tiwindow = NULL;
223 toplevel->tewindow = NULL;
224 toplevel->teentry = NULL;
225 toplevel->ltwindow = NULL;
226 toplevel->ftwindow = NULL;
227 toplevel->sewindow = NULL;
228 toplevel->seentry = NULL;
229 toplevel->exwindow = NULL;
230 toplevel->aawindow = NULL;
231 toplevel->mawindow = NULL;
232 toplevel->aewindow = NULL;
233 toplevel->aaentry_start = NULL;
234 toplevel->aaentry_sweep = NULL;
235 toplevel->trwindow = NULL;
236 toplevel->trentry = NULL;
237 toplevel->tswindow = NULL;
238 toplevel->tshowwindow = NULL;
239 toplevel->thidewindow = NULL;
240 toplevel->tfindwindow = NULL;
241 toplevel->tsentry = NULL;
243 toplevel->abwindow = NULL;
244 toplevel->hkwindow = NULL;
245 toplevel->cowindow = NULL;
246 toplevel->coord_world = NULL;
247 toplevel->coord_screen = NULL;
249 toplevel->pfswindow = NULL;
250 toplevel->pcfswindow = NULL;
252 toplevel->current_pixbuf = NULL;
253 toplevel->pixbuf_filename = NULL;
254 toplevel->pixbuf_wh_ratio = 0;
256 toplevel->clwindow = NULL;
257 toplevel->edit_color = 0;
259 toplevel->window = NULL;
261 toplevel->gc = NULL;
262 toplevel->xor_gc = NULL;
263 toplevel->outline_xor_gc = NULL;
264 toplevel->bounding_xor_gc = NULL;
265 toplevel->bus_gc = NULL;
267 toplevel->keyaccel_string = NULL;
269 toplevel->backingstore = NULL;
271 toplevel->graphic_color = 0;
272 toplevel->pin_color = 0;
273 toplevel->text_color = 0;
275 toplevel->logic_bubble_color = 0;
276 toplevel->zoom_box_color = 0;
277 toplevel->text_caps = 0;
278 toplevel->attribute_color = 0;
279 toplevel->detachedattr_color = 0;
280 toplevel->text_size = 0;
282 toplevel->snap_size = 100;
284 toplevel->grid_color = 0;
285 toplevel->background_color = 0;
286 toplevel->select_color = 0;
287 toplevel->bb_color = 0;
288 toplevel->lock_color = 0;
289 toplevel->net_endpoint_color = 0;
290 toplevel->junction_color = 0;
291 toplevel->net_color = 0;
292 toplevel->bus_color = 0;
293 toplevel->override_net_color = -1;
294 toplevel->override_bus_color = -1;
295 toplevel->override_pin_color = -1;
296 toplevel->pin_style = 0;
297 toplevel->net_style = 0;
298 toplevel->bus_style = 0;
299 toplevel->line_style = 0;
300 toplevel->zoom_with_pan = 0;
302 toplevel->actionfeedback_mode = OUTLINE;
304 toplevel->text_feedback = 0;
306 toplevel->text_display_zoomfactor = 0;
308 toplevel->net_endpoint_mode = NONE;
310 toplevel->net_midpoint_mode = NONE;
312 toplevel->object_clipping = 0;
314 toplevel->embed_complex = 0;
316 toplevel->include_complex = 0;
318 toplevel->text_output = 0;
320 toplevel->scrollbars_flag = 0;
322 toplevel->print_orientation = 0;
324 toplevel->image_color = FALSE;
326 toplevel->print_color = FALSE;
328 toplevel->print_color_background = 0;
330 toplevel->setpagedevice_orientation = FALSE;
332 toplevel->setpagedevice_pagesize = FALSE;
334 toplevel->postscript_prolog = NULL;
335 toplevel->postscript_font_scale = 1.0;
337 toplevel->stroke_color = 0;
339 toplevel->log_window = 0;
341 toplevel->log_window_type = 0;
343 toplevel->third_button = 0;
345 toplevel->middle_button = 0;
347 toplevel->net_consolidate = FALSE;
349 toplevel->file_preview = 0;
351 toplevel->enforce_hierarchy = 0;
353 toplevel->text_origin_marker = 0;
355 toplevel->fast_mousepan = 0;
357 toplevel->raise_dialog_boxes = 0;
359 /* The following is an attempt at getting (deterministic) defaults */
360 /* for the following variables */
361 toplevel->attribute_promotion = FALSE;
362 toplevel->promote_invisible = FALSE;
363 toplevel->keep_invisible = FALSE;
365 toplevel->continue_component_place = 0;
367 toplevel->undo_levels = 0;
369 toplevel->undo_control = 0;
371 toplevel->undo_type = 0;
373 toplevel->draw_grips = 0;
375 toplevel->netconn_rubberband = 0;
377 toplevel->sort_component_library = 0;
379 toplevel->warp_cursor = 0;
381 toplevel->toolbars = 0;
383 toplevel->handleboxes = 0;
385 toplevel->print_output_type = 0;
387 toplevel->print_output_capstyle = BUTT_CAP;
389 toplevel->image_output_type = 0;
391 toplevel->paper_width = 0;
392 toplevel->paper_height = 0;
394 toplevel->bus_ripper_size = 0;
396 toplevel->bus_ripper_type = 0;
398 toplevel->bus_ripper_symname = NULL;
400 toplevel->bus_ripper_rotation = 0;
402 toplevel->force_boundingbox = FALSE;
404 toplevel->grid_dot_size = 1;
405 toplevel->grid_mode = GRID_VARIABLE_MODE;
406 toplevel->grid_fixed_threshold = 10;
408 toplevel->print_vector_threshold = 3;
410 toplevel->add_attribute_offset = 50;
412 toplevel->drag_can_move = TRUE;
414 toplevel->always_promote_attributes = NULL;
416 toplevel->mousepan_gain = 5;
417 toplevel->keyboardpan_gain = 10;
419 toplevel->print_command = NULL;
421 toplevel->select_slack_pixels = 4;
423 toplevel->net_naming_priority = 0;
424 toplevel->hierarchy_traversal = 0;
425 toplevel->hierarchy_uref_mangle = 0;
426 toplevel->hierarchy_netname_mangle = 0;
427 toplevel->hierarchy_netattrib_mangle = 0;
428 toplevel->hierarchy_uref_separator = NULL;
429 toplevel->hierarchy_netname_separator = NULL;
430 toplevel->hierarchy_netattrib_separator = NULL;
431 toplevel->hierarchy_netattrib_order = 0;
432 toplevel->hierarchy_netname_order = 0;
433 toplevel->hierarchy_uref_order = 0;
434 toplevel->unnamed_netname = NULL;
436 /* Auto-save interval */
437 toplevel->auto_save_interval = 0;
438 toplevel->auto_save_timeout = 0;
440 /* set the rest of the variables */
441 if (variable_set_func) {
442 (*variable_set_func) (toplevel);
446 /* disable the events */
447 toplevel->DONT_DRAW_CONN = 1;
448 toplevel->DONT_RESIZE = 1;
449 toplevel->DONT_EXPOSE = 1;
450 toplevel->DONT_RECALC = 1;
451 toplevel->DONT_REDRAW = 1;
454 /* now append toplevel to this list: */
455 /* - find the tail of the toplevel list */
456 for (tmp = toplevel_head; tmp->next != NULL; tmp = tmp->next);
457 /* - link toplevel with tmp */
458 tmp->next = toplevel;
459 toplevel->prev = tmp;
460 toplevel->next = NULL;
462 return toplevel;
465 /*! \todo Finish function documentation!!!
466 * \brief
467 * \par Function Description
470 void s_toplevel_delete (TOPLEVEL *toplevel)
472 if (toplevel->auto_save_timeout != 0) {
473 gboolean ret;
474 ret = g_source_remove (toplevel->auto_save_timeout);
475 g_assert (ret);
478 if (toplevel->wid == -1) {
479 /* do no delete head */
480 return;
483 g_free (toplevel->internal_symbol_name);
485 g_free (toplevel->series_name);
486 g_free (toplevel->untitled_name);
487 g_free (toplevel->font_directory);
488 g_free (toplevel->scheme_directory);
489 g_free (toplevel->bitmap_directory);
490 g_free (toplevel->bus_ripper_symname);
491 g_free (toplevel->print_command);
493 /* free all fonts */
494 /* if you close a window, then you free the font set... */
495 /* this is probably a bad idea... */
496 /* The font set can ONLY be freed when exiting!!! */
497 /* o_text_freeallfonts (toplevel); */
499 /* delete all pages */
500 s_page_delete_list (toplevel);
502 /* unlink toplevel from toplevel list */
503 toplevel->prev->next = toplevel->next;
504 if (toplevel->next != NULL) {
505 toplevel->next->prev = toplevel->prev;
508 g_free (toplevel);