#include "socket.h"
#include "alertpanel.h"
#include "manage_window.h"
+#if !GTK_CHECK_VERSION(3, 0, 0)
#include "gtkshruler.h"
+#endif
#include "folder.h"
#include "addr_compl.h"
#include "quote_fmt.h"
/* callback functions */
+#if !GTK_CHECK_VERSION(3, 0, 0)
static gboolean compose_edit_size_alloc (GtkEditable *widget,
GtkAllocation *allocation,
GtkSHRuler *shruler);
+#endif
static void account_activated (GtkComboBox *optmenu,
gpointer data);
static void attach_selected (GtkTreeView *tree_view,
static void compose_toggle_autoindent_cb(GtkToggleAction *action,
gpointer data);
+#if !GTK_CHECK_VERSION(3, 0, 0)
static void compose_toggle_ruler_cb (GtkToggleAction *action,
gpointer data);
+#endif
static void compose_toggle_sign_cb (GtkToggleAction *action,
gpointer data);
static void compose_toggle_encrypt_cb (GtkToggleAction *action,
{"Options/Encrypt", NULL, N_("_Encrypt"), NULL, NULL, G_CALLBACK(compose_toggle_encrypt_cb) }, /* Toggle */
{"Options/RequestRetRcpt", NULL, N_("_Request Return Receipt"), NULL, NULL, G_CALLBACK(compose_toggle_return_receipt_cb) }, /* TOGGLE */
{"Options/RemoveReferences", NULL, N_("Remo_ve references"), NULL, NULL, G_CALLBACK(compose_toggle_remove_refs_cb) }, /* TOGGLE */
+#if !GTK_CHECK_VERSION(3, 0, 0)
{"Tools/ShowRuler", NULL, N_("Show _ruler"), NULL, NULL, G_CALLBACK(compose_toggle_ruler_cb) }, /* Toggle */
+#endif
};
static GtkRadioActionEntry compose_radio_rm_entries[] =
{
GtkTextBuffer *buffer;
GdkColor black = {(gulong)0, (gushort)0, (gushort)0, (gushort)0};
+#if !GTK_CHECK_VERSION(3, 0, 0)
GdkColormap *cmap;
- GdkColor color[8];
gboolean success[8];
+#endif
+ GdkColor color[8];
int i;
buffer = gtk_text_view_get_buffer(text);
color[5] = quote_bgcolor3;
color[6] = signature_color;
color[7] = uri_color;
- cmap = gdk_drawable_get_colormap(compose->window->window);
+#if !GTK_CHECK_VERSION(3, 0, 0)
+ cmap = gdk_drawable_get_colormap(gtk_widget_get_window(compose->window));
gdk_colormap_alloc_colors(cmap, color, 8, FALSE, TRUE, success);
for (i = 0; i < 8; i++) {
signature_color = uri_color = black;
}
}
+#endif
}
Compose *compose_new(PrefsAccount *account, const gchar *mailto,
gchar *mailto_from = NULL;
PrefsAccount *mailto_account = NULL;
MsgInfo* dummyinfo = NULL;
+ gint cursor_pos = -1;
MailField mfield = NO_FIELD_PRESENT;
gchar* buf;
GtkTextMark *mark;
* is therefore created before placing the cursor
*/
case BODY_FIELD_PRESENT:
- gtk_widget_grab_focus(compose->text);
+ cursor_pos = quote_fmt_get_cursor_pos();
+ if (cursor_pos == -1)
+ gtk_widget_grab_focus(compose->header_last->entry);
+ else
+ gtk_widget_grab_focus(compose->text);
break;
}
compose->modified = FALSE;
compose_set_title(compose);
- hooks_invoke(COMPOSE_CREATED_HOOKLIST, compose);
+ hooks_invoke(COMPOSE_CREATED_HOOKLIST, compose);
return compose;
}
Compose *compose;
GtkTextView *textview;
GtkTextBuffer *textbuf;
- GtkTextIter iter;
+ gint cursor_pos = -1;
ComposeMode mode;
cm_return_val_if_fail(msginfo != NULL, NULL);
SIGNAL_UNBLOCK(textbuf);
- gtk_text_buffer_get_start_iter(textbuf, &iter);
- gtk_text_buffer_place_cursor(textbuf, &iter);
-
- gtk_widget_grab_focus(compose->header_last->entry);
+ cursor_pos = quote_fmt_get_cursor_pos();
+ if (cursor_pos == -1)
+ gtk_widget_grab_focus(compose->header_last->entry);
+ else
+ gtk_widget_grab_focus(compose->text);
if (!no_extedit && prefs_common.auto_exteditor)
compose_exec_ext_editor(compose);
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Message/InsertSig", FALSE);
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit", FALSE);
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Options", FALSE);
+#if !GTK_CHECK_VERSION(3, 0, 0)
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Tools/ShowRuler", FALSE);
+#endif
cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Tools/Actions", FALSE);
if (compose->toolbar->draft_btn)
static void compose_entry_mark_default_to(Compose *compose, const gchar *mailto)
{
+#if !GTK_CHECK_VERSION(3, 0, 0)
static GdkColor yellow;
static GdkColor black;
static gboolean yellow_initialised = FALSE;
+#else
+ static GdkColor yellow = { (guint32)0, (guint16)0xf5, (guint16)0xf6, (guint16)0xbe };
+ static GdkColor black = { (guint32)0, (guint16)0x0, (guint16)0x0, (guint16)0x0 };
+#endif
GSList *h_list;
GtkEntry *entry;
+#if !GTK_CHECK_VERSION(3, 0, 0)
if (!yellow_initialised) {
gdk_color_parse("#f5f6be", &yellow);
gdk_color_parse("#000000", &black);
yellow_initialised &= gdk_colormap_alloc_color(
gdk_colormap_get_system(), &black, FALSE, TRUE);
}
+#endif
for (h_list = compose->header_list; h_list != NULL; h_list = h_list->next) {
entry = GTK_ENTRY(((ComposeHeaderEntry *)h_list->data)->entry);
if (gtk_entry_get_text(entry) &&
!g_utf8_collate(gtk_entry_get_text(entry), mailto)) {
+#if !GTK_CHECK_VERSION(3, 0, 0)
if (yellow_initialised) {
+#endif
gtk_widget_modify_base(
GTK_WIDGET(((ComposeHeaderEntry *)h_list->data)->entry),
GTK_STATE_NORMAL, &yellow);
gtk_widget_modify_text(
GTK_WIDGET(((ComposeHeaderEntry *)h_list->data)->entry),
GTK_STATE_NORMAL, &black);
+#if !GTK_CHECK_VERSION(3, 0, 0)
}
+#endif
}
}
}
}
header_entry = (ComposeHeaderEntry *) compose->header_list->data;
- header = gtk_combo_box_text_get_active_text(
- GTK_COMBO_BOX_TEXT(header_entry->combo));
+ header = gtk_combo_box_get_active_text(GTK_COMBO_BOX(header_entry->combo));
if (header && !strlen(gtk_entry_get_text(GTK_ENTRY(header_entry->entry)))) {
if (account->protocol == A_NNTP) {
}
/* Program version and system info */
- if (g_slist_length(compose->to_list) && !IS_IN_CUSTOM_HEADER("X-Mailer") &&
+ if (compose->account->gen_xmailer &&
+ g_slist_length(compose->to_list) && !IS_IN_CUSTOM_HEADER("X-Mailer") &&
!compose->newsgroup_list) {
g_string_append_printf(header, "X-Mailer: %s (GTK+ %d.%d.%d; %s)\n",
prog_version,
cur = cur->next) {
CustomHeader *chdr = (CustomHeader *)cur->data;
- if (custom_header_is_allowed(chdr->name)) {
+ if (custom_header_is_allowed(chdr->name)
+ && chdr->value != NULL
+ && *(chdr->value) != '\0') {
compose_convert_header
(compose, buf, sizeof(buf),
- chdr->value ? chdr->value : "",
+ chdr->value,
strlen(chdr->name) + 2, FALSE);
g_string_append_printf(header, "%s: %s\n", chdr->name, buf);
}
Compose *compose)
{
gint prev_autowrap;
- GtkTextBuffer *buffer = GTK_TEXT_VIEW(text)->buffer;
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
#if USE_ENCHANT
if (event->button == 3) {
GtkTextIter iter;
GtkWidget *paned;
GtkWidget *edit_vbox;
+#if !GTK_CHECK_VERSION(3, 0, 0)
GtkWidget *ruler_hbox;
GtkWidget *ruler;
+#endif
GtkWidget *scrolledwin;
GtkWidget *text;
GtkTextBuffer *buffer;
/* phew. */
/* Tools menu */
+#if !GTK_CHECK_VERSION(3, 0, 0)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Tools", "ShowRuler", "Tools/ShowRuler", GTK_UI_MANAGER_MENUITEM)
+#endif
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Tools", "Template", "Tools/Template", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI_MANAGER(compose->ui_manager, "/Menu/Tools/Template", "PlaceHolder", "Tools/Template/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
gtk_box_pack_start(GTK_BOX(edit_vbox), subject_hbox, FALSE, FALSE, 0);
+#if !GTK_CHECK_VERSION(3, 0, 0)
/* ruler */
ruler_hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(edit_vbox), ruler_hbox, FALSE, FALSE, 0);
gtk_ruler_set_range(GTK_RULER(ruler), 0.0, 100.0, 1.0, 100.0);
gtk_box_pack_start(GTK_BOX(ruler_hbox), ruler, TRUE, TRUE,
BORDER_WIDTH);
+#endif
/* text widget */
scrolledwin = gtk_scrolled_window_new(NULL, NULL);
gtk_text_buffer_add_selection_clipboard(buffer, clipboard);
gtk_container_add(GTK_CONTAINER(scrolledwin), text);
-
+#if !GTK_CHECK_VERSION(3, 0, 0)
g_signal_connect_after(G_OBJECT(text), "size_allocate",
G_CALLBACK(compose_edit_size_alloc),
ruler);
+#endif
g_signal_connect(G_OBJECT(buffer), "changed",
G_CALLBACK(compose_changed_cb), compose);
g_signal_connect(G_OBJECT(text), "grab_focus",
compose->notebook = notebook;
compose->edit_vbox = edit_vbox;
+#if !GTK_CHECK_VERSION(3, 0, 0)
compose->ruler_hbox = ruler_hbox;
compose->ruler = ruler;
+#endif
compose->scrolledwin = scrolledwin;
compose->text = text;
compose_list = g_list_append(compose_list, compose);
+#if !GTK_CHECK_VERSION(3, 0, 0)
if (!prefs_common.show_ruler)
gtk_widget_hide(ruler_hbox);
cm_toggle_menu_set_active_full(compose->ui_manager, "Menu/Tools/ShowRuler", prefs_common.show_ruler);
+#endif
/* Priority */
compose->priority = PRIORITY_NORMAL;
cm_return_if_fail(GTK_IS_CHECK_MENU_ITEM(widget));
- if (!GTK_CHECK_MENU_ITEM(widget)->active)
+ if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
return;
systemid = g_object_get_data(G_OBJECT(widget), "privacy_system");
{
static gchar *branch_path = "/Menu/Options/PrivacySystem";
GtkWidget *menuitem = NULL;
- GList *amenu;
+ GList *children, *amenu;
gboolean can_sign = FALSE, can_encrypt = FALSE;
gboolean found = FALSE;
gtk_ui_manager_get_widget(compose->ui_manager, branch_path)));
cm_return_if_fail(menuitem != NULL);
- amenu = GTK_MENU_SHELL(menuitem)->children;
+ children = gtk_container_get_children(GTK_CONTAINER(GTK_MENU_SHELL(menuitem)));
+ amenu = children;
menuitem = NULL;
while (amenu != NULL) {
- GList *alist = amenu->next;
-
systemid = g_object_get_data(G_OBJECT(amenu->data), "privacy_system");
if (systemid != NULL) {
if (strcmp(systemid, compose->privacy_system) == 0 &&
break;
}
- amenu = alist;
+ amenu = amenu->next;
}
+ g_list_free(children);
if (menuitem != NULL)
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
static void compose_destroy(Compose *compose)
{
+ GtkAllocation allocation;
GtkTextBuffer *buffer;
GtkClipboard *clipboard;
#endif
if (!compose->batch) {
- prefs_common.compose_width = compose->scrolledwin->allocation.width;
- prefs_common.compose_height = compose->window->allocation.height;
+ gtk_widget_get_allocation(compose->scrolledwin, &allocation);
+ prefs_common.compose_width = allocation.width;
+ prefs_common.compose_height = allocation.height;
}
if (!gtk_widget_get_parent(compose->paned))
for (mime_type_list = strlist; mime_type_list != NULL;
mime_type_list = mime_type_list->next) {
- gtk_combo_box_text_append_text(
- GTK_COMBO_BOX_TEXT(mimetype_entry),
- mime_type_list->data);
+ gtk_combo_box_append_text(GTK_COMBO_BOX(mimetype_entry), mime_type_list->data);
g_free(mime_type_list->data);
}
g_list_free(strlist);
GdkEventKey *event,
gboolean *cancelled)
{
- if (event && event->keyval == GDK_Escape) {
+ if (event && event->keyval == GDK_KEY_Escape) {
*cancelled = TRUE;
gtk_main_quit();
}
- if (event && event->keyval == GDK_Return) {
+ if (event && event->keyval == GDK_KEY_Return) {
*cancelled = FALSE;
gtk_main_quit();
return TRUE;
* includes "non-client" (windows-izm) in calculation, so this calculation
* may not be accurate.
*/
+#if !GTK_CHECK_VERSION(3, 0, 0)
static gboolean compose_edit_size_alloc(GtkEditable *widget,
GtkAllocation *allocation,
GtkSHRuler *shruler)
return TRUE;
}
+#endif
typedef struct {
gchar *header;
if (!event) return FALSE;
switch (event->keyval) {
- case GDK_Delete:
+ case GDK_KEY_Delete:
compose_attach_remove_selected(NULL, compose);
break;
}
static void compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
{
+ GtkAllocation allocation;
+ GtkWidget *parent;
gchar *str = NULL;
if (GTK_IS_EDITABLE(widget)) {
gtk_editable_set_position(GTK_EDITABLE(widget),
strlen(str));
g_free(str);
- if (widget->parent && widget->parent->parent
- && widget->parent->parent->parent) {
- if (GTK_IS_SCROLLED_WINDOW(widget->parent->parent->parent)) {
- gint y = widget->allocation.y;
- gint height = widget->allocation.height;
+ if ((parent = gtk_widget_get_parent(widget))
+ && (parent = gtk_widget_get_parent(parent))
+ && (parent = gtk_widget_get_parent(parent))) {
+ if (GTK_IS_SCROLLED_WINDOW(parent)) {
+ gtk_widget_get_allocation(widget, &allocation);
+ gint y = allocation.y;
+ gint height = allocation.height;
GtkAdjustment *shown = gtk_scrolled_window_get_vadjustment
- (GTK_SCROLLED_WINDOW(widget->parent->parent->parent));
+ (GTK_SCROLLED_WINDOW(parent));
- if (y < (int)shown->value) {
- gtk_adjustment_set_value(GTK_ADJUSTMENT(shown), y - 1);
+ gfloat value = gtk_adjustment_get_value(shown);
+ gfloat upper = gtk_adjustment_get_upper(shown);
+ gfloat page_size = gtk_adjustment_get_page_size(shown);
+ if (y < (int)value) {
+ gtk_adjustment_set_value(shown, y - 1);
}
- if (y + height > (int)shown->value + (int)shown->page_size) {
- if (y - height - 1 < (int)shown->upper - (int)shown->page_size) {
- gtk_adjustment_set_value(GTK_ADJUSTMENT(shown),
- y + height - (int)shown->page_size - 1);
+ if ((y + height) > ((int)value + (int)page_size)) {
+ if ((y - height - 1) < ((int)upper - (int)page_size)) {
+ gtk_adjustment_set_value(shown,
+ y + height - (int)page_size - 1);
} else {
- gtk_adjustment_set_value(GTK_ADJUSTMENT(shown),
- (int)shown->upper - (int)shown->page_size - 1);
+ gtk_adjustment_set_value(shown,
+ (int)upper - (int)page_size - 1);
}
}
}
compose_update_privacy_system_menu_item(compose, warn);
}
+#if !GTK_CHECK_VERSION(3, 0, 0)
static void compose_toggle_ruler_cb(GtkToggleAction *action, gpointer data)
{
Compose *compose = (Compose *)data;
prefs_common.show_ruler = FALSE;
}
}
+#endif
static void compose_attach_drag_received_cb (GtkWidget *widget,
GdkDragContext *context,
{
Compose *compose = (Compose *)user_data;
GList *list, *tmp;
+ GdkAtom type;
- if (((gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list"))
+ type = gtk_selection_data_get_data_type(data);
+ if (((gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "text/uri-list"))
#ifdef G_OS_WIN32
- || (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND"))
+ || (gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "DROPFILES_DND"))
#endif
) && gtk_drag_get_source_widget(context) !=
summary_get_main_widget(mainwindow_get_mainwindow()->summaryview)) {
- list = uri_list_extract_filenames((const gchar *)data->data);
+ list = uri_list_extract_filenames(
+ (const gchar *)gtk_selection_data_get_data(data));
for (tmp = list; tmp != NULL; tmp = tmp->next) {
gchar *utf8_filename = conv_filename_to_utf8((const gchar *)tmp->data);
compose_attach_append
{
Compose *compose = (Compose *)user_data;
GList *list, *tmp;
+ GdkAtom type;
/* strangely, testing data->type == gdk_atom_intern("text/uri-list", TRUE)
* does not work */
+ type = gtk_selection_data_get_data_type(data);
#ifndef G_OS_WIN32
- if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "text/uri-list")) {
+ if (gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "text/uri-list")) {
#else
- if (gdk_atom_name(data->type) && !strcmp(gdk_atom_name(data->type), "DROPFILES_DND")) {
+ if (gdk_atom_name(type) && !strcmp(gdk_atom_name(type), "DROPFILES_DND")) {
#endif
AlertValue val = G_ALERTDEFAULT;
+ const gchar* ddata = (const gchar *)gtk_selection_data_get_data(data);
- list = uri_list_extract_filenames((const gchar *)data->data);
- if (list == NULL && strstr((gchar *)(data->data), "://")) {
+ list = uri_list_extract_filenames(ddata);
+ if (list == NULL && strstr(ddata, "://")) {
/* Assume a list of no files, and data has ://, is a remote link */
- gchar *tmpdata = g_strstrip(g_strdup((const gchar *)data->data));
+ gchar *tmpdata = g_strstrip(g_strdup(ddata));
gchar *tmpfile = get_tmp_file();
str_write_to_file(tmpdata, tmpfile);
g_free(tmpdata);
gpointer user_data)
{
GtkEditable *entry = (GtkEditable *)user_data;
- gchar *email = (gchar *)data->data;
+ const gchar *email = (const gchar *)gtk_selection_data_get_data(data);
/* strangely, testing data->type == gdk_atom_intern("text/plain", TRUE)
* does not work */
gchar *decoded=g_new(gchar, strlen(email));
int start = 0;
- email += strlen("mailto:");
- decode_uri(decoded, email); /* will fit */
+ decode_uri(decoded, email + strlen("mailto:")); /* will fit */
gtk_editable_delete_text(entry, 0, -1);
gtk_editable_insert_text(entry, decoded, strlen(decoded), &start);
gtk_drag_finish(drag_context, TRUE, FALSE, time);
if ((g_slist_length(headerentry->compose->header_list) > 0) &&
((headerentry->headernum + 1) != headerentry->compose->header_nextrow) &&
!(event->state & GDK_MODIFIER_MASK) &&
- (event->keyval == GDK_BackSpace) &&
+ (event->keyval == GDK_KEY_BackSpace) &&
(strlen(gtk_entry_get_text(GTK_ENTRY(entry))) == 0)) {
gtk_container_remove
(GTK_CONTAINER(headerentry->compose->header_table),
g_slist_remove(headerentry->compose->header_list,
headerentry);
g_free(headerentry);
- } else if (event->keyval == GDK_Tab) {
+ } else if (event->keyval == GDK_KEY_Tab) {
if (headerentry->compose->header_last == headerentry) {
/* Override default next focus, and give it to subject_entry
* instead of notebook tabs
cm_return_if_fail(compose);
cm_return_if_fail(!compose->batch);
cm_return_if_fail(GTK_IS_WIDGET(compose->header_table));
- cm_return_if_fail(GTK_IS_VIEWPORT(compose->header_table->parent));
- vadj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(compose->header_table->parent));
- gtk_adjustment_set_value(vadj, (show_first ? vadj->lower : (vadj->upper - vadj->page_size)));
+ cm_return_if_fail(GTK_IS_VIEWPORT(gtk_widget_get_parent(compose->header_table)));
+ vadj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(
+ gtk_widget_get_parent(compose->header_table)));
+ gtk_adjustment_set_value(vadj, (show_first ?
+ gtk_adjustment_get_lower(vadj) :
+ (gtk_adjustment_get_upper(vadj) -
+ gtk_adjustment_get_page_size(vadj))));
gtk_adjustment_changed(vadj);
}