summaryrefslogtreecommitdiff
path: root/typing-break/drwright.c
diff options
context:
space:
mode:
Diffstat (limited to 'typing-break/drwright.c')
-rw-r--r--typing-break/drwright.c1003
1 files changed, 0 insertions, 1003 deletions
diff --git a/typing-break/drwright.c b/typing-break/drwright.c
deleted file mode 100644
index cc9821760..000000000
--- a/typing-break/drwright.c
+++ /dev/null
@@ -1,1003 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2003-2005 Imendio HB
- * Copyright (C) 2002-2003 Richard Hult <richard@imendio.com>
- * Copyright (C) 2002 CodeFactory AB
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-
-#include "drwright.h"
-
-#include <time.h>
-#include <string.h>
-#include <math.h>
-
-#include <glib/gi18n.h>
-#include <gdk/gdk.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <libgnomeui/gnome-stock-icons.h>
-#include <libgnomeui/gnome-client.h>
-
-#include <gconf/gconf-client.h>
-
-#include "drw-break-window.h"
-#include "drw-monitor.h"
-#include "drw-utils.h"
-#include "eggtrayicon.h"
-#include "egg-spawn.h"
-
-#define BLINK_TIMEOUT 200
-#define BLINK_TIMEOUT_MIN 120
-#define BLINK_TIMEOUT_FACTOR 100
-
-#define POPUP_ITEM_ENABLED 1
-#define POPUP_ITEM_BREAK 2
-
-typedef enum {
- STATE_START,
- STATE_IDLE,
- STATE_TYPE,
- STATE_WARN_TYPE,
- STATE_WARN_IDLE,
- STATE_BREAK_SETUP,
- STATE_BREAK,
- STATE_BREAK_DONE_SETUP,
- STATE_BREAK_DONE
-} DrwState;
-
-struct _DrWright {
- /* Widgets. */
- GtkWidget *break_window;
- GList *secondary_break_windows;
-
- DrwMonitor *monitor;
-
- GtkItemFactory *popup_factory;
-
- DrwState state;
- GTimer *timer;
- GTimer *idle_timer;
-
- gint last_elapsed_time;
-
- gboolean is_active;
-
- /* Time settings. */
- gint type_time;
- gint break_time;
- gint warn_time;
-
- gboolean enabled;
-
- guint clock_timeout_id;
- guint blink_timeout_id;
-
- gboolean blink_on;
-
- EggTrayIcon *icon;
- GtkWidget *icon_image;
- GtkWidget *icon_event_box;
- GtkTooltips *tooltips;
-
- GdkPixbuf *neutral_bar;
- GdkPixbuf *red_bar;
- GdkPixbuf *green_bar;
- GdkPixbuf *disabled_bar;
- GdkPixbuf *composite_bar;
-
- GtkWidget *warn_dialog;
-};
-
-static void activity_detected_cb (DrwMonitor *monitor,
- DrWright *drwright);
-static gboolean maybe_change_state (DrWright *drwright);
-static gboolean update_tooltip (DrWright *drwright);
-static gboolean icon_button_press_cb (GtkWidget *widget,
- GdkEventButton *event,
- DrWright *drwright);
-static void break_window_done_cb (GtkWidget *window,
- DrWright *dr);
-static void break_window_postpone_cb (GtkWidget *window,
- DrWright *dr);
-static void break_window_destroy_cb (GtkWidget *window,
- DrWright *dr);
-static void popup_break_cb (gpointer callback_data,
- guint action,
- GtkWidget *widget);
-static void popup_preferences_cb (gpointer callback_data,
- guint action,
- GtkWidget *widget);
-static void popup_about_cb (gpointer callback_data,
- guint action,
- GtkWidget *widget);
-static gchar * item_factory_trans_cb (const gchar *path,
- gpointer data);
-static void init_tray_icon (DrWright *dr);
-static GList * create_secondary_break_windows (void);
-
-
-
-#define GIF_CB(x) ((GtkItemFactoryCallback)(x))
-
-static GtkItemFactoryEntry popup_items[] = {
-/* { N_("/_Enabled"), NULL, GIF_CB (popup_enabled_cb), POPUP_ITEM_ENABLED, "<ToggleItem>", NULL },*/
- { N_("/_Preferences"), NULL, GIF_CB (popup_preferences_cb), 0, "<StockItem>", GTK_STOCK_PREFERENCES },
- { N_("/_About"), NULL, GIF_CB (popup_about_cb), 0, "<StockItem>", GNOME_STOCK_ABOUT },
- { "/sep1", NULL, NULL, 0, "<Separator>", NULL },
- { N_("/_Take a Break"), NULL, GIF_CB (popup_break_cb), POPUP_ITEM_BREAK, "<Item>", NULL }
-};
-
-extern gboolean debug;
-
-static void
-setup_debug_values (DrWright *dr)
-{
- dr->type_time = 5;
- dr->warn_time = 4;
- dr->break_time = 10;
-}
-
-static void
-update_icon (DrWright *dr)
-{
- GdkPixbuf *pixbuf;
- GdkPixbuf *tmp_pixbuf;
- gint width, height;
- gfloat r;
- gint offset;
- gboolean set_pixbuf;
-
- if (!dr->enabled) {
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), dr->disabled_bar);
- return;
- }
-
- tmp_pixbuf = gdk_pixbuf_copy (dr->neutral_bar);
-
- width = gdk_pixbuf_get_width (tmp_pixbuf);
- height = gdk_pixbuf_get_height (tmp_pixbuf);
-
- set_pixbuf = TRUE;
-
- switch (dr->state) {
- case STATE_BREAK:
- case STATE_BREAK_SETUP:
- r = 1;
- break;
-
- case STATE_BREAK_DONE:
- case STATE_BREAK_DONE_SETUP:
- case STATE_START:
- r = 0;
- break;
-
- case STATE_WARN_IDLE:
- case STATE_WARN_TYPE:
- r = ((float)(dr->type_time - dr->warn_time) / dr->type_time) +
- (float) g_timer_elapsed (dr->timer, NULL) / (float) dr->warn_time;
- break;
-
- default:
- r = (float) g_timer_elapsed (dr->timer, NULL) / (float) dr->type_time;
- break;
- }
-
- offset = CLAMP ((height - 0) * (1.0 - r), 1, height - 0);
-
- switch (dr->state) {
- case STATE_WARN_TYPE:
- case STATE_WARN_IDLE:
- pixbuf = dr->red_bar;
- set_pixbuf = FALSE;
- break;
-
- case STATE_BREAK_SETUP:
- case STATE_BREAK:
- pixbuf = dr->red_bar;
- break;
-
- default:
- pixbuf = dr->green_bar;
- }
-
- gdk_pixbuf_composite (pixbuf,
- tmp_pixbuf,
- 0,
- offset,
- width,
- height - offset,
- 0,
- 0,
- 1.0,
- 1.0,
- GDK_INTERP_BILINEAR,
- 255);
-
- if (set_pixbuf) {
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), tmp_pixbuf);
- }
-
- if (dr->composite_bar) {
- g_object_unref (dr->composite_bar);
- }
-
- dr->composite_bar = tmp_pixbuf;
-}
-
-static gboolean
-blink_timeout_cb (DrWright *dr)
-{
- gfloat r;
- gint timeout;
-
- r = (dr->warn_time - g_timer_elapsed (dr->timer, NULL)) / dr->warn_time;
- timeout = BLINK_TIMEOUT + BLINK_TIMEOUT_FACTOR * r;
-
- if (timeout < BLINK_TIMEOUT_MIN) {
- timeout = BLINK_TIMEOUT_MIN;
- }
-
- if (dr->blink_on || timeout == 0) {
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), dr->composite_bar);
- } else {
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), dr->neutral_bar);
- }
-
- dr->blink_on = !dr->blink_on;
-
- if (timeout) {
- dr->blink_timeout_id = g_timeout_add (timeout,
- (GSourceFunc) blink_timeout_cb,
- dr);
- } else {
- dr->blink_timeout_id = 0;
- }
-
- return FALSE;
-}
-
-static void
-start_blinking (DrWright *dr)
-{
- if (!dr->blink_timeout_id) {
- dr->blink_on = TRUE;
- blink_timeout_cb (dr);
- }
-
- /*gtk_widget_show (GTK_WIDGET (dr->icon));*/
-}
-
-static void
-stop_blinking (DrWright *dr)
-{
- if (dr->blink_timeout_id) {
- g_source_remove (dr->blink_timeout_id);
- dr->blink_timeout_id = 0;
- }
-
- /*gtk_widget_hide (GTK_WIDGET (dr->icon));*/
-}
-
-static gboolean
-grab_keyboard_on_window (GdkWindow *window,
- guint32 activate_time)
-{
- GdkGrabStatus status;
-
- status = gdk_keyboard_grab (window, TRUE, activate_time);
- if (status == GDK_GRAB_SUCCESS) {
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-maybe_change_state (DrWright *dr)
-{
- gint elapsed_time;
- gint elapsed_idle_time;
-
- if (debug) {
- g_timer_reset (dr->idle_timer);
- }
-
- elapsed_time = g_timer_elapsed (dr->timer, NULL);
- elapsed_idle_time = g_timer_elapsed (dr->idle_timer, NULL);
-
- if (elapsed_time > dr->last_elapsed_time + dr->warn_time) {
- /* If the timeout is delayed by the amount of warning time, then
- * we must have been suspended or stopped, so we just start
- * over.
- */
- dr->state = STATE_START;
- }
-
- switch (dr->state) {
- case STATE_START:
- if (dr->break_window) {
- gtk_widget_destroy (dr->break_window);
- dr->break_window = NULL;
- }
-
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), dr->neutral_bar);
-
- g_timer_start (dr->timer);
- g_timer_start (dr->idle_timer);
-
- if (dr->enabled) {
- dr->state = STATE_IDLE;
- }
-
- update_tooltip (dr);
- stop_blinking (dr);
- break;
-
- case STATE_IDLE:
- if (elapsed_idle_time >= dr->break_time) {
- g_timer_start (dr->timer);
- g_timer_start (dr->idle_timer);
- } else if (dr->is_active) {
- dr->state = STATE_TYPE;
- }
- break;
-
- case STATE_TYPE:
- if (elapsed_time >= dr->type_time - dr->warn_time) {
- dr->state = STATE_WARN_TYPE;
- g_timer_start (dr->timer);
-
- start_blinking (dr);
- } else if (elapsed_time >= dr->type_time) {
- dr->state = STATE_BREAK_SETUP;
- }
- else if (!dr->is_active) {
- dr->state = STATE_IDLE;
- g_timer_start (dr->idle_timer);
- }
- break;
-
- case STATE_WARN_TYPE:
- if (elapsed_time >= dr->warn_time) {
- dr->state = STATE_BREAK_SETUP;
- }
- else if (!dr->is_active) {
- dr->state = STATE_WARN_IDLE;
- }
- break;
-
- case STATE_WARN_IDLE:
- if (elapsed_idle_time >= dr->break_time) {
- dr->state = STATE_BREAK_DONE_SETUP;
- }
- else if (dr->is_active) {
- dr->state = STATE_WARN_TYPE;
- }
-
- break;
-
- case STATE_BREAK_SETUP:
- /* Don't allow more than one break window to coexist, can happen
- * if a break is manually enforced.
- */
- if (dr->break_window) {
- dr->state = STATE_BREAK;
- break;
- }
-
- stop_blinking (dr);
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), dr->red_bar);
-
- g_timer_start (dr->timer);
-
- dr->break_window = drw_break_window_new ();
-
- g_signal_connect (dr->break_window,
- "done",
- G_CALLBACK (break_window_done_cb),
- dr);
-
- g_signal_connect (dr->break_window,
- "postpone",
- G_CALLBACK (break_window_postpone_cb),
- dr);
-
- g_signal_connect (dr->break_window,
- "destroy",
- G_CALLBACK (break_window_destroy_cb),
- dr);
-
- dr->secondary_break_windows = create_secondary_break_windows ();
-
- gtk_widget_show (dr->break_window);
-
- grab_keyboard_on_window (dr->break_window->window, gtk_get_current_event_time ());
-
- dr->state = STATE_BREAK;
- break;
-
- case STATE_BREAK:
- if (elapsed_time >= dr->break_time) {
- dr->state = STATE_BREAK_DONE_SETUP;
- }
- break;
-
- case STATE_BREAK_DONE_SETUP:
- stop_blinking (dr);
- gtk_image_set_from_pixbuf (GTK_IMAGE (dr->icon_image), dr->green_bar);
-
- dr->state = STATE_BREAK_DONE;
- break;
-
- case STATE_BREAK_DONE:
- if (dr->is_active) {
- dr->state = STATE_START;
- if (dr->break_window) {
- gtk_widget_destroy (dr->break_window);
- dr->break_window = NULL;
- }
- }
- break;
- }
-
- dr->is_active = FALSE;
- dr->last_elapsed_time = elapsed_time;
-
- update_icon (dr);
-
- return TRUE;
-}
-
-static gboolean
-update_tooltip (DrWright *dr)
-{
- gint elapsed_time, min;
- gchar *str;
-
- if (!dr->enabled) {
- gtk_tooltips_set_tip (GTK_TOOLTIPS (dr->tooltips),
- dr->icon_event_box,
- _("Disabled"), _("Disabled"));
- return TRUE;
- }
-
- elapsed_time = g_timer_elapsed (dr->timer, NULL);
-
- switch (dr->state) {
- case STATE_WARN_TYPE:
- case STATE_WARN_IDLE:
- min = floor (0.5 + (dr->warn_time - elapsed_time) / 60.0);
- break;
-
- default:
- min = floor (0.5 + (dr->type_time - elapsed_time) / 60.0);
- break;
- }
-
- if (min >= 1) {
- str = g_strdup_printf (ngettext("%d minute until the next break",
- "%d minutes until the next break",
- min), min);
- } else {
- str = g_strdup_printf (_("Less than one minute until the next break"));
- }
-
- gtk_tooltips_set_tip (GTK_TOOLTIPS (dr->tooltips),
- dr->icon_event_box,
- str, str);
-
- g_free (str);
-
- return TRUE;
-}
-
-static void
-activity_detected_cb (DrwMonitor *monitor,
- DrWright *dr)
-{
- dr->is_active = TRUE;
- g_timer_start (dr->idle_timer);
-}
-
-static void
-gconf_notify_cb (GConfClient *client,
- guint cnxn_id,
- GConfEntry *entry,
- gpointer user_data)
-{
- DrWright *dr = user_data;
- GtkWidget *item;
-
- if (!strcmp (entry->key, GCONF_PATH "/type_time")) {
- if (entry->value->type == GCONF_VALUE_INT) {
- dr->type_time = 60 * gconf_value_get_int (entry->value);
- dr->warn_time = MIN (dr->type_time / 10, 5*60);
-
- dr->state = STATE_START;
- }
- }
- else if (!strcmp (entry->key, GCONF_PATH "/break_time")) {
- if (entry->value->type == GCONF_VALUE_INT) {
- dr->break_time = 60 * gconf_value_get_int (entry->value);
- dr->state = STATE_START;
- }
- }
- else if (!strcmp (entry->key, GCONF_PATH "/enabled")) {
- if (entry->value->type == GCONF_VALUE_BOOL) {
- dr->enabled = gconf_value_get_bool (entry->value);
- dr->state = STATE_START;
-
- item = gtk_item_factory_get_widget_by_action (dr->popup_factory,
- POPUP_ITEM_BREAK);
- gtk_widget_set_sensitive (item, dr->enabled);
-
- update_tooltip (dr);
- }
- }
-
- maybe_change_state (dr);
-}
-
-static void
-popup_break_cb (gpointer callback_data,
- guint action,
- GtkWidget *widget)
-{
- DrWright *dr = callback_data;
-
- if (dr->enabled) {
- dr->state = STATE_BREAK_SETUP;
- maybe_change_state (dr);
- }
-}
-
-static void
-popup_preferences_cb (gpointer callback_data,
- guint action,
- GtkWidget *widget)
-{
- GdkScreen *screen;
- GError *error = NULL;
-
- screen = gtk_widget_get_screen (widget);
-
- if (!egg_spawn_command_line_async_on_screen ("gnome-keyboard-properties --typing-break", screen, &error)) {
- GtkWidget *error_dialog;
-
- error_dialog = gtk_message_dialog_new (NULL, 0,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- _("Unable to bring up the typing break properties dialog with the following error: %s"),
- error->message);
- g_signal_connect (error_dialog,
- "response",
- G_CALLBACK (gtk_widget_destroy), NULL);
- gtk_window_set_resizable (GTK_WINDOW (error_dialog), FALSE);
- gtk_widget_show (error_dialog);
-
- g_error_free (error);
- }
-}
-
-static void
-about_response_cb (GtkWidget *dialog,
- gint response,
- gpointer user_data)
-{
- gtk_widget_destroy (dialog);
-}
-
-static void
-popup_about_cb (gpointer callback_data,
- guint action,
- GtkWidget *widget)
-{
- static GtkWidget *about_window;
- GtkWidget *vbox;
- GtkWidget *label;
- GdkPixbuf *icon;
- gchar *markup;
-
- if (about_window) {
- gtk_window_present (GTK_WINDOW (about_window));
- return;
- }
-
- about_window = gtk_dialog_new ();
-
- g_signal_connect (about_window,
- "destroy",
- G_CALLBACK (gtk_widget_destroyed),
- &about_window);
-
- gtk_dialog_add_button (GTK_DIALOG (about_window),
- GTK_STOCK_OK, GTK_RESPONSE_OK);
- gtk_dialog_set_default_response (GTK_DIALOG (about_window),
- GTK_RESPONSE_OK);
-
- gtk_window_set_title (GTK_WINDOW (about_window), _("About GNOME Typing Monitor"));
- icon = NULL; /*gdk_pixbuf_new_from_file (IMAGEDIR "/bar.png", NULL);*/
- if (icon != NULL) {
- gtk_window_set_icon (GTK_WINDOW (about_window), icon);
- g_object_unref (icon);
- }
-
- gtk_window_set_resizable (GTK_WINDOW (about_window), FALSE);
- gtk_window_set_position (GTK_WINDOW (about_window),
- GTK_WIN_POS_CENTER_ON_PARENT);
- gtk_window_set_type_hint (GTK_WINDOW (about_window),
- GDK_WINDOW_TYPE_HINT_DIALOG);
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (about_window)->vbox), vbox, FALSE, FALSE, 0);
-
- label = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
- gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_CENTER);
- markup = g_strdup_printf ("<span size=\"xx-large\" weight=\"bold\">Typing Monitor " VERSION "</span>\n\n"
- "%s\n\n"
- "<span size=\"small\">%s</span>\n"
- "<span size=\"small\">%s</span>\n",
- _("A computer break reminder."),
- _("Written by Richard Hult &lt;richard@imendio.com&gt;"),
- _("Eye candy added by Anders Carlsson"));
- gtk_label_set_markup (GTK_LABEL (label), markup);
- g_free (markup);
- gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
-
- gtk_widget_show_all (about_window);
-
- g_signal_connect (about_window,
- "response", G_CALLBACK (about_response_cb),
- NULL);
-}
-
-static void
-popup_menu_position_cb (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer data)
-{
- GtkWidget *w = data;
- GtkRequisition requisition;
- gint wx, wy;
-
- g_return_if_fail (w != NULL);
-
- gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
-
- gdk_window_get_origin (w->window, &wx, &wy);
-
- if (*x < wx)
- *x = wx;
- else if (*x > wx + w->allocation.width)
- *x = wx + w->allocation.width;
-
- if (*x + requisition.width > gdk_screen_width())
- *x = gdk_screen_width() - requisition.width;
-
- if (*y < wy)
- *y = wy;
- else if (*y > wy + w->allocation.height)
- *y = wy + w->allocation.height;
-
- if (*y + requisition.height > gdk_screen_height())
- *y = gdk_screen_height() - requisition.height;
-
- *push_in = TRUE;
-}
-
-static gboolean
-icon_button_press_cb (GtkWidget *widget,
- GdkEventButton *event,
- DrWright *dr)
-{
- GtkWidget *menu;
-
- if (event->button == 3) {
- menu = gtk_item_factory_get_widget (dr->popup_factory, "");
-
- gtk_menu_popup (GTK_MENU (menu),
- NULL,
- NULL,
- popup_menu_position_cb,
- dr->icon,
- event->button,
- event->time);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-popup_menu_cb (GtkWidget *widget,
- DrWright *dr)
-{
- GtkWidget *menu;
-
- menu = gtk_item_factory_get_widget (dr->popup_factory, "");
-
- gtk_menu_popup (GTK_MENU (menu),
- NULL,
- NULL,
- popup_menu_position_cb,
- dr->icon,
- 0,
- gtk_get_current_event_time());
-}
-
-static void
-break_window_done_cb (GtkWidget *window,
- DrWright *dr)
-{
- gtk_widget_destroy (dr->break_window);
-
- dr->state = STATE_BREAK_DONE_SETUP;
- dr->break_window = NULL;
-
- update_tooltip (dr);
- maybe_change_state (dr);
-}
-
-static void
-break_window_postpone_cb (GtkWidget *window,
- DrWright *dr)
-{
- gtk_widget_destroy (dr->break_window);
-
- dr->state = STATE_WARN_TYPE;
- dr->break_window = NULL;
-
- g_timer_start (dr->timer);
- start_blinking (dr);
- update_icon (dr);
- update_tooltip (dr);
-}
-
-static void
-break_window_destroy_cb (GtkWidget *window,
- DrWright *dr)
-{
- GList *l;
-
- for (l = dr->secondary_break_windows; l; l = l->next) {
- gtk_widget_destroy (l->data);
- }
-
- g_list_free (dr->secondary_break_windows);
- dr->secondary_break_windows = NULL;
-}
-
-static char *
-item_factory_trans_cb (const gchar *path,
- gpointer data)
-{
- return _((gchar*) path);
-}
-
-static void
-icon_event_box_destroy_cb (GtkWidget *widget,
- DrWright *dr)
-{
- gtk_widget_destroy (GTK_WIDGET (dr->icon));
- init_tray_icon (dr);
-}
-
-static gboolean
-icon_event_box_expose_event_cb (GtkWidget *widget,
- GdkEventExpose *event,
- DrWright *dr)
-{
- if (GTK_WIDGET_HAS_FOCUS (widget)) {
- gint focus_width, focus_pad;
- gint x, y, width, height;
-
- gtk_widget_style_get (widget,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- NULL);
- x = widget->allocation.x + focus_pad;
- y = widget->allocation.y + focus_pad;
- width = widget->allocation.width - 2 * focus_pad;
- height = widget->allocation.height - 2 * focus_pad;
-
- gtk_paint_focus (widget->style, widget->window,
- GTK_WIDGET_STATE (widget),
- &event->area, widget, "button",
- x, y, width, height);
- }
-
- return FALSE;
-}
-
-static void
-init_tray_icon (DrWright *dr)
-{
- dr->icon = egg_tray_icon_new (_("Break reminder"));
-
- dr->icon_event_box = gtk_event_box_new ();
- dr->icon_image = gtk_image_new_from_pixbuf (dr->neutral_bar);
- gtk_container_add (GTK_CONTAINER (dr->icon_event_box), dr->icon_image);
-
- gtk_widget_add_events (GTK_WIDGET (dr->icon), GDK_BUTTON_PRESS_MASK | GDK_FOCUS_CHANGE_MASK);
- gtk_container_add (GTK_CONTAINER (dr->icon), dr->icon_event_box);
- gtk_widget_show_all (GTK_WIDGET (dr->icon));
-
- GTK_WIDGET_SET_FLAGS (dr->icon_event_box, GTK_CAN_FOCUS);
-
- update_tooltip (dr);
- update_icon (dr);
-
- g_signal_connect (dr->icon,
- "button_press_event",
- G_CALLBACK (icon_button_press_cb),
- dr);
-
- g_signal_connect (dr->icon,
- "destroy",
- G_CALLBACK (icon_event_box_destroy_cb),
- dr);
-
- g_signal_connect (dr->icon,
- "popup_menu",
- G_CALLBACK (popup_menu_cb),
- dr);
-
- g_signal_connect_after (dr->icon_event_box,
- "expose_event",
- G_CALLBACK (icon_event_box_expose_event_cb),
- dr);
-}
-
-static GList *
-create_secondary_break_windows (void)
-{
- GdkDisplay *display;
- GdkScreen *screen;
- GtkWidget *window;
- gint i;
- GList *windows = NULL;
-
- display = gdk_display_get_default ();
-
- for (i = 0; i < gdk_display_get_n_screens (display); i++) {
- screen = gdk_display_get_screen (display, i);
-
- if (screen == gdk_screen_get_default ()) {
- /* Handled by DrwBreakWindow. */
- continue;
- }
-
- window = gtk_window_new (GTK_WINDOW_POPUP);
-
- windows = g_list_prepend (windows, window);
-
- gtk_window_set_screen (GTK_WINDOW (window), screen);
-
- gtk_window_set_default_size (GTK_WINDOW (window),
- gdk_screen_get_width (screen),
- gdk_screen_get_height (screen));
-
- gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
- gtk_widget_realize (GTK_WIDGET (window));
-
- drw_setup_background (GTK_WIDGET (window));
- gtk_window_stick (GTK_WINDOW (window));
- gtk_widget_show (window);
- }
-
- return windows;
-}
-
-DrWright *
-drwright_new (void)
-{
- DrWright *dr;
- GtkWidget *item;
- GConfClient *client;
-
- dr = g_new0 (DrWright, 1);
-
- client = gconf_client_get_default ();
-
- gconf_client_add_dir (client,
- GCONF_PATH,
- GCONF_CLIENT_PRELOAD_NONE,
- NULL);
-
- gconf_client_notify_add (client, GCONF_PATH,
- gconf_notify_cb,
- dr,
- NULL,
- NULL);
-
- dr->type_time = 60 * gconf_client_get_int (
- client, GCONF_PATH "/type_time", NULL);
-
- dr->warn_time = MIN (dr->type_time / 12, 60*3);
-
- dr->break_time = 60 * gconf_client_get_int (
- client, GCONF_PATH "/break_time", NULL);
-
- dr->enabled = gconf_client_get_bool (
- client,
- GCONF_PATH "/enabled",
- NULL);
-
- g_object_unref (client);
-
- if (debug) {
- setup_debug_values (dr);
- }
-
- dr->popup_factory = gtk_item_factory_new (GTK_TYPE_MENU,
- "<main>",
- NULL);
- gtk_item_factory_set_translate_func (dr->popup_factory,
- item_factory_trans_cb,
- NULL,
- NULL);
-
- gtk_item_factory_create_items (dr->popup_factory,
- G_N_ELEMENTS (popup_items),
- popup_items,
- dr);
-
- /*item = gtk_item_factory_get_widget_by_action (dr->popup_factory, POPUP_ITEM_ENABLED);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), dr->enabled);*/
-
- item = gtk_item_factory_get_widget_by_action (dr->popup_factory, POPUP_ITEM_BREAK);
- gtk_widget_set_sensitive (item, dr->enabled);
-
- dr->timer = g_timer_new ();
- dr->idle_timer = g_timer_new ();
-
- dr->state = STATE_START;
-
- dr->monitor = drw_monitor_new ();
-
- g_signal_connect (dr->monitor,
- "activity",
- G_CALLBACK (activity_detected_cb),
- dr);
-
- dr->neutral_bar = gdk_pixbuf_new_from_file (IMAGEDIR "/bar.png", NULL);
- dr->red_bar = gdk_pixbuf_new_from_file (IMAGEDIR "/bar-red.png", NULL);
- dr->green_bar = gdk_pixbuf_new_from_file (IMAGEDIR "/bar-green.png", NULL);
- dr->disabled_bar = gdk_pixbuf_new_from_file (IMAGEDIR "/bar-disabled.png", NULL);
-
- dr->tooltips = gtk_tooltips_new ();
-
- init_tray_icon (dr);
-
- g_timeout_add (10*1000,
- (GSourceFunc) update_tooltip,
- dr);
- g_timeout_add (500,
- (GSourceFunc) maybe_change_state,
- dr);
-
- return dr;
-}
-