Mercurial > pidgin.yaz
annotate src/idle.c @ 11562:9f521a61ef58
[gaim-migrate @ 13828]
More tiny changes. Forward port my saving password through failed connections change, and attach to the Message Send signal of the statusbox imhtml, so that hitting Enter sets the message immediately. I like the timeout; but this will probably make more sense to most people.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Wed, 21 Sep 2005 22:57:10 +0000 |
parents | fb6e85c55fb8 |
children | bf6ba37db13b |
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; | |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
117 gboolean report_idle; |
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
118 const char *idle_method; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
119 GaimAccount *account; |
1026 | 120 time_t t; |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
3905
diff
changeset
|
121 int idle_time; |
1 | 122 |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
123 account = gaim_connection_get_account(gc); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
124 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
125 gaim_signal_emit(gaim_blist_get_handle(), "update-idle"); |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1141
diff
changeset
|
126 |
1026 | 127 time(&t); |
1 | 128 |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
129 idle_method = gaim_prefs_get_string("/gaim/gtk/idle/method"); |
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
130 report_idle = gaim_prefs_get_bool("/gaim/gtk/idle/report"); |
1 | 131 |
1026 | 132 #ifdef USE_SCREENSAVER |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
133 if (idle_method != NULL && !strcmp(idle_method, "system")) |
10319 | 134 idle_time = get_idle_time_from_system(); |
135 else | |
1026 | 136 #endif /* USE_SCREENSAVER */ |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
137 idle_time = t - gc->last_sent_time; |
1 | 138 |
10319 | 139 /* Should be become auto-away? */ |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
140 if (gaim_prefs_get_bool("/core/away/away_when_idle") && |
5748 | 141 (idle_time > (60 * gaim_prefs_get_int("/core/away/mins_before_away"))) |
9949 | 142 && (!gc->is_auto_away)) |
143 { | |
144 GaimPresence *presence; | |
145 | |
146 presence = gaim_account_get_presence(account); | |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
147 |
9949 | 148 if (gaim_presence_is_available(presence)) |
149 { | |
6216 | 150 const char *default_name; |
151 | |
10319 | 152 gaim_debug_info("idle", "Making %s auto-away\n", |
153 gaim_account_get_username(account)); | |
154 | |
6216 | 155 default_name = gaim_prefs_get_string("/core/away/default_message"); |
156 | |
10319 | 157 /* XXX STATUS AWAY CORE/UI */ |
158 /* Need to set the default_name away message for this connection here */ | |
6216 | 159 |
10319 | 160 gc->is_auto_away = GAIM_IDLE_AUTO_AWAY; |
161 } else { | |
162 gc->is_auto_away = GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY; | |
163 } | |
9944 | 164 |
10319 | 165 /* Should we return from being auto-away? */ |
5748 | 166 } else if (gc->is_auto_away && |
167 idle_time < 60 * gaim_prefs_get_int("/core/away/mins_before_away")) { | |
10319 | 168 if (gc->is_auto_away == GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY) { |
169 gc->is_auto_away = GAIM_IDLE_NOT_AWAY; | |
1815
f15d449b3167
[gaim-migrate @ 1825]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1575
diff
changeset
|
170 return TRUE; |
1446
38f712e75836
[gaim-migrate @ 1456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1407
diff
changeset
|
171 } |
10319 | 172 gc->is_auto_away = GAIM_IDLE_NOT_AWAY; |
9944 | 173 |
10319 | 174 /* XXX STATUS AWAY CORE/UI */ |
175 /* Need to set this connection to available here */ | |
1109
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
176 } |
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
177 |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
178 /* Deal with reporting idleness to the server, if appropriate */ |
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
179 if (report_idle && idle_time >= IDLEMARK && !gc->is_idle) { |
10319 | 180 gaim_debug_info("idle", "Setting %s idle %d seconds\n", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
181 gaim_account_get_username(account), idle_time); |
1026 | 182 serv_set_idle(gc, idle_time); |
183 gc->is_idle = 1; | |
7475 | 184 /* LOG system_log(log_idle, gc, NULL, OPT_LOG_BUDDY_IDLE | OPT_LOG_MY_SIGNON); */ |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
185 } else if ((!report_idle || idle_time < IDLEMARK) && gc->is_idle) { |
10319 | 186 gaim_debug_info("idle", "Setting %s unidle\n", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
187 gaim_account_get_username(account)); |
1026 | 188 serv_touch_idle(gc); |
7475 | 189 /* 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
|
190 } |
1 | 191 |
1026 | 192 return TRUE; |
1 | 193 } |