comparison pidgin/gtkblist.c @ 15486:e9a869472b40

really fix that tooltip display glitch
author Nathan Walp <nwalp@pidgin.im>
date Fri, 02 Feb 2007 03:01:58 +0000
parents f83ef1bee399
children 5369a4999f1c
comparison
equal deleted inserted replaced
15485:f83ef1bee399 15486:e9a869472b40
2284 gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, 2284 gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
2285 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1); 2285 NULL, gtkblist->tipwindow, "tooltip", 0, 0, -1, -1);
2286 2286
2287 max_width = 0; 2287 max_width = 0;
2288 max_text_width = 0; 2288 max_text_width = 0;
2289
2289 for(l = gtkblist->tooltipdata; l; l = l->next) 2290 for(l = gtkblist->tooltipdata; l; l = l->next)
2290 { 2291 {
2291 struct tooltip_data *td = l->data; 2292 struct tooltip_data *td = l->data;
2292 max_text_width = MAX(max_text_width, 2293 max_text_width = MAX(max_text_width,
2293 MAX(td->width, td->name_width)); 2294 MAX(td->width, td->name_width));
2295 }
2296
2297 for(l = gtkblist->tooltipdata; l; l = l->next)
2298 {
2299 struct tooltip_data *td = l->data;
2294 max_width = MAX(max_width, 2300 max_width = MAX(max_width,
2295 TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + 2301 TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE +
2296 max_text_width + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER); 2302 max_text_width + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER);
2297 prpl_col = MAX(prpl_col, 2303 prpl_col = MAX(prpl_col,
2298 TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + td->name_width - PRPL_SIZE); 2304 TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + td->name_width - PRPL_SIZE);
2306 if (td->avatar && gaim_gdk_pixbuf_is_opaque(td->avatar)) 2312 if (td->avatar && gaim_gdk_pixbuf_is_opaque(td->avatar))
2307 gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, 2313 gtk_paint_flat_box(style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT,
2308 NULL, gtkblist->tipwindow, "tooltip", 2314 NULL, gtkblist->tipwindow, "tooltip",
2309 max_width - (td->avatar_width+ TOOLTIP_BORDER)-1, 2315 max_width - (td->avatar_width+ TOOLTIP_BORDER)-1,
2310 current_height-1,td->avatar_width+2, td->avatar_height+2); 2316 current_height-1,td->avatar_width+2, td->avatar_height+2);
2311
2312 2317
2313 #if GTK_CHECK_VERSION(2,2,0) 2318 #if GTK_CHECK_VERSION(2,2,0)
2314 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon, 2319 gdk_draw_pixbuf(GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, td->status_icon,
2315 0, 0, TOOLTIP_BORDER, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0); 2320 0, 0, TOOLTIP_BORDER, current_height, -1 , -1, GDK_RGB_DITHER_NONE, 0, 0);
2316 if(td->avatar) 2321 if(td->avatar)
2327 #else 2332 #else
2328 gdk_pixbuf_render_to_drawable(td->status_icon, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 12, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 2333 gdk_pixbuf_render_to_drawable(td->status_icon, GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 12, current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
2329 if(td->avatar) 2334 if(td->avatar)
2330 gdk_pixbuf_render_to_drawable(td->avatar, 2335 gdk_pixbuf_render_to_drawable(td->avatar,
2331 GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0, 2336 GDK_DRAWABLE(gtkblist->tipwindow->window), NULL, 0, 0,
2332 max_width - (td->avatar_width + 12), 2337 max_width - (td->avatar_width + TOOLTIP_BORDER),
2333 current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); 2338 current_height, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
2334 #endif 2339 #endif
2335 2340
2336 gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE, 2341 gtk_paint_layout (style, gtkblist->tipwindow->window, GTK_STATE_NORMAL, FALSE,
2337 NULL, gtkblist->tipwindow, "tooltip", 2342 NULL, gtkblist->tipwindow, "tooltip",
2468 h = TOOLTIP_BORDER + MAX(td->height + td->name_height, MAX(STATUS_SIZE, td->avatar_height)) 2473 h = TOOLTIP_BORDER + MAX(td->height + td->name_height, MAX(STATUS_SIZE, td->avatar_height))
2469 + TOOLTIP_BORDER; 2474 + TOOLTIP_BORDER;
2470 } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) { 2475 } else if(GAIM_BLIST_NODE_IS_CONTACT(node)) {
2471 GaimBlistNode *child; 2476 GaimBlistNode *child;
2472 GaimBuddy *b = gaim_contact_get_priority_buddy((GaimContact *)node); 2477 GaimBuddy *b = gaim_contact_get_priority_buddy((GaimContact *)node);
2478 GList *l;
2473 int tw = 0; 2479 int tw = 0;
2474 w = h = 0; 2480 w = h = 0;
2481
2475 for(child = node->child; child; child = child->next) 2482 for(child = node->child; child; child = child->next)
2476 { 2483 {
2477 if(GAIM_BLIST_NODE_IS_BUDDY(child) && buddy_is_displayable((GaimBuddy*)child)) { 2484 if(GAIM_BLIST_NODE_IS_BUDDY(child) && buddy_is_displayable((GaimBuddy*)child)) {
2478 struct tooltip_data *td = create_tip_for_node(child, (b == (GaimBuddy*)child)); 2485 struct tooltip_data *td = create_tip_for_node(child, (b == (GaimBuddy*)child));
2479 if (b == (GaimBuddy *)child) { 2486 if (b == (GaimBuddy *)child) {
2480 gtkblist->tooltipdata = g_list_prepend(gtkblist->tooltipdata, td); 2487 gtkblist->tooltipdata = g_list_prepend(gtkblist->tooltipdata, td);
2481 } else { 2488 } else {
2482 gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); 2489 gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td);
2483 } 2490 }
2484 tw = MAX(tw, MAX(td->width, td->name_width)); 2491 tw = MAX(tw, MAX(td->width, td->name_width));
2485 w = MAX(w, TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE + 2492 }
2493 }
2494
2495 for(l = gtkblist->tooltipdata; l; l = l->next)
2496 {
2497 struct tooltip_data *td = l->data;
2498 w = MAX(w, TOOLTIP_BORDER + STATUS_SIZE + SMALL_SPACE +
2486 tw + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER); 2499 tw + SMALL_SPACE + td->avatar_width + TOOLTIP_BORDER);
2487 h += MAX(TOOLTIP_BORDER + MAX(STATUS_SIZE,td->avatar_height) + TOOLTIP_BORDER, 2500 h += MAX(TOOLTIP_BORDER + MAX(STATUS_SIZE,td->avatar_height) + TOOLTIP_BORDER,
2488 TOOLTIP_BORDER + td->height + td->name_height + TOOLTIP_BORDER); 2501 TOOLTIP_BORDER + td->height + td->name_height + TOOLTIP_BORDER);
2489 }
2490 } 2502 }
2491 } else { 2503 } else {
2492 gtk_widget_destroy(gtkblist->tipwindow); 2504 gtk_widget_destroy(gtkblist->tipwindow);
2493 gtkblist->tipwindow = NULL; 2505 gtkblist->tipwindow = NULL;
2494 return FALSE; 2506 return FALSE;