X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fgtk%2Fgtkutils.c;h=b23177ca4f1f9dee7b0822fc30f72691eb01cd40;hp=fa5efcbfb4e0845d006a6ebaa7570016655b889c;hb=4e883447e0e6c66520d20467505243a597c76029;hpb=2fcc6f1f56898008c2b7cd7a068dd2e929b0602d diff --git a/src/gtk/gtkutils.c b/src/gtk/gtkutils.c index fa5efcbfb..b23177ca4 100644 --- a/src/gtk/gtkutils.c +++ b/src/gtk/gtkutils.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2004 Hiroyuki Yamamoto + * Copyright (C) 1999-2005 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 @@ -22,6 +22,7 @@ #endif #include +#include #include #include #include @@ -29,8 +30,6 @@ #include #include #include -#warning FIXME_GTK2 -/* #include */ #include #include #include @@ -42,7 +41,7 @@ # include #endif -#include "intl.h" +#include "defs.h" #include "gtkutils.h" #include "utils.h" #include "gtksctree.h" @@ -50,6 +49,7 @@ #include "stock_pixmap.h" #include "menu.h" #include "prefs_account.h" +#include "prefs_common.h" #warning FIXME_GTK2 gboolean gtkut_get_font_size(GtkWidget *widget, @@ -70,6 +70,21 @@ gboolean gtkut_get_font_size(GtkWidget *widget, return TRUE; } +void gtkut_widget_set_small_font_size(GtkWidget *widget) +{ + PangoFontDescription *font_desc; + gint size; + + g_return_if_fail(widget != NULL); + g_return_if_fail(widget->style != NULL); + + font_desc = pango_font_description_from_string(NORMAL_FONT); + size = pango_font_description_get_size(font_desc); + pango_font_description_set_size(font_desc, size * PANGO_SCALE_SMALL); + gtk_widget_modify_font(widget, font_desc); + pango_font_description_free(font_desc); +} + void gtkut_convert_int_to_gdk_color(gint rgbvalue, GdkColor *color) { g_return_if_fail(color != NULL); @@ -112,6 +127,38 @@ void gtkut_button_set_create(GtkWidget **bbox, } } +void gtkut_stock_button_set_create(GtkWidget **bbox, + GtkWidget **button1, const gchar *label1, + GtkWidget **button2, const gchar *label2, + GtkWidget **button3, const gchar *label3) +{ + g_return_if_fail(bbox != NULL); + g_return_if_fail(button1 != NULL); + + *bbox = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(*bbox), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(*bbox), 5); + + *button1 = gtk_button_new_from_stock(label1); + GTK_WIDGET_SET_FLAGS(*button1, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(*bbox), *button1, TRUE, TRUE, 0); + gtk_widget_show(*button1); + + if (button2) { + *button2 = gtk_button_new_from_stock(label2); + GTK_WIDGET_SET_FLAGS(*button2, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(*bbox), *button2, TRUE, TRUE, 0); + gtk_widget_show(*button2); + } + + if (button3) { + *button3 = gtk_button_new_from_stock(label3); + GTK_WIDGET_SET_FLAGS(*button3, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(*bbox), *button3, TRUE, TRUE, 0); + gtk_widget_show(*button3); + } +} + static void combo_button_size_request(GtkWidget *widget, GtkRequisition *requisition, gpointer data) @@ -119,7 +166,8 @@ static void combo_button_size_request(GtkWidget *widget, ComboButton *combo = (ComboButton *)data; if (combo->arrow->allocation.height != requisition->height) - gtk_widget_set_usize(combo->arrow, -1, requisition->height); + gtk_widget_set_size_request(combo->arrow, + -1, requisition->height); } static void combo_button_enter(GtkWidget *widget, gpointer data) @@ -184,6 +232,7 @@ ComboButton *gtkut_combo_button_create(GtkWidget *button, combo->arrow = gtk_button_new(); arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); + gtk_widget_set_size_request(arrow, 7, -1); gtk_container_add(GTK_CONTAINER(combo->arrow), arrow); GTK_WIDGET_UNSET_FLAGS(combo->arrow, GTK_CAN_FOCUS); gtk_widget_show_all(combo->arrow); @@ -193,20 +242,20 @@ ComboButton *gtkut_combo_button_create(GtkWidget *button, &combo->factory, data); combo->data = data; - gtk_signal_connect(GTK_OBJECT(combo->button), "size_request", - GTK_SIGNAL_FUNC(combo_button_size_request), combo); - gtk_signal_connect(GTK_OBJECT(combo->button), "enter", - GTK_SIGNAL_FUNC(combo_button_enter), combo); - gtk_signal_connect(GTK_OBJECT(combo->button), "leave", - GTK_SIGNAL_FUNC(combo_button_leave), combo); - gtk_signal_connect(GTK_OBJECT(combo->arrow), "enter", - GTK_SIGNAL_FUNC(combo_button_enter), combo); - gtk_signal_connect(GTK_OBJECT(combo->arrow), "leave", - GTK_SIGNAL_FUNC(combo_button_leave), combo); - gtk_signal_connect(GTK_OBJECT(combo->arrow), "button_press_event", - GTK_SIGNAL_FUNC(combo_button_arrow_pressed), combo); - gtk_signal_connect(GTK_OBJECT(combo->arrow), "destroy", - GTK_SIGNAL_FUNC(combo_button_destroy), combo); + g_signal_connect(G_OBJECT(combo->button), "size_request", + G_CALLBACK(combo_button_size_request), combo); + 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); + g_signal_connect(G_OBJECT(combo->arrow), "enter", + G_CALLBACK(combo_button_enter), combo); + g_signal_connect(G_OBJECT(combo->arrow), "leave", + G_CALLBACK(combo_button_leave), combo); + g_signal_connect(G_OBJECT(combo->arrow), "button_press_event", + G_CALLBACK(combo_button_arrow_pressed), combo); + g_signal_connect(G_OBJECT(combo->arrow), "destroy", + G_CALLBACK(combo_button_destroy), combo); return combo; } @@ -467,6 +516,141 @@ void gtkut_container_remove(GtkContainer *container, GtkWidget *widget) gtk_container_remove(container, widget); } +gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, + const GtkTextIter *iter, + gunichar *wcs, gint len, + gboolean case_sens) +{ + GtkTextIter start_iter, end_iter; + gchar *utf8str, *p; + gint match_count; + + start_iter = end_iter = *iter; + gtk_text_iter_forward_chars(&end_iter, len); + + utf8str = gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, + FALSE); + if (!utf8str) return FALSE; + + if ((gint)g_utf8_strlen(utf8str, -1) != len) { + g_free(utf8str); + return FALSE; + } + + for (p = utf8str, match_count = 0; + *p != '\0' && match_count < len; + p = g_utf8_next_char(p), match_count++) { + gunichar wc; + + wc = g_utf8_get_char(p); + + if (case_sens) { + if (wc != wcs[match_count]) + break; + } else { + if (g_unichar_tolower(wc) != + g_unichar_tolower(wcs[match_count])) + break; + } + } + + g_free(utf8str); + + if (match_count == len) + return TRUE; + else + return FALSE; +} + +gboolean gtkut_text_buffer_find(GtkTextBuffer *buffer, const GtkTextIter *iter, + const gchar *str, gboolean case_sens, + GtkTextIter *match_pos) +{ + gunichar *wcs; + gint len; + glong items_read = 0, items_written = 0; + GError *error = NULL; + GtkTextIter iter_; + gboolean found = FALSE; + + 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_error_free(error); + } + if (!wcs || items_written <= 0) return FALSE; + len = (gint)items_written; + + iter_ = *iter; + do { + found = gtkut_text_buffer_match_string + (buffer, &iter_, wcs, len, case_sens); + if (found) { + *match_pos = iter_; + break; + } + } while (gtk_text_iter_forward_char(&iter_)); + + g_free(wcs); + + return found; +} + +gboolean gtkut_text_buffer_find_backward(GtkTextBuffer *buffer, + const GtkTextIter *iter, + const gchar *str, gboolean case_sens, + GtkTextIter *match_pos) +{ + gunichar *wcs; + gint len; + glong items_read = 0, items_written = 0; + GError *error = NULL; + GtkTextIter iter_; + gboolean found = FALSE; + + 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_error_free(error); + } + if (!wcs || items_written <= 0) return FALSE; + len = (gint)items_written; + + iter_ = *iter; + while (gtk_text_iter_backward_char(&iter_)) { + found = gtkut_text_buffer_match_string + (buffer, &iter_, wcs, len, case_sens); + if (found) { + *match_pos = iter_; + break; + } + } + + g_free(wcs); + + return found; +} + +gchar *gtkut_text_view_get_selection(GtkTextView *textview) +{ + GtkTextBuffer *buffer; + GtkTextIter start_iter, end_iter; + gboolean found; + + g_return_val_if_fail(GTK_IS_TEXT_VIEW(textview), NULL); + + buffer = gtk_text_view_get_buffer(textview); + found = gtk_text_buffer_get_selection_bounds(buffer, + &start_iter, + &end_iter); + if (found) + return gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, + FALSE); + else + return NULL; +} + void gtkut_window_popup(GtkWidget *window) { gint x, y, sx, sy, new_x, new_y; @@ -483,8 +667,7 @@ void gtkut_window_popup(GtkWidget *window) if (new_x != x || new_y != y) gdk_window_move(window->window, new_x, new_y); - gdk_window_raise(window->window); - gdk_window_show(window->window); + gtk_window_present(GTK_WINDOW(window)); } void gtkut_widget_get_uposition(GtkWidget *widget, gint *px, gint *py) @@ -507,26 +690,6 @@ void gtkut_widget_get_uposition(GtkWidget *widget, gint *px, gint *py) *py = y; } -void gtkut_widget_disable_theme_engine(GtkWidget *widget) -{ -#warning FIXME_GTK2 -#if 0 - GtkStyle *style, *new_style; - - style = gtk_widget_get_style(widget); - - if (style->engine) { - GtkThemeEngine *engine; - - engine = style->engine; - style->engine = NULL; - new_style = gtk_style_copy(style); - style->engine = engine; - gtk_widget_set_style(widget, new_style); - } -#endif -} - void gtkut_widget_wait_for_draw(GtkWidget *widget) { if (!GTK_WIDGET_DRAWABLE(widget)) return; @@ -603,7 +766,7 @@ void gtkut_widget_set_composer_icon(GtkWidget *widget) } GtkWidget *gtkut_account_menu_new(GList *ac_list, - GtkSignalFunc callback, + GCallback callback, gpointer data) { GList *cur_ac; @@ -631,9 +794,8 @@ GtkWidget *gtkut_account_menu_new(GList *ac_list, MENUITEM_ADD(menu, menuitem, name, account->account_id); g_free(name); if (callback != NULL) - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - callback, - data); + g_signal_connect(G_OBJECT(menuitem), "activate", + callback, data); } return menu; } @@ -651,153 +813,53 @@ void gtkut_set_widget_bgcolor_rgb(GtkWidget *widget, guint rgbvalue) gtk_widget_set_style(widget, newstyle); } -#warning FIXME_GTK2 -#if 1 /* FIXME_GTK2 */ -gboolean gtkut_text_buffer_match_string(GtkTextBuffer *textbuf, gint pos, gunichar *wcs, - gint len, gboolean case_sens) +/*! + *\brief Tries to find a focused child using a lame strategy + */ +GtkWidget *gtkut_get_focused_child(GtkContainer *parent) { - GtkTextIter start_iter, end_iter; - gchar *utf8str; - gint match_count = 0; + GtkWidget *result = NULL; + GList *child_list = NULL; + GList *c; - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, pos); - gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter, pos + len); - - utf8str = gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE); - if (!utf8str) return FALSE; + g_return_val_if_fail(parent, NULL); - if ((gint) g_utf8_strlen(utf8str, -1) != len) { - g_free(utf8str); - return FALSE; - } - - for (; match_count < len; pos++, match_count++) { - gchar *ptr = g_utf8_offset_to_pointer(utf8str, match_count); - gunichar ch; - - if (!ptr) break; - ch = g_utf8_get_char(ptr); + /* Get children list and see which has the focus. */ + child_list = gtk_container_get_children(parent); + if (!child_list) + return NULL; - if (case_sens) { - if (ch != wcs[match_count]) - break; - } else { - if (g_unichar_tolower(ch) != - g_unichar_tolower(wcs[match_count])) + for (c = child_list; c != NULL; c = g_list_next(c)) { + if (c->data && GTK_IS_WIDGET(c->data)) { + if (GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(c->data))) { + result = GTK_WIDGET(c->data); break; + } } } - - g_free(utf8str); - - if (match_count == len) - return TRUE; - else - return FALSE; -} - -guint gtkut_text_buffer_str_compare_n(GtkTextBuffer *textbuf, - guint pos1, guint pos2, - guint len, guint text_len) -{ - guint i; - - for (i = 0; i < len && pos1 + i < text_len && pos2 + i < text_len; i++) { - GtkTextIter start_iter, end_iter; - gchar *utf8str1, *utf8str2; - - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, - pos1 + i); - gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter, - pos1 + i + 1); - utf8str1 = gtk_text_buffer_get_text(textbuf, - &start_iter, - &end_iter, - FALSE); - - gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, - pos2 + i); - gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter, - pos2 + i + 1); - utf8str2 = gtk_text_buffer_get_text(textbuf, - &start_iter, - &end_iter, - FALSE); - - if (!utf8str1 || !utf8str2 || strcmp(utf8str1, utf8str2)) { - g_free(utf8str1); - g_free(utf8str2); - break; + + /* See if the returned widget is a container itself; if it is, + * see if one of its children is focused. If the focused + * container has no focused child, it is itself a focusable + * child, and has focus. */ + if (result && GTK_IS_CONTAINER(result)) { + GtkWidget *tmp = gtkut_get_focused_child(GTK_CONTAINER(result)); + + if (tmp) + result = tmp; + } else { + /* Try the same for each container in the chain */ + for (c = child_list; c != NULL && !result; c = g_list_next(c)) { + if (c->data && GTK_IS_WIDGET(c->data) + && GTK_IS_CONTAINER(c->data)) { + result = gtkut_get_focused_child + (GTK_CONTAINER(c->data)); + } } - - g_free(utf8str1); - g_free(utf8str2); - } - - return i; -} - -guint gtkut_text_buffer_str_compare(GtkTextBuffer *textbuf, - guint start_pos, guint text_len, - const gchar *str) -{ - gunichar *wcs; - guint len = 0; - glong items_read = 0, items_written = 0; - gboolean result; - GError *error = NULL; - - if (!str) return 0; - - 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_error_free(error); + } - if (!wcs || items_written <= 0) return 0; - len = (guint) items_written; - - if (len > text_len - start_pos) - result = FALSE; - else - result = gtkut_text_buffer_match_string(textbuf, start_pos, - wcs, len, - TRUE); - - g_free(wcs); - - return result ? len : 0; -} - -gboolean gtkut_text_buffer_is_uri_string(GtkTextBuffer *textbuf, - guint start_pos, guint text_len) -{ - if (gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "http://") || - gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "ftp://") || - gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "https://") || - gtkut_text_buffer_str_compare(textbuf, start_pos, text_len, "www.")) - return TRUE; - - return FALSE; -} - -gchar *gtkut_text_view_get_selection(GtkTextView *textview) -{ - GtkTextBuffer *buffer; - GtkTextIter start_iter, end_iter; - gboolean found; - - g_return_val_if_fail(GTK_IS_TEXT_VIEW(textview), NULL); - - buffer = gtk_text_view_get_buffer(textview); - found = gtk_text_buffer_get_selection_bounds(buffer, - &start_iter, - &end_iter); - if (found) - return gtk_text_buffer_get_text(buffer, &start_iter, &end_iter, - FALSE); - else - return NULL; + + g_list_free(child_list); + + return result; } -#endif /* FIXME_GTK2 */