pidgin/plugins/idle-xscreensaver/idle-xscreensaver.c

Sun, 10 Aug 2025 23:44:08 +0800

author
Gong Zhile <gongzl@stu.hebust.edu.cn>
date
Sun, 10 Aug 2025 23:44:08 +0800
branch
purple_conversation_find_message_by_id
changeset 43309
099e1dfb856b
parent 43179
9d11a64f19f4
permissions
-rw-r--r--

Add Purple.Conversation.find_message_by_id

The method was added so that a protocol or plugin could easily lookup
for the reference for a message. This will be especially useful when a
protocol received a quoted message but only with an id.

42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Pidgin - Internet Messenger
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
5 * Pidgin is the legal property of its developers, whose names are too numerous
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
7 * source distribution.
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
8 *
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * (at your option) any later version.
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * GNU General Public License for more details.
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
20 * along with this program; if not, see <https://www.gnu.org/licenses/>.
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
23 #include <glib.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
24 #include <glib/gi18n-lib.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26 #include <gtk/gtk.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 #include <gdk/x11/gdkx.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 #include <X11/Xlib.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30 #include <X11/Xatom.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
31
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32 #include <gplugin.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
33 #include <gplugin-native.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
34
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
35 #include <purple.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
36
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
37 #include <pidgin.h>
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
38
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
39 #define PIDGIN_IDLE_XSCREENSAVER_DOMAIN (g_quark_from_static_string("idle-xscreensaver"))
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
40 #define PIDGIN_IDLE_XSCREENSAVER_IDLE_SOURCE ("pidgin-xscreensaver")
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
41
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
42 /******************************************************************************
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
43 * Globals
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
44 *****************************************************************************/
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
45 static GDateTime *idle_at = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
46
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
47 static Atom XA_BLANK = 0;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
48 static Atom XA_SCREENSAVER_STATUS = 0;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
49
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
50 /******************************************************************************
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
51 * Callbacks
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
52 *****************************************************************************/
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
53 static gboolean
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
54 pidgin_idle_xscreensaver_xevent_cb(GdkX11Display *gdk_display, gpointer xevent,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
55 G_GNUC_UNUSED gpointer data)
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
56 {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
57 XEvent *event = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
58
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
59 if(xevent == NULL) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
60 return FALSE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
61 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
62
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
63 event = xevent;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
64
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
65 if(event->type == PropertyNotify &&
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
66 event->xproperty.state == PropertyNewValue &&
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
67 event->xproperty.atom == XA_SCREENSAVER_STATUS)
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
68 {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
69 Atom type;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
70 Display *x11_display = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
71 Window root_window;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
72 int result = 0;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
73 int format = 0;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
74 gulong n_items = 0;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
75 gulong bytes_after = 0;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
76 guchar *x_data_ptr = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
77
43179
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
78 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
79 x11_display = gdk_x11_display_get_xdisplay(gdk_display);
43179
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
80 G_GNUC_END_IGNORE_DEPRECATIONS
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
81
42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
82 root_window = RootWindow(x11_display, 0);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
83
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
84 /* We don't use format or bytes_after, but if you pass NULL we
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
85 * segfault, so we need them to avoid that.
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
86 */
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
87 result = XGetWindowProperty(x11_display, root_window,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
88 XA_SCREENSAVER_STATUS, 0, 999, False,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
89 XA_INTEGER, &type, &format, &n_items,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
90 &bytes_after, &x_data_ptr);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
91 if(result == Success && type != 0 && x_data_ptr != NULL) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
92 gulong *x_data = (gulong *)x_data_ptr;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
93 gboolean need_to_set = FALSE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
94 const char *state = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
95
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
96 if(type != XA_INTEGER || n_items < 3) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
97 g_clear_pointer(&x_data, XFree);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
98
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
99 g_message("malformed status, ignoring");
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
100
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
101 return FALSE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
102 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
103
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
104 if(x_data[0] == XA_BLANK && idle_at == NULL) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
105 state = "blank";
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
106 idle_at = g_date_time_new_from_unix_local((gint64)x_data[1]);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
107 need_to_set = TRUE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
108 } else if(x_data[0] == 0) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
109 need_to_set = TRUE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
110 state = "unblank";
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
111 g_clear_pointer(&idle_at, g_date_time_unref);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
112 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
113
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
114 if(need_to_set) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
115 PurpleIdleManager *manager = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
116
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
117 manager = purple_idle_manager_get_default();
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
118 purple_idle_manager_set_source(manager,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
119 PIDGIN_IDLE_XSCREENSAVER_IDLE_SOURCE,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
120 idle_at);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
121 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
122
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
123 if(state != NULL) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
124 g_message("state changed to %s", state);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
125 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
126
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
127 g_clear_pointer(&x_data, XFree);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
128 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
129 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
130
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
131 return FALSE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
132 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
133
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
134 /******************************************************************************
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
135 * Plugin Exports
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
136 *****************************************************************************/
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
137 static GPluginPluginInfo *
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
138 pidgin_idle_xscreensaver_query(G_GNUC_UNUSED GError **error) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
139 const gchar * const authors[] = {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
140 "Pidgin Developers <devel@pidgin.im>",
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
141 NULL
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
142 };
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
143 const char *description = N_("Reads the idle status from XScreenSaver. "
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
144 "If you aren't using XScreenSaver directly this will not do anything "
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
145 "useful for you.");
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
146
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
147 return purple_plugin_info_new(
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
148 "id", "pidgin-idle-xscreensaver",
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
149 "abi-version", PURPLE_ABI_VERSION,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
150 "name", N_("XScreenSaver idle reporting"),
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
151 "version", DISPLAY_VERSION,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
152 "category", N_("Presence"),
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
153 "summary", N_("Read idle state from XScreenSaver"),
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
154 "description", description,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
155 "authors", authors,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
156 "website", PURPLE_WEBSITE,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
157 NULL);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
158 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
159
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
160 static gboolean
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
161 pidgin_idle_xscreensaver_load(GPluginPlugin *plugin, GError **error) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
162 PurpleIdleManager *manager = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
163 GdkDisplay *gdk_display = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
164 Display *x11_display = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
165 Window root_window;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
166 XWindowAttributes attributes;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
167
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
168 /* Remove any previous idle source we had to make sure we're in a known
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
169 * state.
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
170 */
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
171 manager = purple_idle_manager_get_default();
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
172 purple_idle_manager_set_source(manager,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
173 PIDGIN_IDLE_XSCREENSAVER_IDLE_SOURCE,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
174 NULL);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
175
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
176 gdk_display = gdk_display_get_default();
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
177 if(gdk_display == NULL) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
178 g_set_error_literal(error, PIDGIN_IDLE_XSCREENSAVER_DOMAIN, 0,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
179 _("failed to find display"));
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
180
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
181 return FALSE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
182 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
183
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
184 if(!GDK_IS_X11_DISPLAY(gdk_display)) {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
185 g_set_error_literal(error, PIDGIN_IDLE_XSCREENSAVER_DOMAIN, 0,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
186 _("display is not an x11 display"));
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
187
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
188 return FALSE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
189 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
190
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
191 /* Set our input mask. */
43179
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
192 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
193 x11_display = gdk_x11_display_get_xdisplay(gdk_display);
43179
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
194 G_GNUC_END_IGNORE_DEPRECATIONS
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
195
42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
196 root_window = RootWindow(x11_display, 0);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
197 XGetWindowAttributes(x11_display, root_window, &attributes);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
198 XSelectInput(x11_display, root_window,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
199 attributes.your_event_mask | PropertyChangeMask);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
200
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
201 /* Grab our atoms. */
43179
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
202 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
203 XA_BLANK = gdk_x11_get_xatom_by_name_for_display(GDK_X11_DISPLAY(gdk_display),
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
204 "BLANK");
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
205 XA_SCREENSAVER_STATUS = gdk_x11_get_xatom_by_name_for_display(GDK_X11_DISPLAY(gdk_display),
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
206 "_SCREENSAVER_STATUS");
43179
9d11a64f19f4 Ignore deprecated api in the XScreenSaver idle source
Gary Kramlich <grim@reaperworld.com>
parents: 42459
diff changeset
207 G_GNUC_END_IGNORE_DEPRECATIONS
42459
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
208
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
209 /* Connect our signal. */
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
210 g_signal_connect_object(gdk_display, "xevent",
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
211 G_CALLBACK(pidgin_idle_xscreensaver_xevent_cb),
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
212 plugin, 0);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
213
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
214 return TRUE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
215 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
216
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
217 static gboolean
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
218 pidgin_idle_xscreensaver_unload(GPluginPlugin *plugin,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
219 G_GNUC_UNUSED gboolean shutdown,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
220 G_GNUC_UNUSED GError **error)
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
221 {
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
222 GdkDisplay *display = NULL;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
223
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
224 g_clear_pointer(&idle_at, g_date_time_unref);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
225
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
226 display = gdk_display_get_default();
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
227 g_signal_handlers_disconnect_by_func(display,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
228 pidgin_idle_xscreensaver_xevent_cb,
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
229 plugin);
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
230
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
231 return TRUE;
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
232 }
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
233
e0a24938f214 Add an XScreenSaver based idle source for the new Idle Manager
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
234 GPLUGIN_NATIVE_PLUGIN_DECLARE(pidgin_idle_xscreensaver)

mercurial