aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxx Cao <maxx.cao@sun.com>2003-07-10 20:20:04 +0800
committerYuedong Du <york@src.gnome.org>2003-07-10 20:20:04 +0800
commitcd534174fa78742f4f16f385cfd8cb214928c27b (patch)
tree82bfc152cfa3e153a21bf9b1ba5318c9290d5de5
parentaf1b0565e9eb792500eeba6e56d5a5c5efa855bd (diff)
downloadgsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.tar
gsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.tar.gz
gsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.tar.bz2
gsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.tar.lz
gsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.tar.xz
gsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.tar.zst
gsoc2013-evolution-cd534174fa78742f4f16f385cfd8cb214928c27b.zip
** For bug #41839
2003-07-04 Maxx Cao <maxx.cao@sun.com> ** For bug #41839 * mail-display.c (do_attachment_header): Attachment buttons made accessable with keyboard (focusable). "Inline" button is disabled when attachment can't be viewed inline. (do_signature): Signature button made accessable with keyboard (focusable). (button_press): Function changed to an event callback (originally gtkbutton signal callback). (popup_menu_placement_callback): Function added to place popup menu (of attachment) beside button when activated by keyboard. svn path=/trunk/; revision=21788
-rw-r--r--mail/ChangeLog14
-rw-r--r--mail/mail-display.c88
2 files changed, 76 insertions, 26 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index e6b5e1478b..72ab01a47e 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,17 @@
+2003-07-04 Maxx Cao <maxx.cao@sun.com>
+
+ ** For bug #41839
+
+ * mail-display.c (do_attachment_header): Attachment buttons made
+ accessable with keyboard (focusable). "Inline" button is disabled
+ when attachment can't be viewed inline.
+ (do_signature): Signature button made accessable with keyboard
+ (focusable).
+ (button_press): Function changed to an event callback (originally
+ gtkbutton signal callback).
+ (popup_menu_placement_callback): Function added to place popup
+ menu (of attachment) beside button when activated by keyboard.
+
2003-07-10 Yuedong Du <yuedong.du@sun.com>
* evolution-mail.schemas: add a gconf key corresponding to newly
diff --git a/mail/mail-display.c b/mail/mail-display.c
index 634542cd51..d62c985d32 100644
--- a/mail/mail-display.c
+++ b/mail/mail-display.c
@@ -49,6 +49,7 @@
#include <bonobo/bonobo-widget.h>
#include <bonobo/bonobo-socket.h>
+#include <gdk/gdkkeysyms.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk-pixbuf/gdk-pixbuf-loader.h>
#include <gal/util/e-util.h>
@@ -433,25 +434,45 @@ inline_cb (GtkWidget *widget, gpointer user_data)
mail_display_queue_redisplay (md);
}
-static void
-button_press (GtkWidget *widget, CamelMimePart *part)
+static gboolean
+button_press (GtkWidget *widget, GdkEvent *event, CamelMimePart *part)
{
MailDisplay *md;
-
+
+ if (event->type == GDK_BUTTON_PRESS)
+ g_signal_stop_emission_by_name (widget, "button_press_event");
+ else if (event->type == GDK_KEY_PRESS && event->key.keyval != GDK_Return)
+ return FALSE;
+
md = g_object_get_data ((GObject *) widget, "MailDisplay");
if (md == NULL) {
g_warning ("No MailDisplay on button!");
- return;
+ return TRUE;
}
mail_part_toggle_displayed (part, md);
mail_display_queue_redisplay (md);
+
+ return TRUE;
+}
+
+static void
+popup_menu_placement_callback(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data)
+{
+ GtkWidget *widget = (GtkWidget*) user_data;
+
+ gdk_window_get_origin (gtk_widget_get_parent_window (widget), x, y);
+ *x += widget->allocation.x + widget->allocation.width;
+ *y += widget->allocation.y;
+
+ return;
}
static gboolean
-pixmap_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+pixmap_press (GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
EPopupMenu *menu;
+ GtkMenu *gtk_menu;
EPopupMenu save_item = E_POPUP_ITEM (N_("Save Attachment..."), G_CALLBACK (save_cb), 0);
EPopupMenu view_item = E_POPUP_ITEM (N_("View Inline"), G_CALLBACK (inline_cb), 2);
EPopupMenu open_item = E_POPUP_ITEM (N_("Open in %s..."), G_CALLBACK (launch_cb), 1);
@@ -460,24 +481,28 @@ pixmap_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
MailMimeHandler *handler;
int mask = 0, i, nitems;
+ if (event->type == GDK_BUTTON_PRESS) {
#ifdef USE_OLD_DISPLAY_STYLE
- if (event->button != 3) {
- gtk_propagate_event (GTK_WIDGET (user_data),
- (GdkEvent *)event);
- return TRUE;
- }
+ if (event->button.button != 3) {
+ gtk_propagate_event (GTK_WIDGET (user_data),
+ (GdkEvent *)event);
+ return TRUE;
+ }
#endif
-
- if (event->button != 1 && event->button != 3) {
- gtk_propagate_event (GTK_WIDGET (user_data),
- (GdkEvent *)event);
- return TRUE;
+
+ if (event->button.button != 1 && event->button.button != 3) {
+ gtk_propagate_event (GTK_WIDGET (user_data),
+ (GdkEvent *)event);
+ return TRUE;
+ }
+ /* Stop the signal, since we don't want the button's class method to
+ mess up our popup. */
+ g_signal_stop_emission_by_name (widget, "button_press_event");
+ } else {
+ if (event->key.keyval != GDK_Return)
+ return FALSE;
}
- /* Stop the signal, since we don't want the button's class method to
- mess up our popup. */
- g_signal_stop_emission_by_name (widget, "button_press_event");
-
part = g_object_get_data ((GObject *) widget, "CamelMimePart");
handler = mail_lookup_handler (g_object_get_data ((GObject *) widget, "mime_type"));
@@ -538,7 +563,13 @@ pixmap_press (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
mask |= 1;
}
- e_popup_menu_run (menu, (GdkEvent *)event, mask, 0, widget);
+ gtk_menu = e_popup_menu_create (menu, mask, 0, widget);
+ e_auto_kill_popup_menu_on_selection_done (gtk_menu);
+
+ if (event->type == GDK_BUTTON_PRESS)
+ gtk_menu_popup (gtk_menu, NULL, NULL, NULL, (gpointer)widget, event->button.button, event->button.time);
+ else
+ gtk_menu_popup (gtk_menu, NULL, NULL, popup_menu_placement_callback, (gpointer)widget, 0, event->key.time);
for (i = 1; i < nitems; i++)
g_free (menu[i].name);
@@ -983,12 +1014,16 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb,
mainbox = gtk_hbox_new (FALSE, 0);
button = gtk_button_new ();
- GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
g_object_set_data ((GObject *) button, "MailDisplay", md);
handler = mail_lookup_handler (eb->type);
- if (handler && handler->builtin)
- g_signal_connect (button, "clicked", G_CALLBACK (button_press), part);
+ if (handler && handler->builtin) {
+ g_signal_connect (button, "button_press_event", G_CALLBACK (button_press), part);
+ g_signal_connect (button, "key_press_event", G_CALLBACK (button_press), part);
+ } else {
+ gtk_widget_set_sensitive (button, FALSE);
+ GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
+ }
/* Drag & Drop */
drag_types[DND_TARGET_TYPE_PART_MIME_TYPE].target = header_content_type_simple (part->content_type);
@@ -1016,7 +1051,6 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb,
gtk_container_add (GTK_CONTAINER (button), hbox);
popup = gtk_button_new ();
- GTK_WIDGET_UNSET_FLAGS (popup, GTK_CAN_FOCUS);
gtk_container_add (GTK_CONTAINER (popup),
gtk_arrow_new (GTK_ARROW_DOWN,
GTK_SHADOW_ETCHED_IN));
@@ -1026,6 +1060,7 @@ do_attachment_header (GtkHTML *html, GtkHTMLEmbedded *eb,
g_object_set_data_full ((GObject *) popup, "mime_type", g_strdup (eb->type), (GDestroyNotify) g_free);
g_signal_connect (popup, "button_press_event", G_CALLBACK (pixmap_press), md->scroll);
+ g_signal_connect (popup, "key_press_event", G_CALLBACK (pixmap_press), md->scroll);
gtk_box_pack_start (GTK_BOX (mainbox), button, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (mainbox), popup, TRUE, TRUE, 0);
@@ -1120,9 +1155,10 @@ do_signature (GtkHTML *html, GtkHTMLEmbedded *eb,
g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc) pixbuf_gen_idle, pbl, NULL);
button = gtk_button_new ();
- GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
g_object_set_data ((GObject *) button, "MailDisplay", md);
- g_signal_connect (button, "clicked", G_CALLBACK (button_press), part);
+ g_signal_connect (button, "button_press_event", G_CALLBACK (button_press), part);
+ g_signal_connect (button, "key_press_event", G_CALLBACK (button_press), part);
+
gtk_container_add (GTK_CONTAINER (button), pbl->pixmap);
gtk_widget_show_all (button);
gtk_container_add (GTK_CONTAINER (eb), button);