summaryrefslogtreecommitdiffstats
path: root/desktop/yad/notification.c.r158
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/yad/notification.c.r158')
-rw-r--r--desktop/yad/notification.c.r158380
1 files changed, 0 insertions, 380 deletions
diff --git a/desktop/yad/notification.c.r158 b/desktop/yad/notification.c.r158
deleted file mode 100644
index adcaa859ac..0000000000
--- a/desktop/yad/notification.c.r158
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * This file is part of YAD.
- *
- * YAD 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 3 of the License, or
- * (at your option) any later version.
- *
- * YAD 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 YAD; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Copyright (C) 2008-2010, Victor Ananjevsky <ananasik@gmail.com>
- *
- */
-
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <time.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "yad.h"
-
-typedef struct {
- gchar *name;
- gchar *action;
-} MenuData;
-
-static GtkStatusIcon *status_icon;
-
-static gchar *icon = NULL;
-static gchar *action = NULL;
-
-static GSList *menu_data;
-
-static gint exit_code;
-static gint icon_size;
-
-static void
-timeout_cb (gpointer data)
-{
- exit_code = YAD_RESPONSE_TIMEOUT;
- gtk_main_quit ();
-}
-
-static void
-set_icon (void)
-{
- GdkPixbuf *pixbuf;
- GError *err = NULL;
-
- if (icon == NULL)
- {
- gtk_status_icon_set_from_icon_name (status_icon, "yad");
- return;
- }
-
- if (g_file_test (icon, G_FILE_TEST_EXISTS))
- {
- pixbuf =
- gdk_pixbuf_new_from_file_at_scale (icon, icon_size, icon_size,
- TRUE, &err);
- if (err)
- {
- g_printerr (_("Could not load notification icon '%s': %s"),
- icon, err->message);
- g_clear_error (&err);
- }
- if (pixbuf)
- {
- gtk_status_icon_set_from_pixbuf (status_icon, pixbuf);
- g_object_unref (pixbuf);
- }
- else
- gtk_status_icon_set_from_icon_name (status_icon, "yad");
- }
- else
- gtk_status_icon_set_from_icon_name (status_icon, icon);
-}
-
-static gboolean
-icon_size_changed_cb (GtkStatusIcon * icon, gint size, gpointer data)
-{
- icon_size = size;
- set_icon ();
- return TRUE;
-}
-
-static gboolean
-activate_cb (GtkWidget * widget, YadData * data)
-{
- if (action == NULL || g_ascii_strcasecmp (action, "quit") == 0)
- {
- exit_code = YAD_RESPONSE_OK;
- gtk_main_quit ();
- }
- else
- g_spawn_command_line_async (action, NULL);
-
- return TRUE;
-}
-
-static gboolean
-middle_quit_cb (GtkStatusIcon * icon, GdkEventButton * ev,
- gpointer data)
-{
- if (ev->button == 2)
- {
- exit_code = YAD_RESPONSE_ESC;
- gtk_main_quit ();
- }
-
- return FALSE;
-}
-
-static void
-popup_menu_item_activate_cb (GtkWidget * w, gpointer data)
-{
- gchar *cmd = (gchar *) data;
-
- if (g_ascii_strcasecmp (cmd, "quit") == 0)
- {
- exit_code = YAD_RESPONSE_OK;
- gtk_main_quit ();
- }
- else
- g_spawn_command_line_async (cmd, NULL);
-}
-
-static void
-popup_menu_cb (GtkStatusIcon * icon, guint button,
- guint activate_time, gpointer data)
-{
- GtkWidget *menu;
- GtkWidget *item;
- int i;
-
- g_return_if_fail (menu_data != NULL);
-
- menu = gtk_menu_new ();
- for (i = 0; i < g_slist_length (menu_data); i++)
- {
- MenuData *d = (MenuData *) g_slist_nth_data (menu_data, i);
-
- if (d->name)
- {
- item = gtk_menu_item_new_with_label (d->name);
- g_signal_connect (GTK_MENU_ITEM (item), "activate",
- G_CALLBACK (popup_menu_item_activate_cb),
- (gpointer) d->action);
- }
- else
- item = gtk_separator_menu_item_new ();
-
- gtk_widget_show (item);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- }
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
- gtk_status_icon_position_menu,
- icon, button, activate_time);
-}
-
-static gboolean
-handle_stdin (GIOChannel * channel,
- GIOCondition condition, gpointer data)
-{
- if ((condition & G_IO_IN) != 0)
- {
- GString *string;
- GError *err = NULL;
-
- string = g_string_new (NULL);
- while (channel->is_readable == FALSE) ;
-
- do
- {
- gint status;
- gchar *command, *value, **args;
-
- do
- {
- status =
- g_io_channel_read_line_string (channel, string, NULL, &err);
-
- while (gdk_events_pending ())
- gtk_main_iteration ();
- }
- while (status == G_IO_STATUS_AGAIN);
- strip_new_line (string->str);
-
- if (status != G_IO_STATUS_NORMAL)
- {
- if (err)
- {
- g_printerr ("yad_notification_handle_stdin(): %s\n",
- err->message);
- g_error_free (err);
- err = NULL;
- }
- continue;
- }
-
- args = g_strsplit (string->str, ":", 2);
- command = g_strdup (args[0]);
- value = g_strdup (args[1]);
- g_strfreev (args);
-
- if (!g_ascii_strcasecmp (command, "icon"))
- {
- while (*value && g_ascii_isspace (*value))
- value++;
-
- g_free (icon);
- icon = g_strdup (value);
-
- if (gtk_status_icon_get_visible (status_icon) &&
- gtk_status_icon_is_embedded (status_icon))
- set_icon ();
- }
- else if (!g_ascii_strcasecmp (command, "tooltip"))
- {
- if (g_utf8_validate (value, -1, NULL))
- {
- gchar *message = g_strcompress (value);
-#if GTK_CHECK_VERSION(2,16,0)
- if (options.data.no_markup)
- gtk_status_icon_set_tooltip_markup (status_icon, message);
- else
- gtk_status_icon_set_tooltip_text (status_icon, message);
-#else
- gtk_status_icon_set_tooltip (status_icon, message);
-#endif
-
- g_free (message);
- }
- else
- g_printerr (_("Invalid UTF-8 in tooltip!\n"));
- }
- else if (!g_ascii_strcasecmp (command, "visible"))
- {
-#if !GTK_CHECK_VERSION(2,91,0)
- if (!g_ascii_strcasecmp (value, "blink"))
- {
- gboolean state = gtk_status_icon_get_blinking (status_icon);
- gtk_status_icon_set_blinking (status_icon, !state);
- }
- else
-#endif
- if (!g_ascii_strcasecmp (value, "false"))
- gtk_status_icon_set_visible (status_icon, FALSE);
- else
- gtk_status_icon_set_visible (status_icon, TRUE);
- }
- else if (!g_ascii_strcasecmp (command, "action"))
- {
- g_free (action);
- action = g_strdup (value);
- }
- else if (!g_ascii_strcasecmp (command, "quit"))
- {
- exit_code = YAD_RESPONSE_OK;
- gtk_main_quit ();
- }
- else if (!g_ascii_strcasecmp (command, "menu"))
- {
- MenuData *mdata;
- int i = 0;
- gchar *s, **menu_vals = g_strsplit (value, options.common_data.separator, -1);
-
- g_slist_free (menu_data);
- menu_data = NULL;
-
- while (menu_vals[i] != NULL)
- {
- mdata = g_new0 (MenuData, 1);
- s = strchr (menu_vals[i], settings.menu_sep[0]);
- if (s != NULL)
- {
- mdata->name =
- g_strndup (menu_vals[i], s - menu_vals[i]);
- mdata->action = g_strdup (s + 1);
- }
- menu_data = g_slist_append (menu_data, mdata);
- i++;
- }
-
- g_strfreev (menu_vals);
- }
- else
- g_printerr (_("Unknown command '%s'\n"), command);
-
- g_free (command);
- g_free (value);
- }
- while (g_io_channel_get_buffer_condition (channel) == G_IO_IN);
- g_string_free (string, TRUE);
- }
-
- if ((condition & G_IO_HUP) != 0)
- {
- g_io_channel_shutdown (channel, TRUE, NULL);
- gtk_main_quit ();
- return FALSE;
- }
-
- return TRUE;
-}
-
-gint
-yad_notification_run ()
-{
- GIOChannel *channel = NULL;
-
- status_icon = gtk_status_icon_new ();
- g_signal_connect (status_icon, "size-changed",
- G_CALLBACK (icon_size_changed_cb), NULL);
-
- if (options.data.dialog_text)
- {
-#if GTK_CHECK_VERSION(2,16,0)
- if (options.data.no_markup)
- gtk_status_icon_set_tooltip_markup (status_icon, options.data.dialog_text);
- else
- gtk_status_icon_set_tooltip_text (status_icon, options.data.dialog_text);
-#else
- gtk_status_icon_set_tooltip (status_icon, options.data.dialog_text);
-#endif
- }
- else
-#if GTK_CHECK_VERSION(2,16,0)
- gtk_status_icon_set_tooltip_text (status_icon, _("Yad notification"));
-#else
- gtk_status_icon_set_tooltip (status_icon, _("Yad notification"));
-#endif
-
- if (options.data.dialog_image)
- icon = g_strdup (options.data.dialog_image);
- if (options.common_data.command)
- action = g_strdup (options.common_data.command);
- menu_data = NULL;
-
- g_signal_connect (status_icon, "activate",
- G_CALLBACK (activate_cb), NULL);
-
- /* quit on middle click (like press Esc) */
- g_signal_connect (status_icon, "button-press-event",
- G_CALLBACK (middle_quit_cb), NULL);
-
- if (options.notification_data.listen)
- {
- channel = g_io_channel_unix_new (0);
- if (channel)
- {
- g_io_channel_set_encoding (channel, NULL, NULL);
- g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL);
- g_io_add_watch (channel, G_IO_IN | G_IO_HUP, handle_stdin, NULL);
-
- g_signal_connect (status_icon, "popup_menu",
- G_CALLBACK (popup_menu_cb), NULL);
- }
- }
-
- /* Show icon and wait */
- gtk_status_icon_set_visible (status_icon, TRUE);
-
- if (options.data.timeout > 0)
- g_timeout_add_seconds (options.data.timeout,
- (GSourceFunc) timeout_cb, NULL);
-
- gtk_main ();
-
- return exit_code;
-}