Mercurial > pidgin.yaz
annotate src/idle.c @ 11784:141368559673
[gaim-migrate @ 14075]
I don't like showing the "add an account!" dialog for new users
that have 0 accounts. I think showing 3 windows when a new
users starts Gaim is too many. It's distracting. It should
hopefully be obvious that they need to click the "add" button
to get started. If not, someone should modify the accounts list
to show a helpful message, like "Click the add button to get started"
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 24 Oct 2005 02:43:19 +0000 |
parents | 743b574c81b9 |
children |
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" |
11677 | 40 #include "savedstatuses.h" |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
41 #include "signals.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5755
diff
changeset
|
42 |
11677 | 43 #define IDLEMARK 600 /* 10 minutes! */ |
1 | 44 |
10319 | 45 typedef enum |
46 { | |
47 GAIM_IDLE_NOT_AWAY = 0, | |
48 GAIM_IDLE_AUTO_AWAY, | |
49 GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY | |
50 | |
51 } GaimAutoAwayState; | |
52 | |
53 #ifdef USE_SCREENSAVER | |
54 /** | |
55 * Get the number of seconds the user has been idle. In Unix-world | |
56 * this is based on the X Windows usage. In MS Windows this is based | |
57 * on keyboard/mouse usage. | |
58 * | |
59 * In Debian bug #271639, jwz says: | |
60 * | |
61 * Gaim should simply ask xscreensaver how long the user has been idle: | |
62 * % xscreensaver-command -time | |
63 * XScreenSaver 4.18: screen blanked since Tue Sep 14 14:10:45 2004 | |
64 * | |
65 * Or you can monitor the _SCREENSAVER_STATUS property on root window #0. | |
66 * Element 0 is the status (0, BLANK, LOCK), element 1 is the time_t since | |
67 * the last state change, and subsequent elements are which hack is running | |
68 * on the various screens: | |
69 * % xprop -f _SCREENSAVER_STATUS 32ac -root _SCREENSAVER_STATUS | |
70 * _SCREENSAVER_STATUS(INTEGER) = BLANK, 1095196626, 10, 237 | |
71 * | |
72 * See watch() in xscreensaver/driver/xscreensaver-command.c. | |
73 * | |
74 * @return The number of seconds the user has been idle. | |
75 */ | |
76 static int | |
77 get_idle_time_from_system() | |
1 | 78 { |
10319 | 79 #ifndef _WIN32 |
80 static XScreenSaverInfo *mit_info = NULL; | |
81 int event_base, error_base; | |
82 if (XScreenSaverQueryExtension(GDK_DISPLAY(), &event_base, &error_base)) { | |
83 if (mit_info == NULL) { | |
84 mit_info = XScreenSaverAllocInfo(); | |
85 } | |
86 XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), mit_info); | |
87 return (mit_info->idle) / 1000; | |
88 } else | |
89 return 0; | |
90 #else | |
91 return (GetTickCount() - wgaim_get_lastactive()) / 1000; | |
92 #endif | |
93 } | |
94 #endif /* USE_SCREENSAVER */ | |
95 | |
96 /* | |
97 * This function should be called when you think your idle state | |
98 * may have changed. Maybe you're over the 10-minute mark and | |
99 * Gaim should start reporting idle time to the server. Maybe | |
100 * you've returned from being idle. Maybe your auto-away message | |
101 * should be set. | |
102 * | |
103 * There is no harm to calling this many many times, other than | |
104 * it will be kinda slow. This is called every 20 seconds by a | |
105 * timer set when an account logs in. It is also called when | |
106 * you send an IM, a chat, etc. | |
107 * | |
108 * This function has 3 sections. | |
109 * 1. Get your idle time. It will query XScreenSaver or Windows | |
110 * or get the Gaim idle time. Whatever. | |
111 * 2. Set or unset your auto-away message. | |
112 * 3. Report your current idle time to the IM server. | |
113 */ | |
11677 | 114 /* TODO: This needs to be namespaced or moved elsewhere. */ |
10319 | 115 gint |
116 check_idle(gpointer data) | |
117 { | |
118 GaimConnection *gc = data; | |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
119 gboolean report_idle; |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
120 GaimAccount *account; |
1026 | 121 time_t t; |
4201
511c2b63caa4
[gaim-migrate @ 4432]
Christian Hammond <chipx86@chipx86.com>
parents:
3905
diff
changeset
|
122 int idle_time; |
1 | 123 |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
124 account = gaim_connection_get_account(gc); |
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
125 |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
126 gaim_signal_emit(gaim_blist_get_handle(), "update-idle"); |
1250
b5783215b245
[gaim-migrate @ 1260]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1141
diff
changeset
|
127 |
1026 | 128 time(&t); |
1 | 129 |
11287
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 |
10319 | 133 idle_time = get_idle_time_from_system(); |
11697 | 134 #else |
135 /* | |
136 * If Gaim wasn't built with xscreensaver support, then | |
137 * fallback to calculating our idle time based on when | |
138 * we last sent a message. | |
139 */ | |
140 idle_time = t - gc->last_sent_time; | |
1026 | 141 #endif /* USE_SCREENSAVER */ |
1 | 142 |
11697 | 143 /* Should we become auto-away? */ |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
144 if (gaim_prefs_get_bool("/core/away/away_when_idle") && |
5748 | 145 (idle_time > (60 * gaim_prefs_get_int("/core/away/mins_before_away"))) |
9949 | 146 && (!gc->is_auto_away)) |
147 { | |
148 GaimPresence *presence; | |
149 | |
150 presence = gaim_account_get_presence(account); | |
5560
b7319c094153
[gaim-migrate @ 5961]
Christian Hammond <chipx86@chipx86.com>
parents:
5548
diff
changeset
|
151 |
9949 | 152 if (gaim_presence_is_available(presence)) |
153 { | |
11654 | 154 const char *idleaway_name; |
11677 | 155 GaimSavedStatus *saved_status; |
6216 | 156 |
10319 | 157 gaim_debug_info("idle", "Making %s auto-away\n", |
158 gaim_account_get_username(account)); | |
159 | |
11654 | 160 /* Mark our accounts "away" using the idleaway status */ |
161 idleaway_name = gaim_prefs_get_string("/core/status/idleaway"); | |
11677 | 162 saved_status = gaim_savedstatus_find(idleaway_name); |
11725 | 163 if (saved_status) |
164 gaim_savedstatus_activate(saved_status); | |
6216 | 165 |
10319 | 166 gc->is_auto_away = GAIM_IDLE_AUTO_AWAY; |
167 } else { | |
168 gc->is_auto_away = GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY; | |
169 } | |
9944 | 170 |
10319 | 171 /* Should we return from being auto-away? */ |
5748 | 172 } else if (gc->is_auto_away && |
173 idle_time < 60 * gaim_prefs_get_int("/core/away/mins_before_away")) { | |
10319 | 174 if (gc->is_auto_away == GAIM_IDLE_AWAY_BUT_NOT_AUTO_AWAY) { |
175 gc->is_auto_away = GAIM_IDLE_NOT_AWAY; | |
1815
f15d449b3167
[gaim-migrate @ 1825]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1575
diff
changeset
|
176 return TRUE; |
1446
38f712e75836
[gaim-migrate @ 1456]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1407
diff
changeset
|
177 } |
10319 | 178 gc->is_auto_away = GAIM_IDLE_NOT_AWAY; |
9944 | 179 |
10319 | 180 /* XXX STATUS AWAY CORE/UI */ |
181 /* Need to set this connection to available here */ | |
1109
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
182 } |
c73736fa0b7c
[gaim-migrate @ 1119]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1062
diff
changeset
|
183 |
11287
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
184 /* Deal with reporting idleness to the server, if appropriate */ |
fb6e85c55fb8
[gaim-migrate @ 13484]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10423
diff
changeset
|
185 if (report_idle && idle_time >= IDLEMARK && !gc->is_idle) { |
10319 | 186 gaim_debug_info("idle", "Setting %s idle %d seconds\n", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
187 gaim_account_get_username(account), idle_time); |
1026 | 188 serv_set_idle(gc, idle_time); |
189 gc->is_idle = 1; | |
7475 | 190 /* 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
|
191 } else if ((!report_idle || idle_time < IDLEMARK) && gc->is_idle) { |
10319 | 192 gaim_debug_info("idle", "Setting %s unidle\n", |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
193 gaim_account_get_username(account)); |
1026 | 194 serv_touch_idle(gc); |
7475 | 195 /* 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
|
196 } |
1 | 197 |
1026 | 198 return TRUE; |
1 | 199 } |