File: statistic.cpp

package info (click to toggle)
gcin 2.9.4%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 21,796 kB
  • sloc: cpp: 34,326; ansic: 9,319; makefile: 658; sh: 556
file content (118 lines) | stat: -rw-r--r-- 2,100 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "gcin.h"

#define MAX_KEPT_TIME (5 * 60 * (gint64)1000000)
static gint64 *ch_time;
static int ch_timeN, ch_timeN_a;
static GtkWidget *label_disp, *gwin_stat;
gboolean stat_enabled;
static int timeout_handle;

static int get_ch_count(int mini)
{
  gint64 t = current_time() -  mini * 60 * 1000000;

  int i, N;
  for(i=0,N=0; i < ch_timeN; i++)
    if (ch_time[i] >= t)
      N++;

 return ((double)N/mini + 0.5);
}


void disp_stat()
{
  char tt[512];

  sprintf(tt, _(_L("1,3,5分鐘\n%d,%d,%d/分")), get_ch_count(1), get_ch_count(3), get_ch_count(5));
  gtk_label_set_text(GTK_LABEL(label_disp), tt);
#if WIN32
  gtk_window_present(GTK_WINDOW(gwin_stat));
#endif
}

void add_ch_time()
{
  int i;
  gint64 tim = current_time();
  gint64 tim_exp = tim - MAX_KEPT_TIME;

  for(i=0;i<ch_timeN;i++)
    if (ch_time[i] > tim_exp)
      break;

  if (i) {
    int leftN = ch_timeN - i;
    memmove(ch_time, ch_time+i, sizeof(gint64) * leftN);
    ch_timeN = leftN;
  }

  if (ch_timeN_a <= ch_timeN+1) {
    ch_timeN_a =ch_timeN+1;
    ch_time = trealloc(ch_time, gint64, ch_timeN_a);
  }

  ch_time[ch_timeN++]=tim;
}

void add_ch_time_str(char *s)
{
  int len= strlen(s);
  int i=0;
  while (i< len) {
    if (!(s[i] & 0x80)) {
      i++;
      continue;
    }
    i+=utf8_sz(s+i);
    add_ch_time();
  }

  if (stat_enabled)
    disp_stat();
}

void destory_win_stat()
{
  if (!gwin_stat)
    return;
  gtk_widget_destroy(gwin_stat);
  gwin_stat = NULL;
  g_source_remove(timeout_handle);
}


gboolean timeout_update_stat(gpointer data)
{
  disp_stat();
  return TRUE;
}


void create_stat_win()
{
  gwin_stat = create_no_focus_win ();

  GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (gwin_stat), vbox);


  label_disp = gtk_label_new(NULL);

  gtk_box_pack_start (GTK_BOX (vbox), label_disp, TRUE, TRUE, 0);

  gtk_widget_show_all(gwin_stat);
  timeout_handle = g_timeout_add(3000, timeout_update_stat, NULL);
}



void toggle_stat_win()
{
  stat_enabled ^= 1;
  if (stat_enabled) {
    create_stat_win();
    disp_stat();
  } else
    destory_win_stat();
}