summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/frame.c54
-rw-r--r--openbox/frame.h5
2 files changed, 59 insertions, 0 deletions
diff --git a/openbox/frame.c b/openbox/frame.c
index 37470e3c..7c26d706 100644
--- a/openbox/frame.c
+++ b/openbox/frame.c
@@ -4,6 +4,7 @@
#include "extensions.h"
#include "config.h"
#include "framerender.h"
+#include "mainloop.h"
#include "render/theme.h"
#define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask)
@@ -39,6 +40,7 @@ ObFrame *frame_new()
self->visible = FALSE;
self->obscured = TRUE;
self->decorations = 0;
+ self->flashing = FALSE;
/* create all of the decor windows */
mask = CWOverrideRedirect | CWEventMask;
@@ -779,3 +781,55 @@ void frame_frame_gravity(ObFrame *self, int *x, int *y)
break;
}
}
+
+static void flash_done(gpointer data)
+{
+ ObFrame *self = data;
+ self->flashing = FALSE;
+
+ if (self->focused != self->flash_on)
+ frame_adjust_focus(self, self->focused);
+}
+
+static gboolean flash_timeout(gpointer data)
+{
+ ObFrame *self = data;
+ GTimeVal now;
+ gboolean focused;
+
+ g_message("flash");
+
+ g_get_current_time(&now);
+ if (now.tv_sec > self->flash_end.tv_sec ||
+ (now.tv_sec == self->flash_end.tv_sec &&
+ now.tv_usec >= self->flash_end.tv_usec)) {
+ g_message("done flashing");
+ return FALSE; /* we are done */
+ }
+
+ self->flash_on = !self->flash_on;
+ g_message("on %d", self->flash_on);
+ {
+ focused = self->focused; /* save the focused flag */
+ frame_adjust_focus(self, self->flash_on);
+ self->focused = focused;
+ }
+
+ return TRUE; /* go again */
+}
+
+void frame_flash(ObFrame *self)
+{
+ self->flash_on = self->focused;
+
+ if (!self->flashing)
+ ob_main_loop_timeout_add(ob_main_loop,
+ G_USEC_PER_SEC / 2,
+ flash_timeout,
+ self,
+ flash_done);
+ g_get_current_time(&self->flash_end);
+ g_time_val_add(&self->flash_end, G_USEC_PER_SEC * 4);
+
+ self->flashing = TRUE;
+}
diff --git a/openbox/frame.h b/openbox/frame.h
index 572d18b6..d5a9c7ce 100644
--- a/openbox/frame.h
+++ b/openbox/frame.h
@@ -114,6 +114,10 @@ struct _ObFrame
gboolean iconify_hover;
gboolean focused;
+
+ gboolean flashing;
+ gboolean flash_on;
+ GTimeVal flash_end;
};
ObFrame *frame_new();
@@ -145,5 +149,6 @@ void frame_client_gravity(ObFrame *self, int *x, int *y);
*/
void frame_frame_gravity(ObFrame *self, int *x, int *y);
+void frame_flash(ObFrame *self);
#endif