Mercurial > pidgin.yaz
annotate src/idle.c @ 10738:55af3fa46329
[gaim-migrate @ 12340]
Lots of changes here. A lot of it stems from chaning
gaim_account_connect() so that it DOES NOT have the GaimStatus
parameter. It will attempt to use the GaimStatus of your
account from the last time it was connected (which doesn't
work quite right yet).
My goal here was to save and load each account's GaimStatuses
to accounts.xml, so if you were "away" when you signed off then
you'll be "away" when you sign back on. Not quite there yet.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 26 Mar 2005 20:08:43 +0000 |
parents | 3232e1a33899 |
children | fb6e85c55fb8 |
rev | line source |
---|---|
1026 | 1 /* |
2 * gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
1 | 7 * |
1026 | 8 * This program is free software; you can redistribute it and/or modify |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
1 | 12 * |
1026 | 13 * This program is distributed in the hope that it will be useful, |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
1 | 17 * |
1026 | 18 * You should have received a copy of the GNU General Public License |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
1 | 21 * |
22 */ | |
9791 | 23 #include "internal.h" |
1 | 24 |
1026 | 25 #ifdef USE_SCREENSAVER |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
26 # ifndef _WIN32 |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
27 # include <X11/Xlib.h> |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
28 # include <X11/Xutil.h> |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
29 # include <X11/extensions/scrnsaver.h> |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
30 # include <gdk/gdkx.h> |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
31 # else |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
32 # include "idletrack.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
33 # endif |
1026 | 34 #endif /* USE_SCREENSAVER */ |
1 | 35 |
5615
6500a6c8d679
[gaim-migrate @ 6022]
Christian Hammond <chipx86@chipx86.com>
parents:
5563
diff
changeset
|
36 #include "connection.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
37 #include "debug.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
38 #include "log.h" |
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
39 #include "prefs.h" |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
40 #include "signals.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
41 |
4536
ba99d30afc14
[gaim-migrate @ 4815]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4201
diff
changeset
|
42 #define IDLEMARK 600 /* 10 minutes! */ |
1 | 43 |
10319 | 44 typedef enum |
45 { | |
46 GAIM_IDLE_NOT_AWAY = 0, | |
47 GAIM_IDLE_AUTO_AWAY, | |
48 GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY | |
49 | |
50 } GaimAutoAwayState; | |
51 | |
52 #ifdef USE_SCREENSAVER | |
53 /** | |
54 * Get the number of seconds the user has been idle. In Unix-world | |
55 * this is based on the X Windows usage. In MS Windows this is based | |
56 * on keyboard/mouse usage. | |
57 * | |
58 * In Debian bug #271639, jwz says: | |
59 * | |
60 * Gaim should simply ask xscreensaver how long the user has been idle: | |
61 * % xscreensaver-command -time | |
62 * XScreenSaver 4.18: screen blanked since Tue Sep 14 14:10:45 2004 | |
63 * | |
64 * Or you can monitor the _SCREENSAVER_STATUS property on root window #0. | |
65 * Element 0 is the status (0, BLANK, LOCK), element 1 is the time_t since | |
66 * the last state change, and subsequent elements are which hack is running | |
67 * on the various screens: | |
68 * % xprop -f _SCREENSAVER_STATUS 32ac -root _SCREENSAVER_STATUS | |
69 * _SCREENSAVER_STATUS(INTEGER) = BLANK, 1095196626, 10, 237 | |
70 * | |
71 * See watch() in xscreensaver/driver/xscreensaver-command.c. | |
72 * | |
73 * @return The number of seconds the user has been idle. | |
74 */ | |
75 static int | |
76 get_idle_time_from_system() | |
1 | 77 { |
10319 | 78 #ifndef _WIN32 |
79 static XScreenSaverInfo *mit_info = NULL; | |
80 int event_base, error_base; | |
81 if (XScreenSaverQueryExtension(GDK_DISPLAY(), &event_base, &error_base)) { | |
82 if (mit_info == NULL) { | |
83 mit_info = XScreenSaverAllocInfo(); | |
84 } | |
85 XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), mit_info); | |
86 return (mit_info->idle) / 1000; | |
87 } else | |
88 return 0; | |
89 #else | |
90 return (GetTickCount() - wgaim_get_lastactive()) / 1000; | |
91 #endif | |
92 } | |
93 #endif /* USE_SCREENSAVER */ | |
94 | |
95 /* | |
96 * This function should be called when you think your idle state | |
97 * may have changed. Maybe you're over the 10-minute mark and | |
98 * Gaim should start reporting idle time to the server. Maybe | |
99 * you've returned from being idle. Maybe your auto-away message | |
100 * should be set. | |
101 * | |
102 * There is no harm to calling this many many times, other than | |
103 * it will be kinda slow. This is called every 20 seconds by a | |
104 * timer set when an account logs in. It is also called when | |
105 * you send an IM, a chat, etc. | |
106 * | |
107 * This function has 3 sections. | |
108 * 1. Get your idle time. It will query XScreenSaver or Windows | |
109 * or get the Gaim idle time. Whatever. | |
110 * 2. Set or unset your auto-away message. | |
111 * 3. Report your current idle time to the IM server. | |
112 */ | |
113 gint | |
114 check_idle(gpointer data) | |
115 { | |
116 GaimConnection *gc = data; | |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
117 const char *report_idle; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
118 GaimAccount *account; |
1026 | 119 time_t t; |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
3905
diff
changeset
|
120 int idle_time; |
1 | 121 |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
122 account = gaim_connection_get_account(gc); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
123 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
124 gaim_signal_emit(gaim_blist_get_handle(), "update-idle"); |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1141
diff
changeset
|
125 |
1026 | 126 time(&t); |
1 | 127 |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
128 report_idle = gaim_prefs_get_string("/gaim/gtk/idle/reporting_method"); |
1 | 129 |
1026 | 130 #ifdef USE_SCREENSAVER |
10319 | 131 if (report_idle != NULL && !strcmp(report_idle, "system")) |
132 idle_time = get_idle_time_from_system(); | |
133 else | |
1026 | 134 #endif /* USE_SCREENSAVER */ |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
135 idle_time = t - gc->last_sent_time; |
1 | 136 |
10319 | 137 /* Should be become auto-away? */ |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
138 if (gaim_prefs_get_bool("/core/away/away_when_idle") && |
5748 | 139 (idle_time > (60 * gaim_prefs_get_int("/core/away/mins_before_away"))) |
9949 | 140 && (!gc->is_auto_away)) |
141 { | |
142 GaimPresence *presence; | |
143 | |
144 presence = gaim_account_get_presence(account); | |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
145 |
9949 | 146 if (gaim_presence_is_available(presence)) |
147 { | |
6216 | 148 const char *default_name; |
149 | |
10319 | 150 gaim_debug_info("idle", "Making %s auto-away\n", |
151 gaim_account_get_username(account)); | |
152 | |
6216 | 153 default_name = gaim_prefs_get_string("/core/away/default_message"); |
154 | |
10319 | 155 /* XXX STATUS AWAY CORE/UI */ |
156 /* Need to set the default_name away message for this connection here */ | |
6216 | 157 |
10319 | 158 gc->is_auto_away = GAIM_IDLE_AUTO_AWAY; |
159 } else { | |
160 gc->is_auto_away = GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY; | |
161 } | |
9944 | 162 |
10319 | 163 /* Should we return from being auto-away? */ |
5748 | 164 } else if (gc->is_auto_away && |
165 idle_time < 60 * gaim_prefs_get_int("/core/away/mins_before_away")) { | |
10319 | 166 if (gc->is_auto_away == GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY) { |
167 gc->is_auto_away = GAIM_IDLE_NOT_AWAY; | |
1815
f15d449b3167
[gaim-migrate @ 1825]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1575
diff
changeset
|
168 return TRUE; |
1446
38f712e75836
[gaim-migrate @ 1456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1407
diff
changeset
|
169 } |
10319 | 170 gc->is_auto_away = GAIM_IDLE_NOT_AWAY; |
9944 | 171 |
10319 | 172 /* XXX STATUS AWAY CORE/UI */ |
173 /* Need to set this connection to available here */ | |
1109
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
174 } |
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
175 |
10319 | 176 /* |
177 * If we're not reporting idle times to the server, still use Gaim | |
178 * usage for auto-away, but quit here so we don't report to the | |
179 * server. | |
180 * | |
181 * Hmm. What if _while_ we're idle we toggle the pref for reporting | |
182 * idle time to the server? We would never become unidle... | |
183 */ | |
5755
9587ee01dc5d
[gaim-migrate @ 6180]
Christian Hammond <chipx86@chipx86.com>
parents:
5748
diff
changeset
|
184 if (report_idle != NULL && !strcmp(report_idle, "none")) |
1109
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
185 return TRUE; |
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
186 |
4547
1f19b66c5d84
[gaim-migrate @ 4826]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4536
diff
changeset
|
187 if (idle_time >= IDLEMARK && !gc->is_idle) { |
10319 | 188 gaim_debug_info("idle", "Setting %s idle %d seconds\n", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
189 gaim_account_get_username(account), idle_time); |
1026 | 190 serv_set_idle(gc, idle_time); |
191 gc->is_idle = 1; | |
7475 | 192 /* LOG system_log(log_idle, gc, NULL, OPT_LOG_BUDDY_IDLE | OPT_LOG_MY_SIGNON); */ |
4536
ba99d30afc14
[gaim-migrate @ 4815]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4201
diff
changeset
|
193 } else if (idle_time < IDLEMARK && gc->is_idle) { |
10319 | 194 gaim_debug_info("idle", "Setting %s unidle\n", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
195 gaim_account_get_username(account)); |
1026 | 196 serv_touch_idle(gc); |
7475 | 197 /* LOG system_log(log_unidle, gc, NULL, OPT_LOG_BUDDY_IDLE | OPT_LOG_MY_SIGNON); */ |
1029
740c6f933fe0
[gaim-migrate @ 1039]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1028
diff
changeset
|
198 } |
1 | 199 |
1026 | 200 return TRUE; |
1 | 201 } |