From 902956ca0d1e0cd3ee7b1a73b24928f20795db40 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 4 Aug 2009 09:48:15 -0400 Subject: [PATCH] lookingGlass: Draw a red border around target actor --- js/ui/lookingGlass.js | 13 +++++++++++++ src/shell-drawing.c | 35 +++++++++++++++++++++++++++++++++++ src/shell-drawing.h | 2 ++ 3 files changed, 50 insertions(+) diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js index df8065041..0f6b7cb0c 100644 --- a/js/ui/lookingGlass.js +++ b/js/ui/lookingGlass.js @@ -230,6 +230,14 @@ LookingGlass.prototype = { let displayText = new Clutter.Text({ color: MATRIX_GREEN, font_name: MATRIX_FONT, text: '' }); eventHandler.append(displayText, Big.BoxPackFlags.EXPAND); + + let borderPaintTarget = null; + let borderPaintId = null; + eventHandler.connect('destroy', Lang.bind(this, function() { + if (borderPaintTarget != null) + borderPaintTarget.disconnect(borderPaintId); + })); + eventHandler.connect('button-press-event', Lang.bind(this, function (actor, event) { let global = Shell.Global.get(); Clutter.ungrab_pointer(eventHandler); @@ -246,6 +254,7 @@ LookingGlass.prototype = { global.stage.set_key_focus(this._entry); return true; })); + eventHandler.connect('motion-event', Lang.bind(this, function (actor, event) { let global = Shell.Global.get(); let [stageX, stageY] = event.get_coords(); @@ -253,6 +262,10 @@ LookingGlass.prototype = { stageX, stageY); displayText.text = ' ' + target; + if (borderPaintTarget != null) + borderPaintTarget.disconnect(borderPaintId); + borderPaintTarget = target; + borderPaintId = Shell.add_hook_paint_red_border(target); return true; })); Clutter.grab_pointer(eventHandler); diff --git a/src/shell-drawing.c b/src/shell-drawing.c index 58617bdb6..daac1eee0 100644 --- a/src/shell-drawing.c +++ b/src/shell-drawing.c @@ -178,3 +178,38 @@ shell_draw_glow (ClutterCairoTexture *texture, cairo_pattern_destroy (gradient); cairo_destroy (cr); } + +static void +hook_paint_red_border (ClutterActor *actor, + gpointer user_data) +{ + CoglColor color; + ClutterGeometry geom; + float width = 2; + float x2; + float y2; + + cogl_color_set_from_4ub (&color, 0xff, 0, 0, 0xc4); + cogl_set_source_color (&color); + + clutter_actor_get_allocation_geometry (actor, &geom); + x2 = geom.x + geom.width; + y2 = geom.y + geom.height; + + /** clockwise order **/ + cogl_rectangle (geom.x, geom.y, + x2, geom.y + width); + cogl_rectangle (x2 - width, geom.y + width, + x2, y2); + cogl_rectangle (x2 - width, y2, + geom.x, y2 - width); + cogl_rectangle (geom.x + width, y2 - width, + geom.x, geom.y + width); +} + +guint +shell_add_hook_paint_red_border (ClutterActor *actor) +{ + return g_signal_connect_after (G_OBJECT (actor), "paint", + G_CALLBACK (hook_paint_red_border), NULL); +} diff --git a/src/shell-drawing.h b/src/shell-drawing.h index 78c4fcfd1..04aa58a36 100644 --- a/src/shell-drawing.h +++ b/src/shell-drawing.h @@ -23,6 +23,8 @@ void shell_draw_glow (ClutterCairoTexture *texture, double green, double alpha); +guint shell_add_hook_paint_red_border (ClutterActor *actor); + G_END_DECLS #endif /* __SHELL_GLOBAL_H__ */