[gimp] app: fix Wilber's eyes
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: fix Wilber's eyes
- Date: Tue, 3 Apr 2018 07:35:26 +0000 (UTC)
commit bbd79f9d62a5b4ce1066358b2077742113d09e18
Author: Ell <ell_se yahoo com>
Date: Sat Mar 31 21:26:01 2018 -0400
app: fix Wilber's eyes
Commit fd6d4931c8184825d642bfebe69d045ce36f89e7 accidentally
introduced a bug that caused Wilber's eyes to misbehave. This
commit is an attempt to fix this issue. Unfortunately, it seems
like the bug can still be triggered through a certain sequence of
actions...
app/tools/tool_manager.c | 65 ++++++++++++++++++++++++++++++++++++++++
app/widgets/gimpcairo-wilber.c | 34 ++++++++++++++++++++-
app/widgets/gimpcairo-wilber.h | 27 +++++++++-------
3 files changed, 113 insertions(+), 13 deletions(-)
---
diff --git a/app/tools/tool_manager.c b/app/tools/tool_manager.c
index ccc1560..8fcf258 100644
--- a/app/tools/tool_manager.c
+++ b/app/tools/tool_manager.c
@@ -39,6 +39,8 @@
#include "display/gimpdisplay.h"
+#include "widgets/gimpcairo-wilber.h"
+
#include "gimptool.h"
#include "gimptoolcontrol.h"
#include "tool_manager.h"
@@ -81,6 +83,8 @@ static void tool_manager_disconnect_options (GimpToolManager *tool_manager,
GimpContext *user_context,
GimpToolInfo *tool_info);
+static void tool_manager_cast_spell (GimpToolInfo *tool_info);
+
/* public functions */
@@ -714,6 +718,9 @@ tool_manager_tool_changed (GimpContext *user_context,
tool_manager_select_tool (user_context->gimp, new_tool);
g_object_unref (new_tool);
+
+ /* ??? */
+ tool_manager_cast_spell (tool_info);
}
static void
@@ -872,3 +879,61 @@ tool_manager_disconnect_options (GimpToolManager *tool_manager,
gimp_context_set_parent (GIMP_CONTEXT (tool_info->tool_options), NULL);
}
}
+
+static void
+tool_manager_cast_spell (GimpToolInfo *tool_info)
+{
+ typedef struct
+ {
+ const gchar *sequence;
+ GCallback func;
+ } Spell;
+
+ static const Spell spells[] =
+ {
+ { .sequence = "gimp-warp-tool\0"
+ "gimp-iscissors-tool\0"
+ "gimp-blend-tool\0"
+ "gimp-vector-tool\0"
+ "gimp-ellipse-select-tool\0"
+ "gimp-rect-select-tool\0",
+ .func = gimp_cairo_wilber_toggle_pointer_eyes
+ }
+ };
+
+ static const gchar *spell_progress[G_N_ELEMENTS (spells)];
+ const gchar *tool_name;
+ gint i;
+
+ tool_name = gimp_object_get_name (GIMP_OBJECT (tool_info));
+
+ for (i = 0; i < G_N_ELEMENTS (spells); i++)
+ {
+ if (! spell_progress[i])
+ spell_progress[i] = spells[i].sequence;
+
+ while (spell_progress[i])
+ {
+ if (! strcmp (tool_name, spell_progress[i]))
+ {
+ spell_progress[i] += strlen (spell_progress[i]) + 1;
+
+ if (! *spell_progress[i])
+ {
+ spell_progress[i] = NULL;
+
+ spells[i].func ();
+ }
+
+ break;
+ }
+ else
+ {
+ if (spell_progress[i] == spells[i].sequence)
+ spell_progress[i] = NULL;
+ else
+ spell_progress[i] = spells[i].sequence;
+ }
+ }
+ }
+}
diff --git a/app/widgets/gimpcairo-wilber.c b/app/widgets/gimpcairo-wilber.c
index 30fcf7e..74d8b09 100644
--- a/app/widgets/gimpcairo-wilber.c
+++ b/app/widgets/gimpcairo-wilber.c
@@ -48,10 +48,27 @@ static void gimp_cairo_eyes (GtkWidget *widget,
gdouble max_eye_angle);
-static gboolean pointer_eyes = TRUE;
+static gboolean pointer_eyes = FALSE;
+static GSList *cairo_wilber_widgets = NULL;
void
+gimp_cairo_wilber_toggle_pointer_eyes (void)
+{
+ GSList *iter;
+
+ pointer_eyes = ! pointer_eyes;
+
+ for (iter = cairo_wilber_widgets; iter; iter = g_slist_next (iter))
+ {
+ if (pointer_eyes)
+ g_object_set_data (G_OBJECT (iter->data), "wilber-eyes-state", NULL);
+
+ gtk_widget_queue_draw (GTK_WIDGET (iter->data));
+ }
+}
+
+void
gimp_cairo_draw_toolbox_wilber (GtkWidget *widget,
cairo_t *cr)
{
@@ -207,6 +224,13 @@ gimp_cairo_wilber (cairo_t *cr,
}
static void
+gimp_cairo_wilber_weak_notify (gpointer data,
+ GObject *widget)
+{
+ cairo_wilber_widgets = g_slist_remove (cairo_wilber_widgets, widget);
+}
+
+static void
gimp_cairo_wilber_internal (GtkWidget *widget,
cairo_t *cr,
gdouble x,
@@ -224,6 +248,14 @@ gimp_cairo_wilber_internal (GtkWidget *widget,
cairo_restore (cr);
gimp_cairo_eyes (widget, cr, x, y, factor, max_eye_angle);
+
+ if (widget && ! g_slist_find (cairo_wilber_widgets, widget))
+ {
+ cairo_wilber_widgets = g_slist_prepend (cairo_wilber_widgets, widget);
+
+ g_object_weak_ref (G_OBJECT (widget),
+ gimp_cairo_wilber_weak_notify, NULL);
+ }
}
typedef struct
diff --git a/app/widgets/gimpcairo-wilber.h b/app/widgets/gimpcairo-wilber.h
index 72dd592..f4804e1 100644
--- a/app/widgets/gimpcairo-wilber.h
+++ b/app/widgets/gimpcairo-wilber.h
@@ -25,18 +25,21 @@
#define __GIMP_CAIRO_WILBER_H__
-void gimp_cairo_draw_toolbox_wilber (GtkWidget *widget,
- cairo_t *cr);
-void gimp_cairo_draw_drop_wilber (GtkWidget *widget,
- cairo_t *cr,
- gboolean blink);
-
-void gimp_cairo_wilber (cairo_t *cr,
- gdouble x,
- gdouble y);
-void gimp_cairo_wilber_get_size (cairo_t *cr,
- gdouble *width,
- gdouble *height);
+void gimp_cairo_wilber_toggle_pointer_eyes (void);
+
+
+void gimp_cairo_draw_toolbox_wilber (GtkWidget *widget,
+ cairo_t *cr);
+void gimp_cairo_draw_drop_wilber (GtkWidget *widget,
+ cairo_t *cr,
+ gboolean blink);
+
+void gimp_cairo_wilber (cairo_t *cr,
+ gdouble x,
+ gdouble y);
+void gimp_cairo_wilber_get_size (cairo_t *cr,
+ gdouble *width,
+ gdouble *height);
#endif /* __GIMP_CAIRO_WILBER_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]