|
Packit |
4e910c |
/* vim: set sw=2 et: */
|
|
Packit |
4e910c |
/*
|
|
Packit |
4e910c |
* Copyright (C) 2009 Vincent Untz
|
|
Packit |
4e910c |
*
|
|
Packit |
4e910c |
* This library is free software; you can redistribute it and/or
|
|
Packit |
4e910c |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4e910c |
* License as published by the Free Software Foundation; either
|
|
Packit |
4e910c |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
4e910c |
*
|
|
Packit |
4e910c |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
4e910c |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4e910c |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4e910c |
* Lesser General Public License for more details.
|
|
Packit |
4e910c |
*
|
|
Packit |
4e910c |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4e910c |
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4e910c |
*
|
|
Packit |
4e910c |
* Authors:
|
|
Packit |
4e910c |
* Vincent Untz <vuntz@gnome.org>
|
|
Packit |
4e910c |
*/
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
#include <config.h>
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
#include <stdlib.h>
|
|
Packit |
4e910c |
#include <string.h>
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
#include <gtk/gtk.h>
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
#include <libwnck/libwnck.h>
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
status_icon_activated (GtkStatusIcon *icon,
|
|
Packit |
4e910c |
WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
WnckWorkspace *workspace;
|
|
Packit |
4e910c |
guint32 timestamp;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
/* We're in an activate callback, so gtk_get_current_time() works... */
|
|
Packit |
4e910c |
timestamp = gtk_get_current_event_time ();
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
/* FIXME: THIS IS SICK AND WRONG AND BUGGY. See the end of
|
|
Packit |
4e910c |
* http://mail.gnome.org/archives/wm-spec-list/2005-July/msg00032.html
|
|
Packit |
4e910c |
* There should only be *one* activate call.
|
|
Packit |
4e910c |
*/
|
|
Packit |
4e910c |
workspace = wnck_window_get_workspace (window);
|
|
Packit |
4e910c |
if (workspace)
|
|
Packit |
4e910c |
wnck_workspace_activate (workspace, timestamp);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
wnck_window_activate (window, timestamp);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static GtkStatusIcon *
|
|
Packit |
4e910c |
status_icon_get (WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
return g_object_get_data (G_OBJECT (window), "wnck-urgency-icon");
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
status_icon_update (WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
GtkStatusIcon *icon;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
icon = status_icon_get (window);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
if (icon == NULL)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
return;
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4e910c |
if (wnck_window_get_icon_is_fallback (window))
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
gtk_status_icon_set_from_icon_name (icon, "dialog-information");
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
else
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
gtk_status_icon_set_from_pixbuf (icon,
|
|
Packit |
4e910c |
wnck_window_get_mini_icon (window));
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
gtk_status_icon_set_tooltip_text (icon, wnck_window_get_name (window));
|
|
Packit |
4e910c |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
status_icon_create (WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
GtkStatusIcon *icon;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4e910c |
icon = gtk_status_icon_new ();
|
|
Packit |
4e910c |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
g_object_set_data (G_OBJECT (window), "wnck-urgency-icon", icon);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
g_signal_connect (icon, "activate",
|
|
Packit |
4e910c |
G_CALLBACK (status_icon_activated), window);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
status_icon_update (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
status_icon_remove (WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
GtkStatusIcon *icon;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
icon = status_icon_get (window);
|
|
Packit |
4e910c |
if (icon != NULL)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
Packit |
4e910c |
gtk_status_icon_set_visible (icon, FALSE);
|
|
Packit |
4e910c |
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
g_object_unref (icon);
|
|
Packit |
4e910c |
g_object_set_data (G_OBJECT (window), "wnck-urgency-icon", NULL);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
window_state_changed (WnckWindow *window,
|
|
Packit |
4e910c |
WnckWindowState changed_mask,
|
|
Packit |
4e910c |
WnckWindowState new_state,
|
|
Packit |
4e910c |
gpointer data)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
GtkStatusIcon *icon;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
if (!
|
|
Packit |
4e910c |
(changed_mask &
|
|
Packit |
4e910c |
(WNCK_WINDOW_STATE_DEMANDS_ATTENTION |
|
|
Packit |
4e910c |
WNCK_WINDOW_STATE_URGENT)))
|
|
Packit |
4e910c |
return;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
icon = status_icon_get (window);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
if (wnck_window_or_transient_needs_attention (window))
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
if (icon == NULL)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
status_icon_create (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
else
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
status_icon_remove (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
window_icon_changed (WnckWindow *window,
|
|
Packit |
4e910c |
gpointer data)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
status_icon_update (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
window_name_changed (WnckWindow *window,
|
|
Packit |
4e910c |
gpointer data)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
status_icon_update (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
connect_to_window (WnckScreen *screen,
|
|
Packit |
4e910c |
WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
if (wnck_window_or_transient_needs_attention (window))
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
status_icon_create (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
g_signal_connect (window, "state_changed",
|
|
Packit |
4e910c |
G_CALLBACK (window_state_changed), NULL);
|
|
Packit |
4e910c |
g_signal_connect (window, "icon_changed",
|
|
Packit |
4e910c |
G_CALLBACK (window_icon_changed), NULL);
|
|
Packit |
4e910c |
g_signal_connect (window, "name_changed",
|
|
Packit |
4e910c |
G_CALLBACK (window_name_changed), NULL);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
static void
|
|
Packit |
4e910c |
disconnect_from_window (WnckScreen *screen,
|
|
Packit |
4e910c |
WnckWindow *window)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
status_icon_remove (window);
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
int
|
|
Packit |
4e910c |
main (int argc, char **argv)
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
GOptionContext *ctxt;
|
|
Packit |
4e910c |
GError *error;
|
|
Packit |
4e910c |
WnckScreen *screen;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
ctxt = g_option_context_new (NULL);
|
|
Packit |
4e910c |
g_option_context_set_summary (ctxt, "Monitor windows with the urgency hint "
|
|
Packit |
4e910c |
"set, and display a notification icon "
|
|
Packit |
4e910c |
"for each of them.");
|
|
Packit |
4e910c |
g_option_context_add_group (ctxt, gtk_get_option_group (TRUE));
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
error = NULL;
|
|
Packit |
4e910c |
if (!g_option_context_parse (ctxt, &argc, &argv, &error))
|
|
Packit |
4e910c |
{
|
|
Packit |
4e910c |
g_printerr ("Error while parsing arguments: %s\n", error->message);
|
|
Packit |
4e910c |
g_option_context_free (ctxt);
|
|
Packit |
4e910c |
g_error_free (error);
|
|
Packit |
4e910c |
return 1;
|
|
Packit |
4e910c |
}
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
g_option_context_free (ctxt);
|
|
Packit |
4e910c |
ctxt = NULL;
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
gtk_init (&argc, &argv);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
wnck_set_client_type (WNCK_CLIENT_TYPE_PAGER);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
screen = wnck_screen_get_default ();
|
|
Packit |
4e910c |
g_signal_connect (screen, "window_opened",
|
|
Packit |
4e910c |
G_CALLBACK (connect_to_window), NULL);
|
|
Packit |
4e910c |
g_signal_connect (screen, "window_closed",
|
|
Packit |
4e910c |
G_CALLBACK (disconnect_from_window), NULL);
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
gtk_main ();
|
|
Packit |
4e910c |
|
|
Packit |
4e910c |
return 0;
|
|
Packit |
4e910c |
}
|