# HG changeset patch # User Stu Tomlinson # Date 1178976135 0 # Node ID 9af44da5a6b824b1181fa5a07f642e7e9d25128c # Parent 8ee93c68ced0966f518f7b854ee7c251a30ac222# Parent 541c5ed54e90b42db38b0a0bd11e33e6ee151abf merge of '3906a45b801345d9fe5dde15ca9853fa78ee6839' and '67cdec8942297c0d814a437496e7dcc6189127a7' diff -r 8ee93c68ced0 -r 9af44da5a6b8 finch/finch.c --- a/finch/finch.c Sat May 12 13:21:29 2007 +0000 +++ b/finch/finch.c Sat May 12 13:22:15 2007 +0000 @@ -214,11 +214,6 @@ {0, 0, 0, 0} }; -#ifdef PURPLE_FATAL_ASSERTS - /* Make g_return_... functions fatal. */ - g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL); -#endif - #ifdef ENABLE_NLS bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); diff -r 8ee93c68ced0 -r 9af44da5a6b8 finch/libgnt/gntmain.c --- a/finch/libgnt/gntmain.c Sat May 12 13:21:29 2007 +0000 +++ b/finch/libgnt/gntmain.c Sat May 12 13:22:15 2007 +0000 @@ -144,8 +144,8 @@ event = GNT_MOUSE_UP; } else return FALSE; - - if (gnt_wm_process_click(wm, event, x, y, widget)) + + if (widget && gnt_wm_process_click(wm, event, x, y, widget)) return TRUE; if (event == GNT_LEFT_MOUSE_DOWN && widget && widget != wm->_list.window && @@ -177,7 +177,8 @@ offset = 0; } - gnt_widget_clicked(widget, event, x, y); + if (widget) + gnt_widget_clicked(widget, event, x, y); return TRUE; } @@ -348,6 +349,10 @@ gnt_wm_raise_window(wm, win); } +#ifdef SIGWINCH +static void (*org_winch_handler)(int); +#endif + static void sighandler(int sig) { @@ -357,6 +362,7 @@ werase(stdscr); wrefresh(stdscr); g_idle_add(refresh_screen, NULL); + org_winch_handler(sig); signal(SIGWINCH, sighandler); break; #endif @@ -434,7 +440,7 @@ wrefresh(stdscr); #ifdef SIGWINCH - signal(SIGWINCH, sighandler); + org_winch_handler = signal(SIGWINCH, sighandler); #endif signal(SIGCHLD, sighandler); signal(SIGINT, sighandler); diff -r 8ee93c68ced0 -r 9af44da5a6b8 finch/libgnt/gntwm.c --- a/finch/libgnt/gntwm.c Sat May 12 13:21:29 2007 +0000 +++ b/finch/libgnt/gntwm.c Sat May 12 13:22:15 2007 +0000 @@ -48,6 +48,10 @@ static void update_window_in_list(GntWM *wm, GntWidget *wid); static void shift_window(GntWM *wm, GntWidget *widget, int dir); +#ifndef NO_WIDECHAR +static int widestringwidth(wchar_t *wide); +#endif + static gboolean write_already(gpointer data); static int write_timeout; static time_t last_active_time; @@ -136,6 +140,65 @@ copywin(src, dst, node->scroll, 0, 0, 0, getmaxy(dst) - 1, getmaxx(dst) - 1, 0); } +/** + * The following is a workaround for a bug in most versions of ncursesw. + * Read about it in: http://article.gmane.org/gmane.comp.lib.ncurses.bugs/2751 + * + * In short, if a panel hides one cell of a multi-cell character, then the rest + * of the characters in that line get screwed. The workaround here is to erase + * any such character preemptively. + * + * Caveat: If a wide character is erased, and the panel above it is moved enough + * to expose the entire character, it is not always redrawn. + */ +static void +work_around_for_ncurses_bug() +{ +#ifndef NO_WIDECHAR + PANEL *panel = NULL; + while ((panel = panel_below(panel)) != NULL) { + int sx, ex, sy, ey, w, y; + cchar_t ch; + PANEL *below = panel; + + sx = panel->win->_begx; + ex = panel->win->_maxx + sx; + sy = panel->win->_begy; + ey = panel->win->_maxy + sy; + + while ((below = panel_below(below)) != NULL) { + if (sy > below->win->_begy + below->win->_maxy || + ey < below->win->_begy) + continue; + if (sx > below->win->_begx + below->win->_maxx || + ex < below->win->_begx) + continue; + for (y = MAX(sy, below->win->_begy); y <= MIN(ey, below->win->_begy + below->win->_maxy); y++) { + if (mvwin_wch(below->win, y - below->win->_begy, sx - 1 - below->win->_begx, &ch) != OK) + goto right; + w = widestringwidth(ch.chars); + if (w > 1 && (ch.attr & 1)) { + ch.chars[0] = ' '; + ch.attr &= ~ A_CHARTEXT; + mvwadd_wch(below->win, y - below->win->_begy, sx - 1 - below->win->_begx, &ch); + touchline(below->win, y - below->win->_begy, 1); + } +right: + if (mvwin_wch(below->win, y - below->win->_begy, ex + 1 - below->win->_begx, &ch) != OK) + continue; + w = widestringwidth(ch.chars); + if (w > 1 && !(ch.attr & 1)) { + ch.chars[0] = ' '; + ch.attr &= ~ A_CHARTEXT; + mvwadd_wch(below->win, y - below->win->_begy, ex + 1 - below->win->_begx, &ch); + touchline(below->win, y - below->win->_begy, 1); + } + } + } + } +#endif +} + static gboolean update_screen(GntWM *wm) { @@ -148,6 +211,7 @@ top = top->submenu; } } + work_around_for_ncurses_bug(); update_panels(); doupdate(); return TRUE; diff -r 8ee93c68ced0 -r 9af44da5a6b8 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat May 12 13:21:29 2007 +0000 +++ b/pidgin/gtkconv.c Sat May 12 13:22:15 2007 +0000 @@ -4127,6 +4127,7 @@ GtkTreeViewColumn *col; void *blist_handle = purple_blist_get_handle(); GList *focus_chain = NULL; + int ul_width; gtkchat = gtkconv->u.chat; gc = purple_conversation_get_gc(conv); @@ -4227,8 +4228,13 @@ "pixbuf", CHAT_USERS_ICON_COLUMN, NULL); gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(list), col); - gtk_widget_set_size_request(lbox, - purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width"), -1); + ul_width = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/conversations/chat/userlist_width"); + gtk_widget_set_size_request(lbox, ul_width, -1); + + /* Hack to prevent completely collapsed userlist coming back with a 1 pixel width. + * I would have liked to use the GtkPaned "max-position", but for some reason that didn't work */ + if (ul_width == 0) + gtk_paned_set_position(GTK_PANED(hpaned), 999999); g_signal_connect(G_OBJECT(list), "button_press_event", G_CALLBACK(right_click_chat_cb), gtkconv); diff -r 8ee93c68ced0 -r 9af44da5a6b8 pidgin/gtkutils.c --- a/pidgin/gtkutils.c Sat May 12 13:21:29 2007 +0000 +++ b/pidgin/gtkutils.c Sat May 12 13:22:15 2007 +0000 @@ -510,6 +510,10 @@ const char *proto_name; char buf[256]; int i, selected_index = -1; + char *gtalk_name = NULL; + + if (purple_find_prpl("prpl-jabber")) + gtalk_name = g_strdup(_("Google Talk")); optmenu = gtk_option_menu_new(); gtk_widget_show(optmenu); @@ -528,6 +532,29 @@ plugin = (PurplePlugin *)p->data; prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(plugin); + if (gtalk_name && strcmp(gtalk_name, plugin->info->name) < 0) + { + GtkWidget *gtalk_item; + + filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", + "16", "google-talk.png", NULL); + pixbuf = gdk_pixbuf_new_from_file(filename, NULL); + g_free(filename); + + + if (pixbuf) + image = gtk_image_new_from_pixbuf(pixbuf); + else + image = gtk_image_new(); + + gtalk_item = pidgin_protocol_option_menu_item(menu, sg, image, gtalk_name, "prpl-fake"); + g_object_set_data(G_OBJECT(gtalk_item), "real_protocol", plugin->info->id); + i++; + + g_free(gtalk_name); + gtalk_name = NULL; + } + /* Load the image. */ proto_name = prpl_info->list_icon(NULL, NULL); g_snprintf(buf, sizeof(buf), "%s.png", proto_name); @@ -555,30 +582,16 @@ g_object_set_data(G_OBJECT(optmenu), "last_protocol", plugin->info->id); } - if (!strcmp(plugin->info->id, "prpl-jabber")) - { - GtkWidget *gtalk_item; - - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", - "16", "google-talk.png", NULL); - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); - g_free(filename); - - - if (pixbuf) - image = gtk_image_new_from_pixbuf(pixbuf); - else - image = gtk_image_new(); - - gtalk_item = pidgin_protocol_option_menu_item(menu, sg, image, _("Google Talk"), "prpl-fake"); - g_object_set_data(G_OBJECT(gtalk_item), "real_protocol", plugin->info->id); - i++; - } - if (pixbuf) g_object_unref(G_OBJECT(pixbuf)); } + /* This is only needed if Pidgin has zero prpls compiled in, but + * I'm doing it because it's proper and might make a difference + * for automated source checkers. */ + g_free(gtalk_name); + + gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); if (selected_index != -1) diff -r 8ee93c68ced0 -r 9af44da5a6b8 pidgin/plugins/pidginrc.c --- a/pidgin/plugins/pidginrc.c Sat May 12 13:21:29 2007 +0000 +++ b/pidgin/plugins/pidginrc.c Sat May 12 13:22:15 2007 +0000 @@ -61,16 +61,16 @@ static const char *font_prefs[] = { "/plugins/gtk/purplerc/font/*pidgin_conv_entry", "/plugins/gtk/purplerc/font/*pidgin_conv_imhtml", - "/plugins/gtk/purplerc/font/*pidginlog_imhtml", - "/plugins/gtk/purplerc/font/*pidginrequest_imhtml", - "/plugins/gtk/purplerc/font/*pidginnotify_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[] = { "/plugins/gtk/purplerc/set/font/*pidgin_conv_entry", "/plugins/gtk/purplerc/set/font/*pidgin_conv_imhtml", - "/plugins/gtk/purplerc/set/font/*pidginlog_imhtml", - "/plugins/gtk/purplerc/set/font/*pidginrequest_imhtml", - "/plugins/gtk/purplerc/set/font/*pidginnotify_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[] = { N_("Conversation Entry"), @@ -167,7 +167,7 @@ g_string_append_printf(style_string, "style \"%s_style\"\n" "{font_name = \"%s\"}\n" - "widget \"%s\"" + "widget \"%s\" " "style \"%s_style\"\n", prefbase, pref, prefbase, prefbase); @@ -260,7 +260,7 @@ g_string_append_printf(style_string, "style \"%s_style\"\n" "{font_name = \"%s\"}\n" - "widget \"%s\"" + "widget \"%s\" " "style \"%s_style\"\n", prefbase, pref, prefbase, prefbase);