diff -r 67ed60178ec7 -r 5e6f56c7ccd9 src/buddy.c
--- a/src/buddy.c Mon Mar 17 05:21:09 2003 +0000
+++ b/src/buddy.c Mon Mar 17 07:21:13 2003 +0000
@@ -59,6 +59,7 @@
/* Docklet nonsense */
static gboolean gaim_gtk_blist_obscured = FALSE;
+static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data);
static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node);
static char *gaim_get_tooltip_text(struct buddy *b);
static GdkPixbuf *gaim_gtk_blist_get_status_icon(struct buddy *b, GaimStatusIconSize size);
@@ -790,7 +791,7 @@
return NULL;
}
-static gchar *gaim_gtk_blist_get_name_markup(struct buddy *b)
+static gchar *gaim_gtk_blist_get_name_markup(struct buddy *b, gboolean selected)
{
char *name = gaim_get_buddy_alias(b);
char *esc = g_markup_escape_text(name, strlen(name)), *text = NULL;
@@ -803,7 +804,7 @@
time_t t;
if (!(blist_options & OPT_BLIST_SHOW_ICONS)) {
- if (b->idle > 0 && blist_options & OPT_BLIST_GREY_IDLERS) {
+ if (b->idle > 0 && blist_options & OPT_BLIST_GREY_IDLERS && !selected) {
text = g_strdup_printf("%s",
esc);
g_free(esc);
@@ -840,7 +841,7 @@
if (b->evil > 0)
warning = g_strdup_printf(_("Warned (%d%%) "), b->evil);
- if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS) {
+ if (b->idle && blist_options & OPT_BLIST_GREY_IDLERS && !selected) {
text = g_strdup_printf("%s\n%s%s%s",
esc,
statustext != NULL ? statustext : "",
@@ -849,10 +850,11 @@
} else if (statustext == NULL && idletime == NULL && warning == NULL) {
text = g_strdup_printf("%s", esc);
} else {
- text = g_strdup_printf("%s\n%s%s%s", esc,
- statustext != NULL ? statustext : "",
- idletime != NULL ? idletime : "",
- warning != NULL ? warning : "");
+ text = g_strdup_printf("%s\n%s%s%s", esc,
+ selected ? "" : "color='dim grey'",
+ statustext != NULL ? statustext : "",
+ idletime != NULL ? idletime : "",
+ warning != NULL ? warning : "");
}
if (idletime)
g_free(idletime);
@@ -902,6 +904,7 @@
GtkWidget *sw;
GtkWidget *button;
GtkSizeGroup *sg;
+ GtkTreeSelection *selection;
GtkTargetEntry gte[] = {{"GAIM_BLIST_NODE", GTK_TARGET_SAME_APP, DRAG_ROW},
{"application/x-im-contact", 0, DRAG_BUDDY}};
@@ -946,6 +949,12 @@
gtkblist->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtkblist->treemodel));
+ /* Set up selection stuff */
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtkblist->treeview));
+ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(gaim_gtk_blist_selection_changed), NULL);
+
+
/* Set up dnd */
gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(gtkblist->treeview), GDK_BUTTON1_MASK, gte,
2, GDK_ACTION_COPY);
@@ -1115,6 +1124,34 @@
}
}
+static gboolean do_selection_changed(GaimBlistNode *new_selection)
+{
+ GaimBlistNode *old_selection = gtkblist->selected_node;
+
+ if(new_selection != gtkblist->selected_node) {
+ gtkblist->selected_node = new_selection;
+ if(new_selection)
+ gaim_gtk_blist_update(NULL, new_selection);
+ if(old_selection)
+ gaim_gtk_blist_update(NULL, old_selection);
+ }
+
+ return FALSE;
+}
+
+static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data)
+{
+ GaimBlistNode *new_selection = NULL;
+ GtkTreeIter iter;
+
+ if(gtk_tree_selection_get_selected(selection, NULL, &iter)){
+ gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter,
+ NODE_COLUMN, &new_selection, -1);
+ }
+ /* we set this up as a timeout, otherwise the blist flickers */
+ g_timeout_add(0, (GSourceFunc)do_selection_changed, new_selection);
+}
+
static void gaim_gtk_blist_update(struct gaim_buddy_list *list, GaimBlistNode *node)
{
@@ -1163,13 +1200,13 @@
expand = TRUE;
}
-
+
oldersibling = node->prev;
while (oldersibling && !get_iter_from_node(oldersibling, &oldersiblingiter))
oldersibling = oldersibling->prev;
gtk_tree_store_insert_after(gtkblist->treemodel, &iter, &groupiter, oldersibling ? &oldersiblingiter : NULL);
-
+
if (blist_options & OPT_BLIST_POPUP)
gtk_window_present(GTK_WINDOW(gtkblist->window));
@@ -1188,10 +1225,12 @@
char *mark;
char *warning = NULL, *idle = NULL;
- status = gaim_gtk_blist_get_status_icon((struct buddy*)node,
+ gboolean selected = (gtkblist->selected_node == node);
+
+ status = gaim_gtk_blist_get_status_icon((struct buddy*)node,
blist_options & OPT_BLIST_SHOW_ICONS ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL);
avatar = gaim_gtk_blist_get_buddy_icon((struct buddy*)node);
- mark = gaim_gtk_blist_get_name_markup((struct buddy*)node);
+ mark = gaim_gtk_blist_get_name_markup((struct buddy*)node, selected);
if (((struct buddy*)node)->idle > 0) {
time_t t;
@@ -1207,18 +1246,18 @@
if (((struct buddy*)node)->evil > 0)
warning = g_strdup_printf("%d%%", ((struct buddy*)node)->evil);
-
+
if((blist_options & OPT_BLIST_GREY_IDLERS)
&& ((struct buddy *)node)->idle) {
- if(warning) {
+ if(warning && !selected) {
char *w2 = g_strdup_printf("%s",
warning);
g_free(warning);
warning = w2;
}
- if(idle) {
+ if(idle && !selected) {
char *i2 = g_strdup_printf("%s",
idle);
g_free(idle);