/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_box_invalidate_rubber (GSCHEM_TOPLEVEL *w_current) { int x1, y1, x2, y2; WORLDtoSCREEN (w_current, w_current->first_wx, w_current->first_wy, &x1, &y1); WORLDtoSCREEN (w_current, w_current->second_wx, w_current->second_wy, &x2, &y2); o_invalidate_rect (w_current, x1, y1, x2, y1); o_invalidate_rect (w_current, x1, y1, x1, y2); o_invalidate_rect (w_current, x2, y1, x2, y2); o_invalidate_rect (w_current, x1, y2, x2, y2); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_net_invalidate_rubber (GSCHEM_TOPLEVEL *w_current) { TOPLEVEL *toplevel = w_current->toplevel; int size = 0, magnetic_halfsize; int bloat; int magnetic_x, magnetic_y; int first_x, first_y, third_x, third_y, second_x, second_y; int x1, y1, x2, y2; WORLDtoSCREEN (w_current, w_current->magnetic_wx, w_current->magnetic_wy, &magnetic_x, &magnetic_y); WORLDtoSCREEN (w_current, w_current->first_wx, w_current->first_wy, &first_x, &first_y); WORLDtoSCREEN (w_current, w_current->third_wx, w_current->third_wy, &third_x, &third_y); WORLDtoSCREEN (w_current, w_current->second_wx, w_current->second_wy, &second_x, &second_y); if (toplevel->net_style == THICK) { size = SCREENabs (w_current, NET_WIDTH); } size = max (size, 0); bloat = size / 2; if (w_current->magneticnet_mode) { if (w_current->magnetic_wx != -1 && w_current->magnetic_wy != -1) { magnetic_halfsize = max (4 * size, MAGNETIC_HALFSIZE); o_invalidate_rect (w_current, magnetic_x - magnetic_halfsize, magnetic_y - magnetic_halfsize, magnetic_x + magnetic_halfsize, magnetic_y + magnetic_halfsize); } } x1 = min (first_x, second_x) - bloat; x2 = max (first_x, second_x) + bloat; y1 = min (first_y, second_y) - bloat; y2 = max (first_y, second_y) + bloat; o_invalidate_rect (w_current, x1, y1, x2, y2); x1 = min (second_x, third_x) - bloat; x2 = max (second_x, third_x) + bloat; y1 = min (second_y, third_y) - bloat; y2 = max (second_y, third_y) + bloat; o_invalidate_rect (w_current, x1, y1, x2, y2); }
/*! \brief Invalidate bounding box or outline for OBJECT placement * * \par Function Description * This function invalidates the bounding box where objects would be * drawn by o_place_draw_rubber() * * The function applies manhatten mode constraints to the coordinates * before drawing if the CONTROL key is recording as being pressed in * the w_current structure. * * The "drawing" parameter is used to indicate if this drawing should * immediately use the selected feedback mode and positioning constraints. * * With drawing=TRUE, the selected conditions are used immediately, * otherwise the conditions from the last drawing operation are used, * saving the new state for next time. * * This function should be called with drawing=TRUE when starting a * rubberbanding operation and when otherwise refreshing the rubberbanded * outline (e.g. after a screen redraw). For any undraw operation, should * be called with drawing=FALSE, ensuring that the undraw XOR matches the * mode and constraints of the corresponding "draw" operation. * * If any mode / constraint changes are made between a undraw, redraw XOR * pair, the latter (draw) operation must be called with drawing=TRUE. If * no mode / constraint changes were made between the pair, it is not * harmful to call the draw operation with "drawing=FALSE". * * \param [in] w_current GSCHEM_TOPLEVEL which we're drawing for. * \param [in] drawing Set to FALSE for undraw operations to ensure * matching conditions to a previous draw operation. */ void o_place_invalidate_rubber (GSCHEM_TOPLEVEL *w_current, int drawing) { TOPLEVEL *toplevel = w_current->toplevel; int diff_x, diff_y; int left, top, bottom, right; int s_left, s_top, s_bottom, s_right; g_return_if_fail (toplevel->page_current->place_list != NULL); /* If drawing is true, then don't worry about the previous drawing * method and movement constraints, use with the current settings */ if (drawing) { /* Ensure we set this to flag there is "something" supposed to be * drawn when the invaliate call below causes an expose event. */ w_current->last_drawb_mode = w_current->actionfeedback_mode; w_current->drawbounding_action_mode = (w_current->CONTROLKEY) ? CONSTRAINED : FREE; } /* Calculate delta of X-Y positions from buffer's origin */ diff_x = w_current->second_wx - w_current->first_wx; diff_y = w_current->second_wy - w_current->first_wy; /* Adjust the coordinates according to the movement constraints */ /* Need to update the w_current->{first,second}_w{x,y} coords even * though we're only invalidating because the move rubberband code * (which may execute right after this function) expects these * coordinates to be correct. */ if (w_current->drawbounding_action_mode == CONSTRAINED) { if (abs (diff_x) >= abs (diff_y)) { w_current->second_wy = w_current->first_wy; diff_y = 0; } else { w_current->second_wx = w_current->first_wx; diff_x = 0; } } /* Find the bounds of the drawing to be done */ world_get_object_glist_bounds (toplevel, toplevel->page_current->place_list, &left, &top, &right, &bottom); WORLDtoSCREEN (w_current, left + diff_x, top + diff_y, &s_left, &s_top); WORLDtoSCREEN (w_current, right + diff_x, bottom + diff_y, &s_right, &s_bottom); o_invalidate_rect (w_current, s_left, s_top, s_right, s_bottom); }
/*! \brief Evaluates the stroke. * \par Function Description * This function transforms the stroke input so far in an action. * * It makes use of the guile procedure <B>eval-stroke</B> to evaluate * the stroke sequence into a possible action. The mouse footprint is * erased in this function. * * It returns 1 if the stroke has been successfully evaluated as an * action. It returns 0 if libstroke failed to transform the stroke * or there is no action attached to the stroke. * * \param [in] w_current The GschemToplevel object. * \returns 1 on success, 0 otherwise. */ gint x_stroke_translate_and_execute (GschemToplevel *w_current) { gchar sequence[STROKE_MAX_SEQUENCE]; StrokePoint *point; int min_x, min_y, max_x, max_y; guint i; g_assert (stroke_points != NULL); if (stroke_points->len == 0) return 0; point = &g_array_index (stroke_points, StrokePoint, 0); min_x = max_x = point->x; min_y = max_y = point->y; for (i = 1; i < stroke_points->len; i++) { point = &g_array_index (stroke_points, StrokePoint, i); min_x = MIN (min_x, point->x); min_y = MIN (min_y, point->y); max_x = MAX (max_x, point->x); max_y = MAX (max_y, point->y); } o_invalidate_rect (w_current, min_x, min_y, max_x + 1, max_y + 1); /* resets length of array */ stroke_points->len = 0; /* try evaluating stroke */ if (stroke_trans ((char*)&sequence)) { gchar *guile_string = g_strdup_printf("(eval-stroke \"%s\")", sequence); SCM ret; scm_dynwind_begin ((scm_t_dynwind_flags) 0); scm_dynwind_unwind_handler (g_free, guile_string, SCM_F_WIND_EXPLICITLY); ret = g_scm_c_eval_string_protected (guile_string); scm_dynwind_end (); return (SCM_NFALSEP (ret)); } return 0; }
/*! \brief Evaluates the stroke. * \par Function Description * This function transforms the stroke input so far in an action. * * It makes use of the guile procedure <B>eval-stroke</B> to evaluate * the stroke sequence into a possible action. The mouse footprint is * erased in this function. * * It returns 1 if the stroke has been successfully evaluated as an * action. It returns 0 if libstroke failed to transform the stroke * or there is no action attached to the stroke. * * \param [in] w_current The GSCHEM_TOPLEVEL object. * \returns 1 on success, 0 otherwise. */ gint x_stroke_translate_and_execute (GSCHEM_TOPLEVEL *w_current) { gchar sequence[STROKE_MAX_SEQUENCE]; StrokePoint *point; int min_x, min_y, max_x, max_y; gint i; g_assert (stroke_points != NULL); if (stroke_points->len == 0) return 0; point = &g_array_index (stroke_points, StrokePoint, 0); min_x = max_x = point->x; min_y = max_y = point->y; for (i = 1; i < stroke_points->len; i++) { point = &g_array_index (stroke_points, StrokePoint, i); min_x = min (min_x, point->x); min_y = min (min_y, point->y); max_x = max (max_x, point->x); max_y = max (max_y, point->y); } o_invalidate_rect (w_current, min_x, min_y, max_x + 1, max_y + 1); /* resets length of array */ stroke_points->len = 0; /* try evaluating stroke */ if (stroke_trans ((char*)&sequence)) { gchar *guile_string = g_strdup_printf("(eval-stroke \"%s\")", sequence); SCM ret; ret = g_scm_c_eval_string_protected (guile_string); g_free (guile_string); return (SCM_NFALSEP (ret)); } return 0; }
/*! \todo Finish function documentation!!! * \brief * \par Function Description * */ void o_net_invalidate_rubber (GschemToplevel *w_current) { int size = 0, magnetic_halfsize; int magnetic_x, magnetic_y; gboolean magnetic_net_mode; g_return_if_fail (w_current != NULL); GschemPageView *page_view = gschem_toplevel_get_current_page_view (w_current); g_return_if_fail (page_view != NULL); gschem_page_view_WORLDtoSCREEN (page_view, w_current->magnetic_wx, w_current->magnetic_wy, &magnetic_x, &magnetic_y); size = gschem_page_view_SCREENabs (page_view, NET_WIDTH); magnetic_net_mode = gschem_options_get_magnetic_net_mode (w_current->options); if (magnetic_net_mode) { if (w_current->magnetic_wx != -1 && w_current->magnetic_wy != -1) { magnetic_halfsize = max (4 * size, MAGNETIC_HALFSIZE); o_invalidate_rect (w_current, magnetic_x - magnetic_halfsize, magnetic_y - magnetic_halfsize, magnetic_x + magnetic_halfsize, magnetic_y + magnetic_halfsize); } } gschem_page_view_invalidate_world_rect (page_view, w_current->first_wx, w_current->first_wy, w_current->second_wx, w_current->second_wy); gschem_page_view_invalidate_world_rect (page_view, w_current->second_wx, w_current->second_wy, w_current->third_wx, w_current->third_wy); }
/*! \todo Finish function documentation!!! * \brief * \par Function Description */ void o_pin_invalidate_rubber (GSCHEM_TOPLEVEL *w_current) { TOPLEVEL *toplevel = w_current->toplevel; int x1, y1, x2, y2; int min_x, min_y, max_x, max_y; int bloat = 0; WORLDtoSCREEN (w_current, w_current->first_wx, w_current->first_wy, &x1, &y1); WORLDtoSCREEN (w_current, w_current->second_wx, w_current->second_wy, &x2, &y2); /* Pins are always first created as net pins, use net pin width */ if (toplevel->net_style == THICK ) { bloat = SCREENabs (w_current, PIN_WIDTH_NET) / 2; } min_x = min (x1, x2) - bloat; max_x = max (x1, x2) + bloat; min_y = min (y1, y2) - bloat; max_y = max (y1, y2) + bloat; o_invalidate_rect (w_current, min_x, min_y, max_x, max_y); }