wacom: show calibration success

by drawing an "emblem-ok-symbolic" icon when calibration is
successful

https://bugzilla.gnome.org/show_bug.cgi?id=668610
This commit is contained in:
Olivier Fourdan 2012-07-05 15:36:10 +02:00 committed by Bastien Nocera
parent 953cc81b0f
commit 1fdfa6bc32

View file

@ -36,6 +36,10 @@
struct CalibArea
{
struct Calib calibrator;
XYinfo axis;
gboolean swap;
gboolean success;
double X[4], Y[4];
int display_width, display_height;
int time_elapsed;
@ -45,6 +49,7 @@ struct CalibArea
guint anim_id;
GtkWidget *window;
GdkPixbuf *icon_success;
FinishCallback callback;
gpointer user_data;
@ -57,6 +62,7 @@ struct CalibArea
/* Timeout parameters */
#define TIME_STEP 100 /* in milliseconds */
#define MAX_TIME 15000 /* 5000 = 5 sec */
#define END_TIME 750 /* 750 = 0.75 sec */
/* Clock appereance */
#define CROSS_LINES 47
@ -70,6 +76,9 @@ struct CalibArea
#define HELP_TEXT_TITLE N_("Screen Calibration")
#define HELP_TEXT_MAIN N_("Please tap the target markers as they appear on screen to calibrate the tablet.")
#define ICON_SUCCESS "emblem-ok-symbolic"
#define ICON_SIZE 300
static void
set_display_size(CalibArea *calib_area,
int width,
@ -114,6 +123,27 @@ resize_display(CalibArea *calib_area)
}
}
static void
draw_success_icon (CalibArea *area, cairo_t *cr)
{
GtkWidget *widget;
GtkStyleContext *context;
gint icon_width, icon_height;
gdouble x;
gdouble y;
widget = GTK_WIDGET (area->window);
context = gtk_widget_get_style_context (widget);
icon_width = gdk_pixbuf_get_width (area->icon_success);
icon_height = gdk_pixbuf_get_height (area->icon_success);
x = (area->display_width - icon_width) / 2;
y = (area->display_height - icon_height) / 2;
gtk_render_icon (context, cr, area->icon_success, x, y);
}
static void
draw(GtkWidget *widget, cairo_t *cr, gpointer data)
{
@ -135,6 +165,12 @@ draw(GtkWidget *widget, cairo_t *cr, gpointer data)
cairo_paint (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
/* If calibration is successful, just draw the tick */
if (calib_area->icon_success) {
draw_success_icon (calib_area, cr);
return;
}
/* Print the help lines */
layout = pango_layout_new (gtk_widget_get_pango_context (widget));
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
@ -256,6 +292,53 @@ on_delete_event (GtkWidget *widget,
return TRUE;
}
static gboolean
draw_success_end_wait_callback (CalibArea *area)
{
on_delete_event (NULL, NULL, area);
return FALSE;
}
static void
set_calibration_status (CalibArea *area)
{
GtkIconTheme *icon_theme;
GtkIconInfo *icon_info;
GdkRGBA white;
icon_theme = gtk_icon_theme_get_default ();
icon_info = gtk_icon_theme_lookup_icon (icon_theme,
ICON_SUCCESS,
ICON_SIZE,
GTK_ICON_LOOKUP_USE_BUILTIN);
if (icon_info == NULL) {
g_warning ("Failed to find icon \"%s\"", ICON_SUCCESS);
goto out;
}
gdk_rgba_parse (&white, "White");
area->icon_success = gtk_icon_info_load_symbolic (icon_info,
&white,
NULL,
NULL,
NULL,
NULL,
NULL);
gtk_icon_info_free (icon_info);
if (!area->icon_success)
g_warning ("Failed to load icon \"%s\"", ICON_SUCCESS);
out:
area->success = finish (&area->calibrator, &area->axis, &area->swap);
if (area->success && area->icon_success) {
redraw(area);
g_timeout_add(END_TIME, (GSourceFunc) draw_success_end_wait_callback, area);
} else {
on_delete_event (NULL, NULL, area);
}
}
static gboolean
on_button_press_event(GtkWidget *widget,
GdkEventButton *event,
@ -263,6 +346,9 @@ on_button_press_event(GtkWidget *widget,
{
gboolean success;
if (area->success)
return FALSE;
/* Handle click */
area->time_elapsed = 0;
success = add_click(&area->calibrator, (int)event->x_root, (int)event->y_root);
@ -275,7 +361,7 @@ on_button_press_event(GtkWidget *widget,
/* Are we done yet? */
if (area->calibrator.num_clicks >= 4)
{
on_delete_event (widget, NULL, area);
set_calibration_status (area);
return FALSE;
}
@ -290,6 +376,8 @@ on_key_release_event(GtkWidget *widget,
GdkEventKey *event,
CalibArea *area)
{
if (area->success)
return FALSE;
if (event->type != GDK_KEY_RELEASE)
return FALSE;
if (event->keyval != GDK_KEY_Escape)
@ -305,6 +393,9 @@ on_focus_out_event (GtkWidget *widget,
GdkEvent *event,
CalibArea *area)
{
if (area->success)
return FALSE;
/* If the calibrator window looses focus, simply bail out... */
on_delete_event (widget, NULL, area);
@ -319,7 +410,7 @@ on_timer_signal(CalibArea *area)
area->time_elapsed += TIME_STEP;
if (area->time_elapsed > MAX_TIME)
{
on_delete_event (NULL, NULL, area);
set_calibration_status (area);
return FALSE;
}
@ -440,13 +531,12 @@ calib_area_finish (CalibArea *area,
XYinfo *new_axis,
gboolean *swap_xy)
{
gboolean success;
g_return_val_if_fail (area != NULL, FALSE);
success = finish (&area->calibrator, new_axis, swap_xy);
*new_axis = area->axis;
*swap_xy = area->swap;
if (success)
if (area->success)
g_debug ("Final calibration: %d, %d, %d, %d\n",
new_axis->x_min,
new_axis->y_min,
@ -455,7 +545,7 @@ calib_area_finish (CalibArea *area,
else
g_debug ("Calibration was aborted or timed out");
return success;
return area->success;
}
void
@ -467,6 +557,10 @@ calib_area_free (CalibArea *area)
g_source_remove (area->anim_id);
area->anim_id = 0;
}
if (area->icon_success)
g_object_unref (area->icon_success);
gtk_widget_destroy (area->window);
g_free (area);
}