+char *bytes2si(long long bytes)
+{
+ int i;
+ double b;
+ char *sd;
+ static char ret[64];
+
+ b = bytes;
+ for(i = 0; (b >= 1024) && (i < 4); i++)
+ b /= 1024;
+ if(i == 0)
+ sd = "B";
+ else if(i == 1)
+ sd = "kiB";
+ else if(i == 2)
+ sd = "MiB";
+ else if(i == 3)
+ sd = "GiB";
+ else
+ sd = "TiB";
+ snprintf(ret, 64, "%.1f %s", b, sd);
+ return(ret);
+}
+
+void updatetooltip(void)
+{
+ struct dc_transfer *tr;
+ struct trinfo *tri;
+ int t, i, a, st;
+ intmax_t bc, bt;
+ char *buf;
+ size_t bufsize, bufdata;
+
+ t = i = a = 0;
+ st = bc = bt = -1;
+ for(tr = dc_transfers; tr != NULL; tr = tr->next) {
+ if(tr->dir != DC_TRNSD_DOWN)
+ continue;
+ tri = tr->udata;
+ t++;
+ if(tr->state == DC_TRNS_WAITING)
+ i++;
+ else if((tr->state == DC_TRNS_HS) || (tr->state == DC_TRNS_MAIN))
+ a++;
+ if((tr->state == DC_TRNS_MAIN)) {
+ if(bt == -1)
+ bc = bt = 0;
+ bc += tr->curpos;
+ bt += tr->size;
+ if(tri->speed != -1) {
+ if(st == -1)
+ st = 0;
+ st += tri->speed;
+ }
+ }
+ }
+ buf = NULL;
+ bufsize = bufdata = 0;
+ bprintf(buf, "%s: %i", _("Transfers"), t);
+ if(t > 0)
+ bprintf(buf, " (%i/%i)", i, a);
+ if(bt > 0)
+ bprintf(buf, ", %.1f%%", ((double)bc / (double)bt) * 100.0);
+ if(st != -1)
+ bprintf(buf, ", %s/s", bytes2si(st));
+ addtobuf(buf, 0);
+ gtk_status_icon_set_tooltip(tray, buf);
+ free(buf);
+}
+