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
42 #include "../include/prototype.h"
44 #ifdef HAVE_LIBDMALLOC
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
53 static TOPLEVEL
*toplevel_head
= NULL
;
55 /*! \todo Finish function documentation!!!
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!!!
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;
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;
120 toplevel
->height
= 1;
121 toplevel
->image_width
= 0;
122 toplevel
->image_height
= 0;
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
;
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
;
465 /*! \todo Finish function documentation!!!
467 * \par Function Description
470 void s_toplevel_delete (TOPLEVEL
*toplevel
)
472 if (toplevel
->auto_save_timeout
!= 0) {
474 ret
= g_source_remove (toplevel
->auto_save_timeout
);
478 if (toplevel
->wid
== -1) {
479 /* do no delete head */
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
);
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
;