aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2007-01-31 07:26:51 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2007-01-31 07:26:51 +0000
commit2ac1c1760adf98f465e2977f85fcc641edc29d13 (patch)
tree17101f3c4ea58147b498bedb89a51518d4009d58
parenta381897d19f69b21bbb072e3559ea13d5953b58a (diff)
reimplemented the toolbar with new APIs.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@1514 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog9
-rw-r--r--ChangeLog.ja9
-rw-r--r--src/compose.c79
-rw-r--r--src/gtkutils.c22
-rw-r--r--src/gtkutils.h6
-rw-r--r--src/mainwindow.c70
-rw-r--r--src/menu.c1
7 files changed, 143 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog
index 3645919a..9e9e4dcd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-01-31
+
+ * src/compose.c
+ src/menu.c
+ src/gtkutils.[ch]
+ src/mainwindow.c: reimplemented the toolbar with new APIs.
+ Overflow menu was added, and the size of button became not fully
+ homogeneous.
+
2007-01-30
* libsylph/mh.c: mh_scan_tree_recursive(): also scan symbolic links.
diff --git a/ChangeLog.ja b/ChangeLog.ja
index f9637cf1..bb75bd48 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,3 +1,12 @@
+2007-01-31
+
+ * src/compose.c
+ src/menu.c
+ src/gtkutils.[ch]
+ src/mainwindow.c: ツールバーを新しい API で実装し直した。
+ オーバーフローメニューを追加。ボタンのサイズを全て同一にはしない
+ ようにした。
+
2007-01-30
* libsylph/mh.c: mh_scan_tree_recursive(): シンボリックリンクも
diff --git a/src/compose.c b/src/compose.c
index 2455e391..5eefede0 100644
--- a/src/compose.c
+++ b/src/compose.c
@@ -50,6 +50,9 @@
#include <gtk/gtkvbox.h>
#include <gtk/gtkcontainer.h>
#include <gtk/gtktoolbar.h>
+#include <gtk/gtktoolitem.h>
+#include <gtk/gtktoolbutton.h>
+#include <gtk/gtkseparatortoolitem.h>
#include <gtk/gtktable.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtklabel.h>
@@ -4736,11 +4739,16 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
FALSE);
#endif
- gtk_widget_set_sensitive(compose->insert_btn, FALSE);
- gtk_widget_set_sensitive(compose->attach_btn, FALSE);
- gtk_widget_set_sensitive(compose->sig_btn, FALSE);
- gtk_widget_set_sensitive(compose->exteditor_btn, FALSE);
- gtk_widget_set_sensitive(compose->linewrap_btn, FALSE);
+ if (compose->insert_btn)
+ gtk_widget_set_sensitive(compose->insert_btn, FALSE);
+ if (compose->attach_btn)
+ gtk_widget_set_sensitive(compose->attach_btn, FALSE);
+ if (compose->sig_btn)
+ gtk_widget_set_sensitive(compose->sig_btn, FALSE);
+ if (compose->exteditor_btn)
+ gtk_widget_set_sensitive(compose->exteditor_btn, FALSE);
+ if (compose->linewrap_btn)
+ gtk_widget_set_sensitive(compose->linewrap_btn, FALSE);
/* gtk_widget_set_sensitive(compose->attach_toggle, FALSE); */
@@ -4892,7 +4900,7 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose,
{
GtkWidget *toolbar;
GtkWidget *icon_wid;
- GtkWidget *button;
+ GtkToolItem *toolitem;
gint i;
GList *cur;
@@ -4900,8 +4908,6 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose,
gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
GTK_ORIENTATION_HORIZONTAL);
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
- gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),
- GTK_ICON_SIZE_LARGE_TOOLBAR);
g_signal_connect(G_OBJECT(toolbar), "button_press_event",
G_CALLBACK(toolbar_button_pressed), compose);
@@ -4920,9 +4926,12 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose,
for (cur = item_list; cur != NULL; cur = cur->next) {
const PrefsDisplayItem *ditem = cur->data;
PrefsToolbarItem *item;
+ GtkTooltips *tips;
+ gint width;
if (ditem->id == T_SEPARATOR) {
- gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
+ toolitem = gtk_separator_tool_item_new();
+ gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
continue;
}
@@ -4933,19 +4942,31 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose,
if (item->id == -1)
continue;
- icon_wid = stock_pixbuf_widget(NULL, item->icon);
+ if (item->stock_id) {
+ icon_wid = gtk_image_new_from_stock
+ (item->stock_id, GTK_ICON_SIZE_LARGE_TOOLBAR);
+ } else
+ icon_wid = stock_pixbuf_widget(NULL, item->icon);
+
+ toolitem = gtk_tool_button_new(icon_wid, gettext(ditem->label));
+ tips = gtk_tooltips_new();
+ gtk_tool_item_set_tooltip(toolitem, tips,
+ gettext(item->tooltip), ditem->name);
+
+ gtkut_get_str_size(GTK_WIDGET(toolitem), gettext(ditem->label),
+ &width, NULL);
+ gtk_tool_item_set_homogeneous
+ (toolitem, width < 52 ? TRUE : FALSE);
- button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
- gettext(ditem->label),
- gettext(item->tooltip),
- ditem->name, icon_wid,
- G_CALLBACK(item->callback),
- compose);
+ gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
- g_signal_connect(G_OBJECT(button), "button_press_event",
+ g_signal_connect(G_OBJECT(toolitem), "clicked",
+ G_CALLBACK(item->callback), compose);
+ g_signal_connect(G_OBJECT(GTK_BIN(toolitem)->child),
+ "button_press_event",
G_CALLBACK(toolbar_button_pressed), compose);
- *(GtkWidget **)item->data = button;
+ *(GtkWidget **)item->data = GTK_WIDGET(toolitem);
}
gtk_widget_show_all(toolbar);
@@ -5793,14 +5814,20 @@ static void compose_set_ext_editor_sensitive(Compose *compose,
menu_set_sensitive(ifactory, "/Tools/Edit with external editor",
sensitive);
- gtk_widget_set_sensitive(compose->text, sensitive);
- gtk_widget_set_sensitive(compose->send_btn, sensitive);
- gtk_widget_set_sensitive(compose->sendl_btn, sensitive);
- gtk_widget_set_sensitive(compose->draft_btn, sensitive);
- gtk_widget_set_sensitive(compose->insert_btn, sensitive);
- gtk_widget_set_sensitive(compose->sig_btn, sensitive);
- gtk_widget_set_sensitive(compose->exteditor_btn, sensitive);
- gtk_widget_set_sensitive(compose->linewrap_btn, sensitive);
+#define SET_SENS(w) \
+ if (compose->w) \
+ gtk_widget_set_sensitive(compose->w, sensitive);
+
+ SET_SENS(text);
+ SET_SENS(send_btn);
+ SET_SENS(sendl_btn);
+ SET_SENS(draft_btn);
+ SET_SENS(insert_btn);
+ SET_SENS(sig_btn);
+ SET_SENS(exteditor_btn);
+ SET_SENS(linewrap_btn);
+
+#undef SET_SENS
}
/**
diff --git a/src/gtkutils.c b/src/gtkutils.c
index d7c620f7..18e1b89b 100644
--- a/src/gtkutils.c
+++ b/src/gtkutils.c
@@ -1,6 +1,6 @@
/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2007 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -47,23 +47,33 @@
#include "codeconv.h"
#include "menu.h"
-gboolean gtkut_get_font_size(GtkWidget *widget, gint *width, gint *height)
+gboolean gtkut_get_str_size(GtkWidget *widget, const gchar *str,
+ gint *width, gint *height)
{
PangoLayout *layout;
- const gchar *str = "Abcdef";
g_return_val_if_fail(GTK_IS_WIDGET(widget), FALSE);
layout = gtk_widget_create_pango_layout(widget, str);
g_return_val_if_fail(layout, FALSE);
pango_layout_get_pixel_size(layout, width, height);
- if (width)
- *width = *width / g_utf8_strlen(str, -1);
g_object_unref(layout);
return TRUE;
}
+gboolean gtkut_get_font_size(GtkWidget *widget, gint *width, gint *height)
+{
+ const gchar *str = "Abcdef";
+ gboolean ret;
+
+ ret = gtkut_get_str_size(widget, str, width, height);
+ if (ret && width)
+ *width = *width / g_utf8_strlen(str, -1);
+
+ return ret;
+}
+
PangoFontDescription *gtkut_get_default_font_desc(void)
{
static PangoFontDescription *font_desc = NULL;
@@ -262,10 +272,12 @@ ComboButton *gtkut_combo_button_create(GtkWidget *button,
g_signal_connect(G_OBJECT(combo->button), "size_request",
G_CALLBACK(combo_button_size_request), combo);
+#if 0
g_signal_connect(G_OBJECT(combo->button), "enter",
G_CALLBACK(combo_button_enter), combo);
g_signal_connect(G_OBJECT(combo->button), "leave",
G_CALLBACK(combo_button_leave), combo);
+#endif
g_signal_connect(G_OBJECT(combo->arrow), "enter",
G_CALLBACK(combo_button_enter), combo);
g_signal_connect(G_OBJECT(combo->arrow), "leave",
diff --git a/src/gtkutils.h b/src/gtkutils.h
index ebc9bfed..7afa31be 100644
--- a/src/gtkutils.h
+++ b/src/gtkutils.h
@@ -1,6 +1,6 @@
/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2007 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -82,6 +82,10 @@ struct _ComboButton
#define GTKUT_CTREE_REFRESH(clist) \
GTK_CLIST_GET_CLASS(clist)->refresh(clist)
+gboolean gtkut_get_str_size (GtkWidget *widget,
+ const gchar *str,
+ gint *width,
+ gint *height);
gboolean gtkut_get_font_size (GtkWidget *widget,
gint *width,
gint *height);
diff --git a/src/mainwindow.c b/src/mainwindow.c
index 7ebc2216..075d1f79 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -39,6 +39,9 @@
#include <gtk/gtkmenu.h>
#include <gtk/gtkmenuitem.h>
#include <gtk/gtktoolbar.h>
+#include <gtk/gtktoolitem.h>
+#include <gtk/gtktoolbutton.h>
+#include <gtk/gtkseparatortoolitem.h>
#include <gtk/gtkbutton.h>
#include <gtk/gtktooltips.h>
#include <gtk/gtkarrow.h>
@@ -2438,7 +2441,8 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin,
{
GtkWidget *toolbar;
GtkWidget *icon_wid;
- GtkWidget *button;
+ GtkToolItem *toolitem;
+ GtkToolItem *comboitem;
ComboButton *combo;
gint n_entries;
gint i;
@@ -2448,8 +2452,6 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin,
gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
GTK_ORIENTATION_HORIZONTAL);
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
- gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),
- GTK_ICON_SIZE_LARGE_TOOLBAR);
g_signal_connect(G_OBJECT(toolbar), "button_press_event",
G_CALLBACK(toolbar_button_pressed), mainwin);
@@ -2477,9 +2479,12 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin,
for (cur = item_list; cur != NULL; cur = cur->next) {
const PrefsDisplayItem *ditem = cur->data;
PrefsToolbarItem *item;
+ GtkTooltips *tips;
+ gint width;
if (ditem->id == T_SEPARATOR) {
- gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
+ toolitem = gtk_separator_tool_item_new();
+ gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
continue;
}
@@ -2496,45 +2501,70 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin,
} else
icon_wid = stock_pixbuf_widget(NULL, item->icon);
- button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar),
- gettext(ditem->label),
- gettext(item->tooltip),
- ditem->name, icon_wid,
- G_CALLBACK(item->callback),
- mainwin);
+ toolitem = gtk_tool_button_new(icon_wid, gettext(ditem->label));
+ tips = gtk_tooltips_new();
+ gtk_tool_item_set_tooltip(toolitem, tips,
+ gettext(item->tooltip), ditem->name);
+
+ gtkut_get_str_size(GTK_WIDGET(toolitem), gettext(ditem->label),
+ &width, NULL);
+ gtk_tool_item_set_homogeneous
+ (toolitem, width < 52 ? TRUE : FALSE);
+
+ gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
- g_signal_connect(G_OBJECT(button), "button_press_event",
+ g_signal_connect(G_OBJECT(toolitem), "clicked",
+ G_CALLBACK(item->callback), mainwin);
+ g_signal_connect(G_OBJECT(GTK_BIN(toolitem)->child),
+ "button_press_event",
G_CALLBACK(toolbar_button_pressed), mainwin);
if (ditem->id == T_REPLY) {
n_entries = sizeof(reply_entries) /
sizeof(reply_entries[0]);
combo = gtkut_combo_button_create
- (button, reply_entries, n_entries, "<Reply>",
- mainwin);
+ (GTK_WIDGET(toolitem),
+ reply_entries, n_entries, "<Reply>", mainwin);
gtk_button_set_relief(GTK_BUTTON(combo->arrow),
GTK_RELIEF_NONE);
- gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),
- GTK_WIDGET_PTR(combo),
+
+ comboitem = gtk_tool_item_new();
+ gtk_tool_item_set_homogeneous(comboitem, FALSE);
+ gtk_container_add(GTK_CONTAINER(comboitem),
+ GTK_WIDGET_PTR(combo));
+ tips = gtk_tooltips_new();
+ gtk_tool_item_set_tooltip(comboitem, tips,
gettext(item->tooltip),
ditem->name);
+
+ gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1);
+
mainwin->reply_combo = combo;
} else if (ditem->id == T_FORWARD) {
n_entries = sizeof(forward_entries) /
sizeof(forward_entries[0]);
combo = gtkut_combo_button_create
- (button, forward_entries, n_entries,
- "<Forward>", mainwin);
+ (GTK_WIDGET(toolitem),
+ forward_entries, n_entries, "<Forward>",
+ mainwin);
gtk_button_set_relief(GTK_BUTTON(combo->arrow),
GTK_RELIEF_NONE);
- gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar),
- GTK_WIDGET_PTR(combo),
+
+ comboitem = gtk_tool_item_new();
+ gtk_tool_item_set_homogeneous(comboitem, FALSE);
+ gtk_container_add(GTK_CONTAINER(comboitem),
+ GTK_WIDGET_PTR(combo));
+ tips = gtk_tooltips_new();
+ gtk_tool_item_set_tooltip(comboitem, tips,
gettext(item->tooltip),
ditem->name);
+
+ gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1);
+
mainwin->fwd_combo = combo;
}
- *(GtkWidget **)item->data = button;
+ *(GtkWidget **)item->data = GTK_WIDGET(toolitem);
}
gtk_widget_show_all(toolbar);
diff --git a/src/menu.c b/src/menu.c
index baba7f7c..f956b312 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -195,7 +195,6 @@ void menu_button_position(GtkMenu *menu, gint *x, gint *y, gboolean *push_in,
gint scr_width, scr_height;
g_return_if_fail(x != NULL && y != NULL);
- g_return_if_fail(GTK_IS_BUTTON(user_data));
button = GTK_WIDGET(user_data);