1 #include "gcin.h"
2
3 #define MAX_KEPT_TIME (5 * 60 * (gint64)1000000)
4 static gint64 *ch_time;
5 static int ch_timeN, ch_timeN_a;
6 static GtkWidget *label_disp, *gwin_stat;
7 gboolean stat_enabled;
8 static int timeout_handle;
9
get_ch_count(int mini)10 static int get_ch_count(int mini)
11 {
12 gint64 t = current_time() - mini * 60 * 1000000;
13
14 int i, N;
15 for(i=0,N=0; i < ch_timeN; i++)
16 if (ch_time[i] >= t)
17 N++;
18
19 return ((double)N/mini + 0.5);
20 }
21
22
disp_stat()23 void disp_stat()
24 {
25 char tt[512];
26
27 sprintf(tt, _(_L("1,3,5分鐘\n%d,%d,%d/分")), get_ch_count(1), get_ch_count(3), get_ch_count(5));
28 gtk_label_set_text(GTK_LABEL(label_disp), tt);
29 #if WIN32
30 gtk_window_present(GTK_WINDOW(gwin_stat));
31 #endif
32 }
33
add_ch_time()34 void add_ch_time()
35 {
36 int i;
37 gint64 tim = current_time();
38 gint64 tim_exp = tim - MAX_KEPT_TIME;
39
40 for(i=0;i<ch_timeN;i++)
41 if (ch_time[i] > tim_exp)
42 break;
43
44 if (i) {
45 int leftN = ch_timeN - i;
46 memmove(ch_time, ch_time+i, sizeof(gint64) * leftN);
47 ch_timeN = leftN;
48 }
49
50 if (ch_timeN_a <= ch_timeN+1) {
51 ch_timeN_a =ch_timeN+1;
52 ch_time = trealloc(ch_time, gint64, ch_timeN_a);
53 }
54
55 ch_time[ch_timeN++]=tim;
56 }
57
add_ch_time_str(char * s)58 void add_ch_time_str(char *s)
59 {
60 int len= strlen(s);
61 int i=0;
62 while (i< len) {
63 if (!(s[i] & 0x80)) {
64 i++;
65 continue;
66 }
67 i+=utf8_sz(s+i);
68 add_ch_time();
69 }
70
71 if (stat_enabled)
72 disp_stat();
73 }
74
destory_win_stat()75 void destory_win_stat()
76 {
77 if (!gwin_stat)
78 return;
79 gtk_widget_destroy(gwin_stat);
80 gwin_stat = NULL;
81 g_source_remove(timeout_handle);
82 }
83
84
timeout_update_stat(gpointer data)85 gboolean timeout_update_stat(gpointer data)
86 {
87 disp_stat();
88 return TRUE;
89 }
90
91
create_stat_win()92 void create_stat_win()
93 {
94 gwin_stat = create_no_focus_win ();
95
96 GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
97 gtk_container_add (GTK_CONTAINER (gwin_stat), vbox);
98
99
100 label_disp = gtk_label_new(NULL);
101
102 gtk_box_pack_start (GTK_BOX (vbox), label_disp, TRUE, TRUE, 0);
103
104 gtk_widget_show_all(gwin_stat);
105 timeout_handle = g_timeout_add(3000, timeout_update_stat, NULL);
106 }
107
108
109
toggle_stat_win()110 void toggle_stat_win()
111 {
112 stat_enabled ^= 1;
113 if (stat_enabled) {
114 create_stat_win();
115 disp_stat();
116 } else
117 destory_win_stat();
118 }
119