--- /dev/null
+#include <string.h>
+#include "border.h"
+
+#define BOUNDS_CHANGED "object:bounds-changed"
+#define WIDTH 720
+#define HEIGHT 1280
+
+static Evas* evas = NULL;
+static Evas_Object *r1 = NULL;
+static Evas_Object *r2 = NULL;
+static Evas_Object *r3 = NULL;
+static Evas_Object *r4 = NULL;
+static Evas_Object *win = NULL;
+static AtspiAccessible *source = NULL;
+static AtspiEventListener *listener = NULL;
+static AtspiEventListener *listener2 = NULL;
+static const char *registered_event = NULL;
+static Eina_Bool initialized = EINA_FALSE;
+
+static Eina_Bool draw_border(AtspiAccessible *w)
+{
+ if(!w)
+ return EINA_FALSE;
+
+ GError *error = NULL;
+ AtspiComponent *comp = atspi_accessible_get_component(w);
+ AtspiRect *r = atspi_component_get_extents(comp, ATSPI_COORD_TYPE_SCREEN, &error);
+
+ if(error)
+ return EINA_FALSE;
+
+ evas_object_line_xy_set(r1, r->x, r->y, r->x+r->width, r->y);
+ evas_object_line_xy_set(r2, r->x + r->width, r->y, r->x + r->width, r->y + r->height);
+ evas_object_line_xy_set(r3, r->x + r->width, r->y + r->height, r->x, r->y + r->height);
+ evas_object_line_xy_set(r4, r->x, r->y + r->height, r->x, r->y);
+
+ return EINA_TRUE;
+}
+
+static void _bounds_changed(const AtspiEvent *event, void *user_data)
+{
+ if(source == event->source)
+ draw_border(event->source);
+}
+
+Eina_Bool border_init(void)
+{
+ GError *error = NULL;
+ if(initialized)
+ return EINA_TRUE;
+
+ win = elm_win_add(NULL, "highlight", ELM_WIN_BASIC);
+ elm_win_alpha_set(win, EINA_TRUE);
+ evas_object_resize(win, WIDTH, HEIGHT);
+ evas_object_move(win, 0, 0);
+ evas_object_layer_set(win, 6);
+ Evas *evas = evas_object_evas_get(win);
+ r1 = evas_object_line_add(evas);
+ r2 = evas_object_line_add(evas);
+ r3 = evas_object_line_add(evas);
+ r4 = evas_object_line_add(evas);
+ evas_object_color_set(r1, 255, 255, 0, 255);
+ evas_object_color_set(r2, 255, 255, 0, 255);
+ evas_object_color_set(r3, 255, 255, 0, 255);
+ evas_object_color_set(r4, 255, 255, 0, 255);
+ evas_object_show(r1);
+ evas_object_show(r2);
+ evas_object_show(r3);
+ evas_object_show(r4);
+ evas_object_show(win);
+
+ listener = atspi_event_listener_new (_bounds_changed, NULL, NULL);
+ atspi_event_listener_register (listener, BOUNDS_CHANGED, &error);
+
+ if(error)
+ return EINA_FALSE;
+
+ initialized = EINA_TRUE;
+ return EINA_TRUE;
+}
+
+void border_shutdown(void)
+{
+ if(!initialized)
+ return;
+
+ if(listener)
+ atspi_event_listener_deregister (listener, BOUNDS_CHANGED, NULL);
+
+ if(r1) {
+ evas_object_del(r1);
+ r1 = NULL;
+ }
+ if(r2) {
+ evas_object_del(r2);
+ r2 = NULL;
+ }
+ if(r3) {
+ evas_object_del(r3);
+ r3 = NULL;
+ }
+ if(r4) {
+ evas_object_del(r4);
+ r4 = NULL;
+ }
+ if(win) {
+ evas_object_del(win);
+ win = NULL;
+ }
+
+ initialized = EINA_FALSE;
+}
+
+Eina_Bool border_set(AtspiAccessible *widget)
+{
+ if(!initialized)
+ return EINA_FALSE;
+
+ if(!widget)
+ return EINA_FALSE;
+
+ if(source != widget)
+ source = widget;
+
+ draw_border(widget);
+
+ return EINA_TRUE;
+}
+
+static void _on_event(const AtspiEvent *event, void *user_data)
+{
+ border_set(event->source);
+}
+
+void border_set_on_event(const char *event)
+{
+ if(registered_event) {
+ atspi_event_listener_deregister (listener2, registered_event, NULL);
+ free(registered_event);
+ registered_event = NULL;
+ }
+
+ if(!event)
+ return;
+
+ registered_event = strdup(event);
+ listener2 = atspi_event_listener_new (_on_event, NULL, NULL);
+ atspi_event_listener_register (listener2, registered_event, NULL);
+}