1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/* vim: set sw=2 et: */
#include <gtk/gtk.h>
static void
set_urgent (GtkWidget *window,
gboolean urgent)
{
GtkWidget *label;
label = gtk_bin_get_child (GTK_BIN (window));
if (urgent)
{
gtk_window_set_urgency_hint (GTK_WINDOW (window), TRUE);
gtk_window_set_title (GTK_WINDOW (window), "Test Window - Urgent");
gtk_label_set_text (GTK_LABEL (label), "I am urgent!");
}
else
{
gtk_window_set_urgency_hint (GTK_WINDOW (window), FALSE);
gtk_window_set_title (GTK_WINDOW (window), "Test Window");
gtk_label_set_text (GTK_LABEL (label), "I'm not urgent.");
}
}
static gboolean
make_urgent (GtkWidget *widget)
{
set_urgent (widget, TRUE);
g_object_set_data (G_OBJECT (widget), "wnck-timeout", NULL);
return FALSE;
}
static gboolean
focused_in (GtkWidget *widget,
GdkEventFocus *event,
gpointer user_data)
{
guint id;
set_urgent (widget, FALSE);
id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "wnck-timeout"));
g_object_set_data (G_OBJECT (widget), "wnck-timeout", NULL);
if (id)
g_source_remove (id);
return FALSE;
}
static gboolean
focused_out (GtkWidget *widget,
GdkEventFocus *event,
gpointer user_data)
{
guint id;
id = g_timeout_add_seconds (3, (GSourceFunc) make_urgent, widget);
g_object_set_data (G_OBJECT (widget), "wnck-timeout", GUINT_TO_POINTER (id));
return FALSE;
}
int
main (int argc, char **argv)
{
GtkWidget *win;
GtkWidget *label;
gtk_init (&argc, &argv);
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
label = gtk_label_new ("");
gtk_container_add (GTK_CONTAINER (win), label);
gtk_window_set_keep_above (GTK_WINDOW (win), TRUE);
gtk_widget_show_all (win);
g_signal_connect (G_OBJECT (win), "focus-in-event",
G_CALLBACK (focused_in),
NULL);
g_signal_connect (G_OBJECT (win), "focus-out-event",
G_CALLBACK (focused_out),
NULL);
g_signal_connect (G_OBJECT (win), "destroy",
G_CALLBACK (gtk_main_quit),
NULL);
set_urgent (win, FALSE);
gtk_main ();
return 0;
}
|