/*! \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; }
static gboolean gul_gestures_mouse_release_cb (GtkWidget *widget, GdkEventButton *e, GulGestures *as) { char sequence[STROKE_MAX_SEQUENCE + 1]; g_object_ref (as); /* ungrab and disconnect */ gul_gestures_stop (as); /* handle gestures */ if (!stroke_trans (sequence) == TRUE) { strcpy(sequence, "5"); /* fake a 'nothing' move, to bring up the menu */ } g_signal_emit (as, GulGesturesSignals[GUL_GESTURES_GESTURE_PERFORMED], 0, sequence); g_object_unref (as); return TRUE; }