/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
*
* 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
#ifdef HAVE_CONFIG_H
# include "config.h"
+#include "claws-features.h"
#endif
#include <glib.h>
wcs = g_utf8_to_ucs4(str, -1, &items_read, &items_written, &error);
if (error != NULL) {
- g_warning("An error occured while converting a string from UTF-8 to UCS-4: %s\n",
+ g_warning("An error occurred while converting a string from UTF-8 to UCS-4: %s\n",
error->message);
g_error_free(error);
}
wcs = g_utf8_to_ucs4(str, -1, &items_read, &items_written, &error);
if (error != NULL) {
- g_warning("An error occured while converting a string from UTF-8 to UCS-4: %s\n", error->message);
+ g_warning("An error occurred while converting a string from UTF-8 to UCS-4: %s\n",
+ error->message);
g_error_free(error);
}
if (!wcs || items_written <= 0) return FALSE;
{
GtkTextBuffer *buffer;
GtkTextIter iter;
+ GtkTextMark *mark;
cm_return_if_fail(text != NULL);
gtk_text_buffer_get_iter_at_offset(buffer, &iter, pos);
gtk_text_buffer_place_cursor(buffer, &iter);
- gtk_text_view_scroll_to_iter(text, &iter, 0.0, FALSE, 0.0, 0.0);
+ mark = gtk_text_buffer_create_mark(buffer, NULL, &iter, TRUE);
+ gtk_text_view_scroll_to_mark(text, mark, 0.0, FALSE, 0.0, 0.0);
}
gboolean gtkut_text_view_search_string(GtkTextView *text, const gchar *str,
void gtkut_widget_draw_now(GtkWidget *widget)
{
- if (widget && gtkut_widget_get_visible(widget) && gtkut_widget_is_drawable(widget))
+ if (widget && gtk_widget_get_visible(widget) && gtk_widget_is_drawable(widget))
gdk_window_process_updates(gtk_widget_get_window(widget), FALSE);
}
binding_set = gtk_binding_set_by_class
(GTK_CMCLIST_GET_CLASS(clist));
- gtk_binding_entry_add_signal(binding_set, GDK_n, GDK_CONTROL_MASK,
+ gtk_binding_entry_add_signal(binding_set, GDK_KEY_n, GDK_CONTROL_MASK,
"scroll_vertical", 2,
G_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
G_TYPE_FLOAT, 0.0);
- gtk_binding_entry_add_signal(binding_set, GDK_p, GDK_CONTROL_MASK,
+ gtk_binding_entry_add_signal(binding_set, GDK_KEY_p, GDK_CONTROL_MASK,
"scroll_vertical", 2,
G_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
G_TYPE_FLOAT, 0.0);
void gtkut_widget_set_app_icon(GtkWidget *widget)
{
- static GdkPixbuf *icon = NULL;
-
+ static GList *icon_list = NULL;
+
cm_return_if_fail(widget != NULL);
cm_return_if_fail(gtk_widget_get_window(widget) != NULL);
- if (!icon) {
+ if (!icon_list) {
+ GdkPixbuf *icon = NULL, *big_icon = NULL;
stock_pixbuf_gdk(widget, STOCK_PIXMAP_CLAWS_MAIL_ICON, &icon);
- }
- if (icon)
- gtk_window_set_icon(GTK_WINDOW(widget), icon);
+ stock_pixbuf_gdk(widget, STOCK_PIXMAP_CLAWS_MAIL_LOGO, &big_icon);
+ if (icon)
+ icon_list = g_list_append(icon_list, icon);
+ if (big_icon)
+ icon_list = g_list_append(icon_list, big_icon);
+ }
+ if (icon_list)
+ gtk_window_set_icon_list(GTK_WINDOW(widget), icon_list);
}
void gtkut_widget_set_composer_icon(GtkWidget *widget)
{
- static GdkPixbuf *icon = NULL;
-
+ static GList *icon_list = NULL;
+
cm_return_if_fail(widget != NULL);
cm_return_if_fail(gtk_widget_get_window(widget) != NULL);
- if (!icon) {
+ if (!icon_list) {
+ GdkPixbuf *icon = NULL, *big_icon = NULL;
stock_pixbuf_gdk(widget, STOCK_PIXMAP_MAIL_COMPOSE, &icon);
- }
- if (icon)
- gtk_window_set_icon(GTK_WINDOW(widget), icon);
+ stock_pixbuf_gdk(widget, STOCK_PIXMAP_MAIL_COMPOSE_LOGO, &big_icon);
+ if (icon)
+ icon_list = g_list_append(icon_list, icon);
+ if (big_icon)
+ icon_list = g_list_append(icon_list, big_icon);
+ }
+ if (icon_list)
+ gtk_window_set_icon_list(GTK_WINDOW(widget), icon_list);
}
static gboolean move_bar = FALSE;
for (c = child_list; c != NULL; c = g_list_next(c)) {
if (c->data && GTK_IS_WIDGET(c->data)) {
- if (gtkut_widget_has_focus(GTK_WIDGET(c->data))) {
+ if (gtk_widget_has_focus(GTK_WIDGET(c->data))) {
result = GTK_WIDGET(c->data);
break;
}
}
#if HAVE_LIBCOMPFACE
-GtkWidget *xface_get_from_header(const gchar *o_xface, GdkColor *background,
- GdkWindow *window)
+GtkWidget *xface_get_from_header(const gchar *o_xface)
{
static gchar *xpm_xface[XPM_XFACE_HEIGHT];
static gboolean xpm_xface_init = TRUE;
gchar xface[2048];
strncpy(xface, o_xface, sizeof(xface));
- if (!window) {
- g_warning("no window\n");
- return NULL;
- }
if (uncompface(xface) < 0) {
g_warning("uncompface failed\n");
return NULL;
if ((gdk_pixbuf_get_width(pixbuf) != 48) || (gdk_pixbuf_get_height(pixbuf) != 48)) {
g_object_unref(pixbuf);
- g_warning("wrong_size");
+ g_warning("wrong_size\n");
return NULL;
}
{
GtkWidget *btn;
GtkWidget *btn_label;
+#if !GTK_CHECK_VERSION(3, 0, 0)
GdkColormap *cmap;
- GdkColor uri_color[2] = {{0, 0, 0, 0xffff}, {0, 0xffff, 0, 0}};
gboolean success[2];
+#endif
+ GdkColor uri_color[2] = {{0, 0, 0, 0xffff}, {0, 0xffff, 0, 0}};
gchar *local_url = NULL;
if (!url)
return NULL;
btn = gtk_button_new_with_label(label?label:url);
gtk_button_set_relief(GTK_BUTTON(btn), GTK_RELIEF_NONE);
btn_label = gtk_bin_get_child(GTK_BIN((btn)));
+#if !GTK_CHECK_VERSION(3, 0, 0)
cmap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
gdk_colormap_alloc_colors(cmap, uri_color, 2, FALSE, TRUE, success);
if (success[0] == TRUE && success[1] == TRUE) {
+#endif
GtkStyle *style;
gtk_widget_ensure_style(btn_label);
style = gtk_style_copy
style->fg[GTK_STATE_ACTIVE] = uri_color[1];
style->fg[GTK_STATE_PRELIGHT] = uri_color[0];
gtk_widget_set_style(btn_label, style);
+#if !GTK_CHECK_VERSION(3, 0, 0)
} else
- g_warning("about_create(): color allocation failed.\n");
+ g_warning("color allocation failed\n");
+#endif
g_signal_connect(G_OBJECT(btn), "enter",
G_CALLBACK(link_btn_enter), window);
if( txt == NULL )
return TRUE;
+
+ g_free(txt);
return FALSE;
}
GtkWidget *gtkut_window_new (GtkWindowType type,
const gchar *class)
{
-#ifndef MAEMO
GtkWidget *window = gtk_window_new(type);
-#else
- GtkWidget *window = hildon_window_new();
- hildon_program_add_window(hildon_program, HILDON_WINDOW(window));
-#endif
gtk_window_set_role(GTK_WINDOW(window), class);
return window;
}
return gui_manager;
}
-#define READ_CONDITION (G_IO_IN | G_IO_HUP | G_IO_ERR)
-#define WRITE_CONDITION (G_IO_OUT | G_IO_ERR)
-#define EXCEPTION_CONDITION (G_IO_PRI)
typedef struct _ClawsIOClosure ClawsIOClosure;
struct _ClawsIOClosure
{
- GdkInputFunction function;
- GdkInputCondition condition;
+ ClawsIOFunc function;
+ GIOCondition condition;
GDestroyNotify notify;
gpointer data;
};
static gboolean
claws_io_invoke (GIOChannel *source,
- GIOCondition condition,
- gpointer data)
+ GIOCondition condition,
+ gpointer data)
{
ClawsIOClosure *closure = data;
- GdkInputCondition gdk_cond = 0;
-
- if (condition & READ_CONDITION)
- gdk_cond |= GDK_INPUT_READ;
- if (condition & WRITE_CONDITION)
- gdk_cond |= GDK_INPUT_WRITE;
- if (condition & EXCEPTION_CONDITION)
- gdk_cond |= GDK_INPUT_EXCEPTION;
-
- if (closure->condition & gdk_cond)
- closure->function (closure->data, g_io_channel_unix_get_fd (source), gdk_cond);
+ int fd;
+#ifndef G_OS_WIN32
+ fd = g_io_channel_unix_get_fd (source);
+#else
+ fd = g_io_channel_win32_get_fd (source);
+#endif
+ if (closure->condition & condition)
+ closure->function (closure->data, fd, condition);
return TRUE;
}
gint
claws_input_add (gint source,
- GdkInputCondition condition,
- GdkInputFunction function,
+ GIOCondition condition,
+ ClawsIOFunc function,
gpointer data,
gboolean is_sock)
{
guint result;
ClawsIOClosure *closure = g_new (ClawsIOClosure, 1);
GIOChannel *channel;
- GIOCondition cond = 0;
closure->function = function;
closure->condition = condition;
closure->notify = NULL;
closure->data = data;
- if (condition & GDK_INPUT_READ)
- cond |= READ_CONDITION;
- if (condition & GDK_INPUT_WRITE)
- cond |= WRITE_CONDITION;
- if (condition & GDK_INPUT_EXCEPTION)
- cond |= EXCEPTION_CONDITION;
-
#ifndef G_OS_WIN32
channel = g_io_channel_unix_new (source);
#else
else
channel = g_io_channel_win32_new_fd(source);
#endif
- result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, cond,
+ result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, condition,
claws_io_invoke,
closure, claws_io_destroy);
g_io_channel_unref (channel);
return result;
}
-gboolean gtkut_widget_has_focus(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_has_focus(widget);
-#else
- return GTK_WIDGET_HAS_FOCUS(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_can_focus(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_get_can_focus(widget);
-#else
- return GTK_WIDGET_CAN_FOCUS(widget);
-#endif
-}
-
-gboolean gtkut_widget_has_grab(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_has_grab(widget);
-#else
- return GTK_WIDGET_HAS_GRAB(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_visible(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_get_visible(widget);
-#else
- return GTK_WIDGET_VISIBLE(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_realized(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,19,0)
- return gtk_widget_get_realized(widget);
-#else
- return GTK_WIDGET_REALIZED(widget);
-#endif
-}
-
-gboolean gtkut_widget_is_sensitive(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_is_sensitive(widget);
-#else
- return GTK_WIDGET_IS_SENSITIVE(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_sensitive(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_get_sensitive(widget);
-#else
- return GTK_WIDGET_SENSITIVE(widget);
-#endif
-}
-
-gboolean gtkut_widget_is_drawable(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_is_drawable(widget);
-#else
- return GTK_WIDGET_DRAWABLE(widget);
-#endif
-}
-
-GtkStateType gtkut_widget_get_state(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_get_state(widget);
-#else
- return GTK_WIDGET_STATE(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_mapped(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,19,0)
- return gtk_widget_get_mapped(widget);
-#else
- return GTK_WIDGET_MAPPED(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_has_window(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_get_has_window(widget);
-#else
- return GTK_WIDGET_NO_WINDOW(widget);
-#endif
-}
-
-gboolean gtkut_widget_get_app_paintable(GtkWidget *widget)
-{
-#if GTK_CHECK_VERSION(2,18,0)
- return gtk_widget_get_app_paintable(widget);
-#else
- return GTK_WIDGET_APP_PAINTABLE(widget);
-#endif
-}
-
void gtkut_widget_set_mapped(GtkWidget *widget, gboolean mapped)
{
#if GTK_CHECK_VERSION(2,20,0)
return pixbuf;
}
+
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_done(const gchar *hostname, gint port, gboolean ssl, AutoConfigureData *data)
+{
+ if (hostname != NULL) {
+ if (data->hostname_entry)
+ gtk_entry_set_text(data->hostname_entry, hostname);
+ if (data->set_port)
+ gtk_toggle_button_set_active(data->set_port,
+ (ssl && port == data->default_ssl_port) || (!ssl && port == data->default_port));
+ if (data->port)
+ gtk_spin_button_set_value(data->port, port);
+ else if (data->hostname_entry) {
+ gchar *tmp = g_strdup_printf("%s:%d", hostname, port);
+ gtk_entry_set_text(data->hostname_entry, tmp);
+ g_free(tmp);
+ }
+
+ if (ssl && data->ssl_checkbtn) {
+ gtk_toggle_button_set_active(data->ssl_checkbtn, TRUE);
+ gtk_toggle_button_set_active(data->tls_checkbtn, FALSE);
+ } else if (data->tls_checkbtn) {
+ if (!GTK_IS_RADIO_BUTTON(data->ssl_checkbtn)) {
+ /* Wizard where TLS is [x]SSL + [x]TLS */
+ gtk_toggle_button_set_active(data->ssl_checkbtn, TRUE);
+ }
+ gtk_toggle_button_set_active(data->tls_checkbtn, TRUE);
+ }
+
+ /* Check authentication by default. This is probably required if
+ * auto-configuration worked.
+ */
+ if (data->auth_checkbtn)
+ gtk_toggle_button_set_active(data->auth_checkbtn, TRUE);
+
+ gtk_label_set_text(data->info_label, _("Done."));
+ } else {
+ gtk_label_set_text(data->info_label, _("Failed."));
+ }
+ gtk_widget_show(GTK_WIDGET(data->configure_button));
+ gtk_widget_hide(GTK_WIDGET(data->cancel_button));
+ g_free(data->domain);
+ g_free(data);
+}
+
+static void resolve_done(GObject *source, GAsyncResult *result, gpointer user_data)
+{
+ AutoConfigureData *data = (AutoConfigureData *)user_data;
+ GResolver *resolver = (GResolver *)source;
+ GError *error = NULL;
+ gchar *hostname = NULL;
+ guint16 port;
+ GList *answers, *cur;
+ gboolean found = FALSE;
+ gboolean abort = FALSE;
+
+ answers = g_resolver_lookup_service_finish(resolver, result, &error);
+
+ if (answers) {
+ for (cur = g_srv_target_list_sort(answers); cur; cur = cur->next) {
+ GSrvTarget *target = (GSrvTarget *)cur->data;
+ const gchar *h = g_srv_target_get_hostname(target);
+ port = g_srv_target_get_port(target);
+ if (h && strcmp(h,"") && port > 0) {
+ hostname = g_strdup(h);
+ found = TRUE;
+ break;
+ }
+ }
+ g_resolver_free_targets(answers);
+ } else if (error) {
+ if (error->code == G_IO_ERROR_CANCELLED)
+ abort = TRUE;
+ debug_print("error %s\n", error->message);
+ g_error_free(error);
+ }
+
+ if (found) {
+ auto_configure_done(hostname, port, data->ssl_service != NULL, data);
+ } else if (data->ssl_service && !abort) {
+ /* Fallback to TLS */
+ data->ssl_service = NULL;
+ auto_configure_service(data);
+ } else {
+ auto_configure_done(NULL, 0, FALSE, data);
+ }
+ g_free(hostname);
+ g_object_unref(resolver);
+}
+
+void auto_configure_service(AutoConfigureData *data)
+{
+ GResolver *resolver;
+ const gchar *cur_service = data->ssl_service != NULL ? data->ssl_service : data->tls_service;
+
+ cm_return_if_fail(cur_service != NULL);
+ cm_return_if_fail(data->domain != NULL);
+
+ resolver = g_resolver_get_default();
+ if (resolver != NULL) {
+ gtk_label_set_text(data->info_label, _("Configuring..."));
+ gtk_widget_hide(GTK_WIDGET(data->configure_button));
+ gtk_widget_show(GTK_WIDGET(data->cancel_button));
+ g_resolver_lookup_service_async(resolver, cur_service, "tcp", data->domain,
+ data->cancel, resolve_done, data);
+ }
+}
+#endif
\ No newline at end of file