aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2006-02-02 06:24:28 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2006-02-02 06:24:28 +0000
commit99c7931588e047db24b6c3bbfbcdcd462aa7763c (patch)
tree84698845874385b773bea3c489c4dc7a729ba8ee /src
parent9277f9708b7f5ce08def8758155fe37352a2e944 (diff)
don't enable trayicon action if modal window exists. Present window on click if main window is obscured.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@962 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/gtkutils.c20
-rw-r--r--src/gtkutils.h1
-rw-r--r--src/inc.c2
-rw-r--r--src/mainwindow.c20
-rw-r--r--src/mainwindow.h1
-rw-r--r--src/trayicon.c38
6 files changed, 72 insertions, 10 deletions
diff --git a/src/gtkutils.c b/src/gtkutils.c
index cdeb4c26..691c3712 100644
--- a/src/gtkutils.c
+++ b/src/gtkutils.c
@@ -868,6 +868,26 @@ void gtkut_window_popup(GtkWidget *window)
gtk_window_present(GTK_WINDOW(window));
}
+gboolean gtkut_window_modal_exist(void)
+{
+ GList *window_list, *cur;
+ gboolean exist = FALSE;
+
+ window_list = gtk_window_list_toplevels();
+ for (cur = window_list; cur != NULL; cur = cur->next) {
+ GtkWidget *window = GTK_WIDGET(cur->data);
+
+ if (GTK_WIDGET_VISIBLE(window) &&
+ gtk_window_get_modal(GTK_WINDOW(window))) {
+ exist = TRUE;
+ break;
+ }
+ }
+ g_list_free(window_list);
+
+ return exist;
+}
+
void gtkut_widget_get_uposition(GtkWidget *widget, gint *px, gint *py)
{
gint x, y;
diff --git a/src/gtkutils.h b/src/gtkutils.h
index 9a2eed0b..15872de2 100644
--- a/src/gtkutils.h
+++ b/src/gtkutils.h
@@ -203,6 +203,7 @@ void gtkut_text_buffer_insert_with_tag_by_name
gchar *gtkut_text_view_get_selection (GtkTextView *textview);
void gtkut_window_popup (GtkWidget *window);
+gboolean gtkut_window_modal_exist (void);
void gtkut_widget_get_uposition (GtkWidget *widget,
gint *px,
diff --git a/src/inc.c b/src/inc.c
index 48d28b1f..87837327 100644
--- a/src/inc.c
+++ b/src/inc.c
@@ -161,7 +161,7 @@ static void inc_finished(MainWindow *mainwin, gint new_messages)
new_messages);
trayicon_set_tooltip(buf);
} else {
- trayicon_set_tooltip(_("Sylpheed"));
+ trayicon_set_tooltip(NULL);
}
if (new_messages <= 0 && !prefs_common.scan_all_after_inc) return;
diff --git a/src/mainwindow.c b/src/mainwindow.c
index e54072fc..3e312bce 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -192,6 +192,9 @@ static void message_window_size_allocate_cb (GtkWidget *widget,
static gboolean main_window_window_state_cb (GtkWidget *widget,
GdkEventWindowState *event,
gpointer data);
+static gboolean main_window_visibility_notify_cb(GtkWidget *widget,
+ GdkEventVisibility *event,
+ gpointer data);
static void new_folder_cb (MainWindow *mainwin,
guint action,
@@ -868,6 +871,7 @@ MainWindow *main_window_create(SeparateType type)
gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
gtk_window_set_wmclass(GTK_WINDOW(window), "main_window", "Sylpheed");
+ gtk_widget_add_events(window, GDK_VISIBILITY_NOTIFY_MASK);
g_signal_connect(G_OBJECT(window), "key_press_event",
G_CALLBACK(main_window_key_pressed), mainwin);
@@ -1044,6 +1048,8 @@ MainWindow *main_window_create(SeparateType type)
G_CALLBACK(main_window_size_allocate_cb), mainwin);
g_signal_connect(G_OBJECT(window), "window_state_event",
G_CALLBACK(main_window_window_state_cb), mainwin);
+ g_signal_connect(G_OBJECT(window), "visibility_notify_event",
+ G_CALLBACK(main_window_visibility_notify_cb), mainwin);
/* set menu items */
menuitem = gtk_item_factory_get_item
@@ -1123,6 +1129,7 @@ MainWindow *main_window_create(SeparateType type)
mainwin->cursor_count = 0;
mainwin->window_hidden = FALSE;
+ mainwin->window_obscured = FALSE;
if (!watch_cursor)
watch_cursor = gdk_cursor_new(GDK_WATCH);
@@ -2798,6 +2805,19 @@ static gboolean main_window_window_state_cb(GtkWidget *widget,
return FALSE;
}
+static gboolean main_window_visibility_notify_cb(GtkWidget *widget,
+ GdkEventVisibility *event,
+ gpointer data)
+{
+ MainWindow *mainwin = (MainWindow *)data;
+
+ mainwin->window_obscured =
+ (event->state == GDK_VISIBILITY_FULLY_OBSCURED ||
+ event->state == GDK_VISIBILITY_PARTIAL) ? TRUE : FALSE;
+
+ return FALSE;
+}
+
static void new_folder_cb(MainWindow *mainwin, guint action,
GtkWidget *widget)
{
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 376d28d2..f5162655 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -117,6 +117,7 @@ struct _MainWindow
guint cursor_count;
gboolean window_hidden;
+ gboolean window_obscured;
FolderView *folderview;
SummaryView *summaryview;
diff --git a/src/trayicon.c b/src/trayicon.c
index 5c7be593..6709185e 100644
--- a/src/trayicon.c
+++ b/src/trayicon.c
@@ -34,6 +34,7 @@
#include "trayicon.h"
#include "mainwindow.h"
#include "utils.h"
+#include "gtkutils.h"
#include "eggtrayicon.h"
#include "stock_pixmap.h"
#include "menu.h"
@@ -49,6 +50,7 @@ static GtkWidget *trayicon_img;
static GtkWidget *eventbox;
static GtkTooltips *trayicon_tip;
static GtkWidget *trayicon_menu;
+static gboolean default_tooltip = FALSE;
static void trayicon_button_pressed (GtkWidget *widget,
GdkEventButton *event,
@@ -64,6 +66,8 @@ static void trayicon_send (GtkWidget *widget,
gpointer data);
static void trayicon_compose (GtkWidget *widget,
gpointer data);
+static void trayicon_about (GtkWidget *widget,
+ gpointer data);
static void trayicon_app_exit (GtkWidget *widget,
gpointer data);
@@ -85,8 +89,9 @@ GtkWidget *trayicon_create(MainWindow *mainwin)
gtk_widget_show(trayicon_img);
gtk_container_add(GTK_CONTAINER(eventbox), trayicon_img);
+ default_tooltip = FALSE;
trayicon_tip = gtk_tooltips_new();
- gtk_tooltips_set_tip(trayicon_tip, trayicon, _("Sylpheed"), NULL);
+ trayicon_set_tooltip(NULL);
if (!trayicon_menu) {
trayicon_menu = gtk_menu_new();
@@ -114,7 +119,7 @@ GtkWidget *trayicon_create(MainWindow *mainwin)
MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
_("_About"), 0);
g_signal_connect(G_OBJECT(menuitem), "activate",
- G_CALLBACK(about_show), NULL);
+ G_CALLBACK(trayicon_about), NULL);
MENUITEM_ADD_WITH_MNEMONIC(trayicon_menu, menuitem,
_("E_xit"), 0);
g_signal_connect(G_OBJECT(menuitem), "activate",
@@ -126,7 +131,14 @@ GtkWidget *trayicon_create(MainWindow *mainwin)
void trayicon_set_tooltip(const gchar *text)
{
- gtk_tooltips_set_tip(trayicon_tip, trayicon, text, NULL);
+ if (text) {
+ default_tooltip = FALSE;
+ gtk_tooltips_set_tip(trayicon_tip, trayicon, text, NULL);
+ } else if (!default_tooltip) {
+ default_tooltip = TRUE;
+ gtk_tooltips_set_tip(trayicon_tip, trayicon, _("Sylpheed"),
+ NULL);
+ }
}
void trayicon_set_stock_icon(StockPixmap icon)
@@ -151,7 +163,7 @@ static void trayicon_button_pressed(GtkWidget *widget, GdkEventButton *event,
return;
if (event->button == 1) {
- if (mainwin->window_hidden) {
+ if (mainwin->window_hidden || mainwin->window_obscured) {
gtk_window_set_skip_taskbar_hint(window, FALSE);
gtk_window_present(window);
} else {
@@ -179,31 +191,39 @@ static void trayicon_destroy_cb(GtkWidget *widget, gpointer data)
static void trayicon_inc(GtkWidget *widget, gpointer data)
{
- if (!inc_is_active())
+ if (!inc_is_active() && !gtkut_window_modal_exist())
inc_mail((MainWindow *)data);
}
static void trayicon_inc_all(GtkWidget *widget, gpointer data)
{
- if (!inc_is_active())
+ if (!inc_is_active() && !gtkut_window_modal_exist())
inc_all_account_mail((MainWindow *)data, FALSE);
}
static void trayicon_send(GtkWidget *widget, gpointer data)
{
- main_window_send_queue((MainWindow *)data);
+ if (!gtkut_window_modal_exist())
+ main_window_send_queue((MainWindow *)data);
}
static void trayicon_compose(GtkWidget *widget, gpointer data)
{
- compose_new(NULL, NULL, NULL, NULL);
+ if (!gtkut_window_modal_exist())
+ compose_new(NULL, NULL, NULL, NULL);
+}
+
+static void trayicon_about(GtkWidget *widget, gpointer data)
+{
+ if (!gtkut_window_modal_exist())
+ about_show();
}
static void trayicon_app_exit(GtkWidget *widget, gpointer data)
{
MainWindow *mainwin = (MainWindow *)data;
- if (mainwin->lock_count == 0)
+ if (mainwin->lock_count == 0 && !gtkut_window_modal_exist())
app_will_exit(FALSE);
}