summaryrefslogtreecommitdiff
path: root/von-wait.c
diff options
context:
space:
mode:
Diffstat (limited to 'von-wait.c')
-rw-r--r--von-wait.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/von-wait.c b/von-wait.c
new file mode 100644
index 0000000..ba2ceab
--- /dev/null
+++ b/von-wait.c
@@ -0,0 +1,151 @@
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <cairo.h>
+#include <time.h>
+#include <stdlib.h>
+#include <glib/gprintf.h>
+
+#define SECOND_INTERVAL 1000
+
+#define DEFAULT_WIDTH 200
+#define DEFAULT_HEIGHT 15
+
+struct private {
+ time_t time;
+ time_t von_arrives;
+ struct tm *tm;
+};
+
+static gboolean time_handler (GtkWidget* w)
+{
+ gtk_widget_queue_draw (w);
+ return TRUE;
+}
+
+gboolean on_key_press (GtkWidget *widget, GdkEventKey *key, gpointer p) {
+ if (key->type == GDK_KEY_PRESS)
+ {
+ switch (key->keyval)
+ {
+ case GDK_Escape :
+ gtk_main_quit ();
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+static void paint (GtkWidget *widget, GdkEventExpose *eev, struct private *p) {
+ gint width, height;
+ cairo_t *cr;
+ gchar *gc_time;
+
+
+ gint sec, min, hour, day;
+
+ p->time = p->von_arrives - time(NULL);
+ p->tm = localtime (&p->time);
+
+ day = p->time / (3600*24);
+ p->time -= day*(3600*24);
+
+ hour = p->time / 3600;
+ p->time -= hour*3600;
+
+ min = p->time/60;
+ p->time -= min*60;
+
+ sec = p->time;
+
+ gc_time = g_strdup_printf("Von arrives in %02dd %02dh %02dm %02ds", day, hour, min, sec);
+
+ width = widget->allocation.width;
+ height = widget->allocation.height;
+
+ cr = gdk_cairo_create (widget->window);
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+
+
+ cairo_set_source_rgba (cr, 1.0f, 1.0f, 1.0f, 0.4f);
+ cairo_paint (cr);
+
+ cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
+ CAIRO_FONT_WEIGHT_BOLD);
+
+ cairo_save (cr);
+ cairo_set_font_size (cr, 10);
+ cairo_move_to (cr, 10, 10);
+ cairo_set_source_rgba (cr, 0.0f, 0.0f, 0.0f, 1.0f);
+ cairo_show_text (cr, gc_time);
+ cairo_restore (cr);
+
+ cairo_destroy (cr);
+}
+
+static void install_colormap (GtkWidget *w) {
+ GdkScreen* screen = gtk_widget_get_screen (w);
+ GdkColormap* colormap = gdk_screen_get_rgba_colormap (screen);
+
+ if (!colormap)
+ colormap = gdk_screen_get_rgb_colormap (screen);
+
+ gtk_widget_set_colormap (w, colormap);
+}
+
+gint main (gint argc, gchar **argv) {
+ GtkWidget *window;
+
+ struct private *p = malloc(sizeof(struct private));
+ struct tm von_time = {
+ .tm_min = 40,
+ .tm_hour = 9,
+ .tm_mday = 14,
+ .tm_mon = 1,
+ .tm_year = 107,
+ };
+
+ p->von_arrives = mktime(&von_time);
+
+ gtk_init(&argc, &argv);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ gtk_window_stick (GTK_WINDOW (window));
+ gtk_window_set_keep_below (GTK_WINDOW (window), TRUE);
+
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), TRUE);
+ gtk_window_set_skip_pager_hint (GTK_WINDOW (window), TRUE);
+ gtk_window_set_accept_focus (GTK_WINDOW (window), FALSE);
+
+ gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
+ gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
+ gtk_widget_set_app_paintable (window, TRUE);
+
+ gtk_window_set_default_size (GTK_WINDOW (window),
+ DEFAULT_WIDTH,
+ DEFAULT_HEIGHT);
+
+ install_colormap(window);
+
+ gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);
+
+ g_signal_connect (G_OBJECT (window), "expose-event",
+ G_CALLBACK (paint),
+ p);
+
+ g_signal_connect (G_OBJECT (window),
+ "key-press-event",
+ G_CALLBACK (on_key_press),
+ NULL);
+
+ gtk_widget_show_all (window);
+
+ gtk_timeout_add (SECOND_INTERVAL, (GtkFunction) time_handler, window);
+
+ gtk_main ();
+
+ return 0;
+}
+
+