Mercurial > pidgin
changeset 18194:9c17cdcfc799
merge of '4a2a30a75885602e9c2c02fd13e1ce8f96981fa2'
and 'bf946fc60b7489fdf6bea3ba83f91f9008e77d9e'
author | Ka-Hing Cheung <khc@hxbc.us> |
---|---|
date | Tue, 19 Jun 2007 17:19:52 +0000 |
parents | 99969affedf5 (diff) 09eb621782bc (current diff) |
children | 5b4013f10285 a4dee68e040f db286cc82bd1 |
files | |
diffstat | 15 files changed, 279 insertions(+), 275 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog.API Tue Jun 19 17:17:57 2007 +0000 +++ b/ChangeLog.API Tue Jun 19 17:19:52 2007 +0000 @@ -71,10 +71,18 @@ * gtk_imhtml_animation_new Can be used for inserting an animated image into an IMHTML. * pidgin_menu_position_func_helper + * pidgin_blist_get_name_markup, returns the buddy list markup + text for a given buddy. Changed: * pidgin_append_menu_action returns the menuitem added to the menu. * pidgin_separator returns the separator added to the menu. + * PidginConversation has struct members to handle the new info + pane: + * infopane + * infopane_hbox + * infopane_model + * infopane_iter Finch: Added:
--- a/doc/gtkrc-2.0 Tue Jun 19 17:17:57 2007 +0000 +++ b/doc/gtkrc-2.0 Tue Jun 19 17:19:52 2007 +0000 @@ -39,16 +39,17 @@ } widget_class "*" style "my-style-name" -# This style sets the expander size on a treeview to 0, which has the result +# This sets the expander size on a treeview to 0, which has the result # of reducing the indent for items in the tree. This can be applied to the -# Pidgin buddy list to reduce it's width. -style "my-narrow-tree" -{ - GtkTreeView::expander_size = 0 -} - +# Pidgin buddy list to reduce the width of group and contact rows. +# With the recent (~2.0.0) buddy list changes this isn't particularly +# important anymore. +#style "my-narrow-tree" +#{ +# GtkTreeView::expander_size = 0 +#} # And apply the style to the buddy list: -widget "*pidgin_blist_treeview" style "my-narrow-tree" +#widget "*pidgin_blist_treeview" style "my-narrow-tree" # In Pidgin, you can set custom keybindings in your theme. # Here is an example to follow:
--- a/finch/libgnt/gnttree.c Tue Jun 19 17:17:57 2007 +0000 +++ b/finch/libgnt/gnttree.c Tue Jun 19 17:19:52 2007 +0000 @@ -303,7 +303,7 @@ notfirst = TRUE; - if (len > width - 2) { + if (len > width) { len = width - 1; cut = TRUE; }
--- a/libpurple/account.h Tue Jun 19 17:17:57 2007 +0000 +++ b/libpurple/account.h Tue Jun 19 17:19:52 2007 +0000 @@ -369,7 +369,7 @@ * as a NULL-terminated list of id/value pairs. */ void purple_account_set_status(PurpleAccount *account, const char *status_id, - gboolean active, ...); + gboolean active, ...) G_GNUC_NULL_TERMINATED; /**
--- a/libpurple/prpl.h Tue Jun 19 17:17:57 2007 +0000 +++ b/libpurple/prpl.h Tue Jun 19 17:19:52 2007 +0000 @@ -378,7 +378,7 @@ * beginning with the value for @a attr_id. */ void purple_prpl_got_account_status(PurpleAccount *account, - const char *status_id, ...); + const char *status_id, ...) G_GNUC_NULL_TERMINATED; /** * Notifies Purple that a user's idle state and time have changed. * @@ -418,7 +418,7 @@ * beginning with the value for @a attr_id. */ void purple_prpl_got_user_status(PurpleAccount *account, const char *name, - const char *status_id, ...); + const char *status_id, ...) G_GNUC_NULL_TERMINATED; /** * Notifies libpurple that a user's status has been deactivated
--- a/libpurple/request.h Tue Jun 19 17:17:57 2007 +0000 +++ b/libpurple/request.h Tue Jun 19 17:19:52 2007 +0000 @@ -1228,7 +1228,7 @@ const char *ok_text, GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, ...); + void *user_data, ...) G_GNUC_NULL_TERMINATED; /** * Prompts the user for multiple-choice input.
--- a/libpurple/status.h Tue Jun 19 17:17:57 2007 +0000 +++ b/libpurple/status.h Tue Jun 19 17:19:52 2007 +0000 @@ -227,7 +227,7 @@ gboolean independent, const char *attr_id, const char *attr_name, - PurpleValue *attr_value, ...); + PurpleValue *attr_value, ...) G_GNUC_NULL_TERMINATED; /** * Destroys a status type. @@ -270,7 +270,7 @@ * @param ... Additional attribute information. */ void purple_status_type_add_attrs(PurpleStatusType *status_type, const char *id, - const char *name, PurpleValue *value, ...); + const char *name, PurpleValue *value, ...) G_GNUC_NULL_TERMINATED; /** * Adds multiple attributes to a status type using a va_list.
--- a/pidgin/gtkblist.c Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/gtkblist.c Tue Jun 19 17:19:52 2007 +0000 @@ -3282,7 +3282,7 @@ return ret; } -static gchar *pidgin_blist_get_name_markup(PurpleBuddy *b, gboolean selected) +gchar *pidgin_blist_get_name_markup(PurpleBuddy *b, gboolean selected) { const char *name; char *esc, *text = NULL;
--- a/pidgin/gtkblist.h Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/gtkblist.h Tue Jun 19 17:19:52 2007 +0000 @@ -360,4 +360,13 @@ void pidgin_blist_set_headline(const char *text, GdkPixbuf *pixbuf, GCallback callback, gpointer user_data, GDestroyNotify destroy); +/** + * Returns a buddy's Pango markup appropriate for setting in a GtkCellRenderer. + * + * @param buddy The buddy to return markup from + * @param selected Whether this buddy is selected. If TRUE, the markup will not change the color. + * @return The markup for this buddy + */ +gchar *pidgin_blist_get_name_markup(PurpleBuddy *buddy, gboolean selected); + #endif /* _PIDGINBLIST_H_ */
--- a/pidgin/gtkconv.c Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/gtkconv.c Tue Jun 19 17:19:52 2007 +0000 @@ -82,6 +82,12 @@ PIDGIN_CONV_COLORIZE_TITLE = 1 << 6 }PidginConvFields; +enum { + ICON_COLUMN, + TEXT_COLUMN, + NUM_COLUMNS +} PidginInfopaneColumns; + #define PIDGIN_CONV_ALL ((1 << 7) - 1) #define SEND_COLOR "#204a87" @@ -2350,6 +2356,9 @@ gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->icon), status); gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->menu_icon), status); + gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), + ICON_COLUMN, status, -1); + if (status != NULL) g_object_unref(status); @@ -2409,11 +2418,7 @@ PURPLE_ICON_SCALE_DISPLAY, &scale_width, &scale_height); /* this code is ugly, and scares me */ - scale = gdk_pixbuf_scale_simple(buf, - MAX(gdk_pixbuf_get_width(buf) * scale_width / - gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), - MAX(gdk_pixbuf_get_height(buf) * scale_height / - gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), + scale = gdk_pixbuf_scale_simple(buf, 32, 32, GDK_INTERP_BILINEAR); gtk_image_set_from_pixbuf(GTK_IMAGE(gtkconv->u.im->icon), scale); @@ -4378,6 +4383,8 @@ setup_common_pane(PidginConversation *gtkconv) { GtkWidget *paned, *vbox, *frame, *imhtml_sw; + GtkCellRenderer *rend; + GtkTreePath *path; PurpleConversation *conv = gtkconv->active_conv; gboolean chat = (conv->type == PURPLE_CONV_TYPE_CHAT); GtkPolicyType imhtml_sw_hscroll; @@ -4390,6 +4397,35 @@ gtk_paned_pack1(GTK_PANED(paned), vbox, TRUE, TRUE); gtk_widget_show(vbox); + /* Setup the info pane */ + gtkconv->infopane_hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), gtkconv->infopane_hbox, FALSE, FALSE, 0); + gtk_widget_show(gtkconv->infopane_hbox); + + gtkconv->infopane = gtk_cell_view_new(); + gtkconv->infopane_model = gtk_list_store_new(NUM_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING); + gtk_cell_view_set_model(GTK_CELL_VIEW(gtkconv->infopane), gtkconv->infopane_model); + gtk_list_store_append(gtkconv->infopane_model, &(gtkconv->infopane_iter)); + gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->infopane, TRUE, TRUE, 0); + path = gtk_tree_path_new_from_string("0"); + gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(gtkconv->infopane), path); + gtk_widget_set_size_request(gtkconv->infopane, -1, 32); + gtk_widget_show(gtkconv->infopane); + + rend = gtk_cell_renderer_pixbuf_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, FALSE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "pixbuf", ICON_COLUMN, NULL); + g_object_set(rend, "xalign", 0.0, "xpad", 6, "ypad", 0, NULL); + + rend = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gtkconv->infopane), rend, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gtkconv->infopane), rend, "markup", TEXT_COLUMN, NULL); + g_object_set(rend, "ypad", 0, "yalign", 0.5, NULL); + +#if GTK_CHECK_VERSION(2, 6, 0) + g_object_set(rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL); +#endif + /* Setup the gtkimhtml widget */ frame = pidgin_create_imhtml(FALSE, >kconv->imhtml, NULL, &imhtml_sw); if (chat) { @@ -5981,8 +6017,10 @@ buttons = GTK_IMHTML_SMILEY | GTK_IMHTML_IMAGE; } - if (!(prpl_info->options & OPT_PROTO_IM_IMAGE) || - conv->features & PURPLE_CONNECTION_NO_IMAGES) + if (!(prpl_info->options & OPT_PROTO_IM_IMAGE)) + conv->features |= PURPLE_CONNECTION_NO_IMAGES; + + if(conv->features & PURPLE_CONNECTION_NO_IMAGES) buttons &= ~GTK_IMHTML_IMAGE; gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons); @@ -5995,7 +6033,7 @@ gtk_widget_set_sensitive(win->menu.get_info, (prpl_info->get_info != NULL)); gtk_widget_set_sensitive(win->menu.invite, (prpl_info->chat_invite != NULL)); gtk_widget_set_sensitive(win->menu.insert_link, (conv->features & PURPLE_CONNECTION_HTML)); - gtk_widget_set_sensitive(win->menu.insert_image, (prpl_info->options & OPT_PROTO_IM_IMAGE) && !(conv->features & PURPLE_CONNECTION_NO_IMAGES)); + gtk_widget_set_sensitive(win->menu.insert_image, !(conv->features & PURPLE_CONNECTION_NO_IMAGES)); if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { @@ -6120,6 +6158,8 @@ char *title; PurpleConvIm *im = NULL; PurpleAccount *account = purple_conversation_get_account(conv); + PurpleBuddy *buddy; + char *markup; AtkObject *accessibility_obj; /* I think this is a little longer than it needs to be but I'm lazy. */ char style[51]; @@ -6135,6 +6175,17 @@ else title = g_strdup(purple_conversation_get_title(conv)); + buddy = purple_find_buddy(account, conv->name); + if (buddy) + markup = pidgin_blist_get_name_markup(buddy, FALSE); + else + markup = title; + gtk_list_store_set(gtkconv->infopane_model, &(gtkconv->infopane_iter), + TEXT_COLUMN, markup, -1); + + if (title != markup) + g_free(markup); + *style = '\0'; if (!GTK_WIDGET_REALIZED(gtkconv->tab_label)) @@ -6294,7 +6345,6 @@ GdkPixbuf *buf; GtkWidget *event; - GtkWidget *frame; GdkPixbuf *scale; int scale_width, scale_height; @@ -6403,24 +6453,13 @@ start_anim(NULL, gtkconv); } - pidgin_buddy_icon_get_scale_size(buf, &prpl_info->icon_spec, - PURPLE_ICON_SCALE_DISPLAY, &scale_width, &scale_height); - scale = gdk_pixbuf_scale_simple(buf, - MAX(gdk_pixbuf_get_width(buf) * scale_width / - gdk_pixbuf_animation_get_width(gtkconv->u.im->anim), 1), - MAX(gdk_pixbuf_get_height(buf) * scale_height / - gdk_pixbuf_animation_get_height(gtkconv->u.im->anim), 1), + scale = gdk_pixbuf_scale_simple(buf, 32, 32, GDK_INTERP_BILINEAR); gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0); - frame = gtk_frame_new(NULL); - gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); - gtk_box_pack_start(GTK_BOX(gtkconv->u.im->icon_container), frame, - FALSE, FALSE, 0); - event = gtk_event_box_new(); - gtk_container_add(GTK_CONTAINER(frame), event); + gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event); g_signal_connect(G_OBJECT(event), "button-press-event", G_CALLBACK(icon_menu), gtkconv); gtk_widget_show(event); @@ -6428,19 +6467,16 @@ gtkconv->u.im->icon = gtk_image_new_from_pixbuf(scale); gtkconv->auto_resize = TRUE; /* Reset the size request to allow the buddy icon to resize */ - gtk_widget_set_size_request(gtkconv->lower_hbox, -1, -1); g_idle_add(reset_auto_resize_cb, gtkconv); - gtk_widget_set_size_request(gtkconv->u.im->icon, scale_width, scale_height); gtk_container_add(GTK_CONTAINER(event), gtkconv->u.im->icon); gtk_widget_show(gtkconv->u.im->icon); g_object_unref(G_OBJECT(scale)); - gtk_box_pack_start(GTK_BOX(gtkconv->lower_hbox), + gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), gtkconv->u.im->icon_container, FALSE, FALSE, 0); gtk_widget_show(gtkconv->u.im->icon_container); - gtk_widget_show(frame); /* The buddy icon code needs badly to be fixed. */ if(pidgin_conv_window_is_active_conversation(conv)) @@ -8413,7 +8449,7 @@ gtk_notebook_set_tab_label_packing(GTK_NOTEBOOK(win->notebook), gtkconv->tab_cont, !tabs_side && !angle, TRUE, GTK_PACK_START); /* show the widgets */ - gtk_widget_show(gtkconv->icon); +/* XXX gtk_widget_show(gtkconv->icon); */ gtk_widget_show(gtkconv->tab_label); if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/close_on_tabs")) gtk_widget_show(gtkconv->close);
--- a/pidgin/gtkconv.h Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/gtkconv.h Tue Jun 19 17:19:52 2007 +0000 @@ -158,6 +158,10 @@ } u; time_t newday; + GtkWidget *infopane_hbox; + GtkWidget *infopane; + GtkTreeModel *infopane_model; + GtkTreeIter infopane_iter; }; /*@}*/
--- a/pidgin/gtkimhtml.c Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/gtkimhtml.c Tue Jun 19 17:19:52 2007 +0000 @@ -5036,10 +5036,24 @@ void gtk_imhtml_setup_entry(GtkIMHtml *imhtml, PurpleConnectionFlags flags) { + GtkIMHtmlButtons buttons; + if (flags & PURPLE_CONNECTION_HTML) { char color[8]; GdkColor fg_color, bg_color; + buttons = GTK_IMHTML_ALL; + + if (flags & PURPLE_CONNECTION_NO_BGCOLOR) + buttons &= ~GTK_IMHTML_BACKCOLOR; + if (flags & PURPLE_CONNECTION_NO_FONTSIZE) + { + buttons &= ~GTK_IMHTML_GROW; + buttons &= ~GTK_IMHTML_SHRINK; + } + if (flags & PURPLE_CONNECTION_NO_URLDESC) + buttons &= ~GTK_IMHTML_LINKDESC; + gtk_imhtml_set_format_functions(imhtml, GTK_IMHTML_ALL); if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/conversations/send_bold") != imhtml->edit.bold) gtk_imhtml_toggle_bold(imhtml); @@ -5094,9 +5108,14 @@ else gtk_imhtml_set_whole_buffer_formatting_only(imhtml, FALSE); } else { + buttons = GTK_IMHTML_SMILEY | GTK_IMHTML_IMAGE; imhtml_clear_formatting(imhtml); - gtk_imhtml_set_format_functions(imhtml, 0); } + + if (flags & PURPLE_CONNECTION_NO_IMAGES) + buttons &= ~GTK_IMHTML_IMAGE; + + gtk_imhtml_set_format_functions(imhtml, buttons); }
--- a/pidgin/gtkimhtmltoolbar.c Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Tue Jun 19 17:19:52 2007 +0000 @@ -1035,6 +1035,7 @@ GtkWidget *font_button; GtkWidget *font_menu; GtkWidget *insert_menu; + GtkWidget *menuitem; GtkWidget *button; GtkWidget *sep; int i; @@ -1088,7 +1089,7 @@ for (i = 0; buttons[i].label; i++) { GtkWidget *old = *buttons[i].button; - GtkWidget *menuitem = gtk_check_menu_item_new_with_mnemonic(buttons[i].label); + menuitem = gtk_check_menu_item_new_with_mnemonic(buttons[i].label); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), old); g_signal_connect_after(G_OBJECT(old), "toggled", @@ -1140,17 +1141,23 @@ insert_menu = gtk_menu_new(); - button = gtk_menu_item_new_with_mnemonic(_("_Smiley")); - g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->smiley); - gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button); + menuitem = gtk_menu_item_new_with_mnemonic(_("_Smiley")); + g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->smiley); + gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem); + g_signal_connect(G_OBJECT(toolbar->smiley), "notify::sensitive", + G_CALLBACK(button_sensitiveness_changed), menuitem); - button = gtk_menu_item_new_with_mnemonic(_("_Image")); - g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->image); - gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button); + menuitem = gtk_menu_item_new_with_mnemonic(_("_Image")); + g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->image); + gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem); + g_signal_connect(G_OBJECT(toolbar->image), "notify::sensitive", + G_CALLBACK(button_sensitiveness_changed), menuitem); - button = gtk_menu_item_new_with_mnemonic(_("_Link")); - g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gtk_button_clicked), toolbar->link); - gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), button); + menuitem = gtk_menu_item_new_with_mnemonic(_("_Link")); + g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_button_clicked), toolbar->link); + gtk_menu_shell_append(GTK_MENU_SHELL(insert_menu), menuitem); + g_signal_connect(G_OBJECT(toolbar->link), "notify::sensitive", + G_CALLBACK(button_sensitiveness_changed), menuitem); g_signal_connect(G_OBJECT(insert_button), "clicked", G_CALLBACK(pidgin_menu_clicked), insert_menu); g_signal_connect(G_OBJECT(insert_menu), "deactivate", G_CALLBACK(pidgin_menu_deactivate), insert_button);
--- a/pidgin/pidginstock.c Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/pidginstock.c Tue Jun 19 17:19:52 2007 +0000 @@ -105,7 +105,7 @@ { PIDGIN_STOCK_STATUS_AWAY, "status", "away.png", TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I }, { PIDGIN_STOCK_STATUS_BUSY, "status", "busy.png", TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I }, { PIDGIN_STOCK_STATUS_CHAT, "status", "chat.png", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, - { PIDGIN_STOCK_STATUS_INVISIBLE,"status", "invisible.png", TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { PIDGIN_STOCK_STATUS_INVISIBLE,"status", "invisible.png", TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, { PIDGIN_STOCK_STATUS_XA, "status", "extended-away.png", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, PIDGIN_STOCK_STATUS_XA_I }, { PIDGIN_STOCK_STATUS_LOGIN, "status", "log-in.png", TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, { PIDGIN_STOCK_STATUS_LOGOUT, "status", "log-out.png", TRUE, TRUE, TRUE, TRUE, FALSE, FALSE , NULL },
--- a/pidgin/plugins/pidginrc.c Tue Jun 19 17:17:57 2007 +0000 +++ b/pidgin/plugins/pidginrc.c Tue Jun 19 17:19:52 2007 +0000 @@ -27,49 +27,49 @@ static guint pref_callback; -static const char *color_prefs[] = { +static const gchar *color_prefs[] = { "/plugins/gtk/purplerc/color/GtkWidget::cursor-color", "/plugins/gtk/purplerc/color/GtkWidget::secondary-cursor-color", "/plugins/gtk/purplerc/color/GtkIMHtml::hyperlink-color" }; -static const char *color_prefs_set[] = { +static const gchar *color_prefs_set[] = { "/plugins/gtk/purplerc/set/color/GtkWidget::cursor-color", "/plugins/gtk/purplerc/set/color/GtkWidget::secondary-cursor-color", "/plugins/gtk/purplerc/set/color/GtkIMHtml::hyperlink-color" }; -static const char *color_names[] = { +static const gchar *color_names[] = { N_("Cursor Color"), N_("Secondary Cursor Color"), N_("Hyperlink Color") }; static GtkWidget *color_widgets[G_N_ELEMENTS(color_prefs)]; -static const char *widget_size_prefs[] = { +static const gchar *widget_size_prefs[] = { "/plugins/gtk/purplerc/size/GtkTreeView::horizontal_separator" }; -static const char *widget_size_prefs_set[] = { +static const gchar *widget_size_prefs_set[] = { "/plugins/gtk/purplerc/set/size/GtkTreeView::horizontal_separator" }; -static const char *widget_size_names[] = { +static const gchar *widget_size_names[] = { N_("GtkTreeView Horizontal Separation") }; static GtkWidget *widget_size_widgets[G_N_ELEMENTS(widget_size_prefs)]; -static const char *font_prefs[] = { +static const gchar *font_prefs[] = { "/plugins/gtk/purplerc/font/*pidgin_conv_entry", "/plugins/gtk/purplerc/font/*pidgin_conv_imhtml", "/plugins/gtk/purplerc/font/*pidgin_log_imhtml", "/plugins/gtk/purplerc/font/*pidgin_request_imhtml", "/plugins/gtk/purplerc/font/*pidgin_notify_imhtml", }; -static const char *font_prefs_set[] = { +static const gchar *font_prefs_set[] = { "/plugins/gtk/purplerc/set/font/*pidgin_conv_entry", "/plugins/gtk/purplerc/set/font/*pidgin_conv_imhtml", "/plugins/gtk/purplerc/set/font/*pidgin_log_imhtml", "/plugins/gtk/purplerc/set/font/*pidgin_request_imhtml", "/plugins/gtk/purplerc/set/font/*pidgin_notify_imhtml", }; -static const char *font_names[] = { +static const gchar *font_names[] = { N_("Conversation Entry"), N_("Conversation History"), N_("Log Viewer"), @@ -79,53 +79,56 @@ static GtkWidget *font_widgets[G_N_ELEMENTS(font_prefs)]; /* -static const char *widget_bool_prefs[] = { +static const gchar *widget_bool_prefs[] = { }; -static const char *widget_bool_prefs_set[] = { +static const gchar *widget_bool_prefs_set[] = { }; -static const char *widget_bool_names[] = { +static const gchar *widget_bool_names[] = { }; static GtkWidget *widget_bool_widgets[G_N_ELEMENTS(widget_bool_prefs)]; */ -static void -purplerc_make_changes() +static GString * +make_gtkrc_string() { - int i; - char *prefbase = NULL; -#if GTK_CHECK_VERSION(2,4,0) - GtkSettings *setting = NULL; -#endif + gint i; + gchar *prefbase = NULL; GString *style_string = g_string_new(""); if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name")) { - const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name"); + const gchar *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name"); - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, "gtk-font-name = \"%s\"\n", pref); + if (pref != NULL && strcmp(pref, "")) { + g_string_append_printf(style_string, + "gtk-font-name = \"%s\"\n", + pref); + } } if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name")) { - const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name"); + const gchar *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name"); - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, "gtk-key-theme-name = \"%s\"\n", pref); + if (pref != NULL && strcmp(pref, "")) { + g_string_append_printf(style_string, + "gtk-key-theme-name = \"%s\"\n", + pref); + } } - g_string_append(style_string, "style \"purplerc_style\" {\n"); + g_string_append(style_string, "style \"purplerc_style\"\n{"); for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) { if (purple_prefs_get_bool(color_prefs_set[i])) { - const char *pref; - - prefbase = g_path_get_basename(color_prefs[i]); - pref = purple_prefs_get_string(color_prefs[i]); + const gchar *pref; - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, - "%s = \"%s\"\n", - prefbase, pref); - g_free(prefbase); + pref = purple_prefs_get_string(color_prefs[i]); + if (pref != NULL && strcmp(pref, "")) { + prefbase = g_path_get_basename(color_prefs[i]); + g_string_append_printf(style_string, + "\n\t%s = \"%s\"", + prefbase, pref); + g_free(prefbase); + } } } @@ -133,7 +136,7 @@ if (purple_prefs_get_bool(widget_size_prefs_set[i])) { prefbase = g_path_get_basename(widget_size_prefs[i]); g_string_append_printf(style_string, - "%s = %d\n", prefbase, + "\n\t%s = %d", prefbase, purple_prefs_get_int(widget_size_prefs[i])); g_free(prefbase); } @@ -144,37 +147,47 @@ if (purple_prefs_get_bool(widget_bool_prefs_set[i])) { prefbase = g_path_get_basename(widget_bool_prefs[i]); g_string_append_printf(style_string, - "%s = %d\n", prefbase, + "\t%s = %d\n", prefbase, purple_prefs_get_bool(widget_bool_prefs[i])); g_free(prefbase); } } */ - g_string_append(style_string, "}"); - g_string_append(style_string, "widget_class \"*\" style \"purplerc_style\"\n"); + g_string_append(style_string, "\n}\nwidget_class \"*\" style \"purplerc_style\"\n"); for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) { if (purple_prefs_get_bool(font_prefs_set[i])) { - const char *pref; - - prefbase = g_path_get_basename(font_prefs[i]); - pref = purple_prefs_get_string(font_prefs[i]); + const gchar *pref; - if (pref != NULL && strcmp(pref, "")) + pref = purple_prefs_get_string(font_prefs[i]); + if (pref != NULL && strcmp(pref, "")) { + prefbase = g_path_get_basename(font_prefs[i]); g_string_append_printf(style_string, - "style \"%s_style\"\n" - "{font_name = \"%s\"}\n" - "widget \"%s\" " + "style \"%s_style\"\n{\n" + "\tfont_name = \"%s\"\n}" + "\nwidget \"%s\" " "style \"%s_style\"\n", prefbase, pref, prefbase, prefbase); - g_free(prefbase); + g_free(prefbase); + } } } - gtk_rc_parse_string(style_string->str); - g_string_free(style_string, TRUE); + return style_string; +} + +static void +purplerc_make_changes() +{ + GString *str = make_gtkrc_string(); +#if GTK_CHECK_VERSION(2,4,0) + GtkSettings *setting = NULL; +#endif + + gtk_rc_parse_string(str->str); + g_string_free(str, TRUE); #if GTK_CHECK_VERSION(2,4,0) setting = gtk_settings_get_default(); @@ -185,92 +198,10 @@ static void purplerc_write(GtkWidget *widget, gpointer data) { - int i; - GString *style_string = g_string_new(""); - char *prefbase = NULL; - - if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name")) { - const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name"); - - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, - "gtk-font-name = \"%s\"\n", - pref); - } - - if (purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name")) { - const char *pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-key-theme-name"); - - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, - "gtk-key-theme-name = \"%s\"\n", - pref); - } - - g_string_append(style_string, "style \"purplerc_style\" {\n"); - - for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) { - if (purple_prefs_get_bool(color_prefs_set[i])) { - const char *pref; - - prefbase = g_path_get_basename(color_prefs[i]); - pref = purple_prefs_get_string(color_prefs[i]); - - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, - "%s = \"%s\"\n", - prefbase, pref); - g_free(prefbase); - } - } - - for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) { - if (purple_prefs_get_bool(widget_size_prefs_set[i])) { - prefbase = g_path_get_basename(widget_size_prefs[i]); - g_string_append_printf(style_string, - "%s = %d\n", prefbase, - purple_prefs_get_int(widget_size_prefs[i])); - g_free(prefbase); - } - } - - /* - for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) { - if (purple_prefs_get_bool(widget_bool_prefs_set[i])) { - prefbase = g_path_get_basename(widget_bool_prefs[i]); - g_string_append_printf(style_string, - "%s = %d\n", prefbase, - purple_prefs_get_bool(widget_bool_prefs[i])); - g_free(prefbase); - } - } - */ - - g_string_append(style_string, "}"); - g_string_append(style_string, "widget_class \"*\" style \"purplerc_style\"\n"); - - for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) { - if (purple_prefs_get_bool(font_prefs_set[i])) { - const char *pref; - - prefbase = g_path_get_basename(font_prefs[i]); - pref = purple_prefs_get_string(font_prefs[i]); - - if (pref != NULL && strcmp(pref, "")) - g_string_append_printf(style_string, - "style \"%s_style\"\n" - "{font_name = \"%s\"}\n" - "widget \"%s\" " - "style \"%s_style\"\n", - prefbase, pref, - prefbase, prefbase); - g_free(prefbase); - } - } - - purple_util_write_data_to_file("gtkrc-2.0", style_string->str, -1); - - g_string_free(style_string, TRUE); + GString *str = make_gtkrc_string(); + str = g_string_prepend(str, "# This file automatically written by the Pidgin GTK+ Theme Control plugin.\n# Any changes to this file will be overwritten by the plugin when told to\n# write the settings again.\n# The FAQ (http://developer.pidgin.im/wiki/FAQ) contains some further examples\n# of possible pidgin gtkrc settings.\n"); + purple_util_write_data_to_file("gtkrc-2.0", str->str, -1); + g_string_free(str, TRUE); } static void @@ -283,7 +214,7 @@ static void purplerc_pref_changed_cb(const char *name, PurplePrefType type, - gconstpointer value, gpointer data) + gconstpointer value, gpointer data) { purplerc_make_changes(); } @@ -291,12 +222,12 @@ static void purplerc_color_response(GtkDialog *color_dialog, gint response, gpointer data) { - int subscript = GPOINTER_TO_INT(data); + gint subscript = GPOINTER_TO_INT(data); if (response == GTK_RESPONSE_OK) { + GdkColor color; + gchar colorstr[8]; GtkWidget *colorsel = GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel; - GdkColor color; - char colorstr[8]; gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(colorsel), &color); @@ -311,11 +242,11 @@ static void purplerc_set_color(GtkWidget *widget, gpointer data) { + GdkColor color; + gchar title[128]; + const gchar *pref = NULL; GtkWidget *color_dialog = NULL; - GdkColor color; - char title[128]; - const char *pref = NULL; - int subscript = GPOINTER_TO_INT(data); + gint subscript = GPOINTER_TO_INT(data); g_snprintf(title, sizeof(title), _("Select Color for %s"), _(color_names[GPOINTER_TO_INT(data)])); @@ -337,14 +268,21 @@ static void purplerc_font_response(GtkDialog *font_dialog, gint response, gpointer data) { - int subscript = GPOINTER_TO_INT(data); + const gchar *prefpath; + gint subscript = GPOINTER_TO_INT(data); if (response == GTK_RESPONSE_OK) { - char *fontname = NULL; + gchar *fontname = NULL; + + if (subscript == -1) { + prefpath = "/plugins/gtk/purplerc/gtk-font-name"; + } else { + prefpath = font_prefs[subscript]; + } fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_dialog)); - purple_prefs_set_string(font_prefs[subscript], fontname); + purple_prefs_set_string(prefpath, fontname); g_free(fontname); } gtk_widget_destroy(GTK_WIDGET(font_dialog)); @@ -353,53 +291,25 @@ static void purplerc_set_font(GtkWidget *widget, gpointer data) { + gchar title[128]; GtkWidget *font_dialog = NULL; - char title[128]; - const char *pref = NULL; - int subscript = GPOINTER_TO_INT(data); + gint subscript = GPOINTER_TO_INT(data); + const gchar *pref = NULL, *prefpath = NULL; - g_snprintf(title, sizeof(title), _("Select Font for %s"), - _(font_names[subscript])); + if (subscript == -1) { + g_snprintf(title, sizeof(title), _("Select Interface Font")); + prefpath = "/plugins/gtk/purplerc/gtk-font-name"; + } else { + g_snprintf(title, sizeof(title), _("Select Font for %s"), + _(font_names[subscript])); + prefpath = font_prefs[subscript]; + } + font_dialog = gtk_font_selection_dialog_new(title); g_signal_connect(G_OBJECT(font_dialog), "response", G_CALLBACK(purplerc_font_response), data); - pref = purple_prefs_get_string(font_prefs[subscript]); - - if (pref != NULL && strcmp(pref, "")) { - gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font_dialog)->fontsel), pref); - } - - gtk_window_present(GTK_WINDOW(font_dialog)); -} - -static void -purplerc_font_response_special(GtkDialog *font_dialog, gint response, - gpointer data) -{ - if (response == GTK_RESPONSE_OK) { - char *fontname = NULL; - - fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(font_dialog)); - - purple_prefs_set_string("/plugins/gtk/purplerc/gtk-font-name", - fontname); - g_free(fontname); - } - gtk_widget_destroy(GTK_WIDGET(font_dialog)); -} - -static void -purplerc_set_font_special(GtkWidget *widget, gpointer data) -{ - GtkWidget *font_dialog = NULL; - const char *pref = NULL; - - font_dialog = gtk_font_selection_dialog_new(_("Select Interface Font")); - g_signal_connect(G_OBJECT(font_dialog), "response", - G_CALLBACK(purplerc_font_response_special), NULL); - - pref = purple_prefs_get_string("/plugins/gtk/purplerc/gtk-font-name"); + pref = purple_prefs_get_string(prefpath); if (pref != NULL && strcmp(pref, "")) { gtk_font_selection_set_font_name(GTK_FONT_SELECTION(GTK_FONT_SELECTION_DIALOG(font_dialog)->fontsel), pref); @@ -413,8 +323,10 @@ { purplerc_make_changes(); - pref_callback = purple_prefs_connect_callback(plugin, "/plugins/gtk/purplerc", - purplerc_pref_changed_cb, NULL); + pref_callback = purple_prefs_connect_callback(plugin, + "/plugins/gtk/purplerc", + purplerc_pref_changed_cb, + NULL); return TRUE; } @@ -433,17 +345,23 @@ /* Note: Intentionally not using the size group argument to the * pidgin_prefs_labeled_* functions they only add the text label to * the size group not the whole thing, which isn't what I want. */ - int i; - char *tmp; + gint i; + gchar *tmp; GtkWidget *check = NULL, *widget = NULL; - GtkSizeGroup *labelsg = NULL, *widgetsg = NULL; - GtkWidget *ret = NULL, *frame = NULL, *hbox = NULL, *vbox = NULL; + GtkWidget *ret = NULL, *hbox = NULL, *frame = NULL; + GtkSizeGroup *labelsg = NULL, *widgetsg = NULL, *buttonsg = NULL; +#ifndef _WIN32 + const gchar *homepath = "$HOME"; +#else + const gchar *homepath = "\%APPDATA\%"; +#endif ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE); gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER); labelsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); widgetsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + buttonsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); frame = pidgin_make_frame(ret, _("General")); /* interface font */ @@ -451,12 +369,12 @@ gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); check = pidgin_prefs_checkbox(_("GTK+ Interface Font"), - "/plugins/gtk/purplerc/set/gtk-font-name", - hbox); + "/plugins/gtk/purplerc/set/gtk-font-name", + hbox); gtk_size_group_add_widget(labelsg, check); widget = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT, - PIDGIN_BUTTON_HORIZONTAL); + PIDGIN_BUTTON_HORIZONTAL); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); gtk_size_group_add_widget(widgetsg, widget); gtk_widget_set_sensitive(widget, @@ -464,20 +382,20 @@ g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(pidgin_toggle_sensitive), widget); g_signal_connect(G_OBJECT(widget), "clicked", - G_CALLBACK(purplerc_set_font_special), NULL); + G_CALLBACK(purplerc_set_font), GINT_TO_POINTER(-1)); /* key theme name */ hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE); gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); check = pidgin_prefs_checkbox(_("GTK+ Text Shortcut Theme"), - "/plugins/gtk/purplerc/set/gtk-key-theme-name", - hbox); + "/plugins/gtk/purplerc/set/gtk-key-theme-name", + hbox); gtk_size_group_add_widget(labelsg, check); widget = pidgin_prefs_labeled_entry(hbox, "", - "/plugins/gtk/purplerc/gtk-key-theme-name", - NULL); + "/plugins/gtk/purplerc/gtk-key-theme-name", + NULL); /* gtk_size_group_add_widget(widgetsg, widget); */ @@ -492,7 +410,7 @@ gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); check = pidgin_prefs_checkbox(_(widget_bool_names[i]), - widget_bool_prefs_set[i], hbox); + widget_bool_prefs_set[i], hbox); gtk_size_group_add_widget(labelsg, check); widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox); @@ -514,7 +432,7 @@ gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); check = pidgin_prefs_checkbox(_(color_names[i]), - color_prefs_set[i], hbox); + color_prefs_set[i], hbox); gtk_size_group_add_widget(labelsg, check); color_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_COLOR, PIDGIN_BUTTON_HORIZONTAL); @@ -538,7 +456,7 @@ gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); check = pidgin_prefs_checkbox(_(widget_size_names[i]), - widget_size_prefs_set[i], hbox); + widget_size_prefs_set[i], hbox); gtk_size_group_add_widget(labelsg, check); widget_size_widgets[i] = pidgin_prefs_labeled_spin_button(hbox, "", widget_size_prefs[i], 0, 50, NULL); @@ -559,7 +477,7 @@ gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); check = pidgin_prefs_checkbox(_(font_names[i]), - font_prefs_set[i], hbox); + font_prefs_set[i], hbox); gtk_size_group_add_widget(labelsg, check); font_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT, PIDGIN_BUTTON_HORIZONTAL); @@ -572,27 +490,29 @@ G_CALLBACK(pidgin_toggle_sensitive), font_widgets[i]); g_signal_connect(G_OBJECT(font_widgets[i]), "clicked", - G_CALLBACK(purplerc_set_font), GINT_TO_POINTER(i)); + G_CALLBACK(purplerc_set_font), + GINT_TO_POINTER(i)); } - frame = pidgin_make_frame(ret, _("Tools")); + frame = pidgin_make_frame(ret, _("Gtkrc File Tools")); - vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE); - gtk_box_pack_start(GTK_BOX(frame), vbox, FALSE, FALSE, 0); + hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE); + gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0); - tmp = g_strdup_printf(_("Write settings to %s%sgtkrc-2.0"), purple_user_dir(), G_DIR_SEPARATOR_S); + tmp = g_strdup_printf(_("Write settings to %s%sgtkrc-2.0"), + homepath, G_DIR_SEPARATOR_S); check = gtk_button_new_with_label(tmp); g_free(tmp); - gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0); - gtk_size_group_add_widget(labelsg, check); - g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(purplerc_write), - NULL); + gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0); + gtk_size_group_add_widget(buttonsg, check); + g_signal_connect(G_OBJECT(check), "clicked", + G_CALLBACK(purplerc_write), NULL); check = gtk_button_new_with_label(_("Re-read gtkrc files")); - gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0); - gtk_size_group_add_widget(labelsg, check); - g_signal_connect(G_OBJECT(check), "clicked", G_CALLBACK(purplerc_reread), - NULL); + gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0); + gtk_size_group_add_widget(buttonsg, check); + g_signal_connect(G_OBJECT(check), "clicked", + G_CALLBACK(purplerc_reread), NULL); gtk_widget_show_all(ret); return ret; @@ -645,7 +565,7 @@ static void purplerc_init(PurplePlugin *plugin) { - int i; + gint i; purple_prefs_add_none("/plugins"); purple_prefs_add_none("/plugins/gtk");