From 99c7931588e047db24b6c3bbfbcdcd462aa7763c Mon Sep 17 00:00:00 2001 From: hiro Date: Thu, 2 Feb 2006 06:24:28 +0000 Subject: 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 --- src/gtkutils.c | 20 ++++++++++++++++++++ src/gtkutils.h | 1 + src/inc.c | 2 +- src/mainwindow.c | 20 ++++++++++++++++++++ src/mainwindow.h | 1 + src/trayicon.c | 38 +++++++++++++++++++++++++++++--------- 6 files changed, 72 insertions(+), 10 deletions(-) (limited to 'src') 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); } -- cgit v1.2.3