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