Adding upstream version 0.9.0.
[debian/lxpanel.git] / src / misc.h
1 /*
2 * Copyright (C) 2006-2010 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
3 * 2006-2008 Jim Huang <jserv.tw@gmail.com>
4 * 2008-2009 Fred Chien <fred@lxde.org>
5 * 2009 Marty Jack <martyj19@comcast.net>
6 * 2011-2013 Henry Gebhardt <hsggebhardt@gmail.com>
7 * 2014-2016 Andriy Grytsenko <andrej@rep.kiev.ua>
8 *
9 * This file is a part of LXPanel project.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software Foundation,
23 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
26 #ifndef __MISC_H__
27 #define __MISC_H__ 1
28
29 #include <X11/Xatom.h>
30 #include <gtk/gtk.h>
31 #include <gdk/gdk.h>
32 #include <gdk/gdkx.h>
33 #include <stdio.h>
34 #include <libfm/fm.h>
35
36 #include "panel.h"
37
38 G_BEGIN_DECLS
39
40 extern Atom a_UTF8_STRING;
41 extern Atom a_XROOTPMAP_ID;
42
43 extern Atom a_WM_STATE;
44 extern Atom a_WM_DELETE_WINDOW;
45 extern Atom a_WM_PROTOCOLS;
46 extern Atom a_NET_WORKAREA;
47 extern Atom a_NET_CLIENT_LIST;
48 extern Atom a_NET_CLIENT_LIST_STACKING;
49 extern Atom a_NET_NUMBER_OF_DESKTOPS;
50 extern Atom a_NET_CURRENT_DESKTOP;
51 extern Atom a_NET_DESKTOP_VIEWPORT;
52 extern Atom a_NET_DESKTOP_NAMES;
53 extern Atom a_NET_ACTIVE_WINDOW;
54 extern Atom a_NET_CLOSE_WINDOW;
55 extern Atom a_NET_SHOWING_DESKTOP;
56 extern Atom a_NET_SUPPORTED;
57 extern Atom a_NET_WM_STATE;
58 extern Atom a_NET_WM_STATE_SKIP_TASKBAR;
59 extern Atom a_NET_WM_STATE_SKIP_PAGER;
60 extern Atom a_NET_WM_STATE_STICKY;
61 extern Atom a_NET_WM_STATE_HIDDEN;
62 extern Atom a_NET_WM_STATE_SHADED;
63
64 #define a_NET_WM_STATE_REMOVE 0 /* remove/unset property */
65 #define a_NET_WM_STATE_ADD 1 /* add/set property */
66 #define a_NET_WM_STATE_TOGGLE 2 /* toggle property */
67
68 extern Atom a_NET_WM_WINDOW_TYPE;
69 extern Atom a_NET_WM_WINDOW_TYPE_DESKTOP;
70 extern Atom a_NET_WM_WINDOW_TYPE_DOCK;
71 extern Atom a_NET_WM_WINDOW_TYPE_TOOLBAR;
72 extern Atom a_NET_WM_WINDOW_TYPE_MENU;
73 extern Atom a_NET_WM_WINDOW_TYPE_UTILITY;
74 extern Atom a_NET_WM_WINDOW_TYPE_SPLASH;
75 extern Atom a_NET_WM_WINDOW_TYPE_DIALOG;
76 extern Atom a_NET_WM_WINDOW_TYPE_NORMAL;
77
78 extern Atom a_NET_WM_DESKTOP;
79 extern Atom a_NET_WM_NAME;
80 extern Atom a_NET_WM_VISIBLE_NAME;
81 extern Atom a_NET_WM_STRUT;
82 extern Atom a_NET_WM_STRUT_PARTIAL;
83 extern Atom a_NET_WM_ICON;
84 extern Atom a_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR;
85
86 extern Atom a_NET_SYSTEM_TRAY_OPCODE;
87 extern Atom a_NET_SYSTEM_TRAY_MESSAGE_DATA;
88 extern Atom a_NET_SYSTEM_TRAY_ORIENTATION;
89 extern Atom a_MANAGER;
90
91 extern Atom a_LXPANEL_CMD; /* for private client message */
92
93 /* Decoded value of WM_STATE property. */
94 typedef struct {
95 unsigned int modal : 1;
96 unsigned int sticky : 1;
97 unsigned int maximized_vert : 1;
98 unsigned int maximized_horz : 1;
99 unsigned int shaded : 1;
100 unsigned int skip_taskbar : 1;
101 unsigned int skip_pager : 1;
102 unsigned int hidden : 1;
103 unsigned int fullscreen : 1;
104 unsigned int above : 1;
105 unsigned int below : 1;
106 } NetWMState;
107
108 /* Decoded value of _NET_WM_WINDOW_TYPE property. */
109 typedef struct {
110 unsigned int desktop : 1;
111 unsigned int dock : 1;
112 unsigned int toolbar : 1;
113 unsigned int menu : 1;
114 unsigned int utility : 1;
115 unsigned int splash : 1;
116 unsigned int dialog : 1;
117 unsigned int normal : 1;
118 } NetWMWindowType;
119
120 void Xclimsgx(Screen *screen, Window win, Atom type, long l0, long l1, long l2, long l3, long l4);
121 void Xclimsgwm(Window win, Atom type, Atom arg);
122 void *get_xaproperty (Window win, Atom prop, Atom type, int *nitems);
123 char *get_textproperty(Window win, Atom prop);
124 void *get_utf8_property(Window win, Atom atom);
125 char **get_utf8_property_list(Window win, Atom atom, int *count);
126
127 void resolve_atoms();
128 //Window Select_Window(Display *dpy);
129 int get_net_number_of_desktops();
130 int get_net_current_desktop ();
131 int get_net_wm_desktop(Window win);
132 int get_wm_state (Window win);
133 void get_net_wm_state(Window win, NetWMState *nws);
134 void get_net_wm_window_type(Window win, NetWMWindowType *nwwt);
135 GPid get_net_wm_pid(Window win);
136
137 /**
138 * panel_handle_x_error
139 * @d: X display
140 * @ev: X error event
141 *
142 * Prints X error message to stderr if logging was enabled.
143 */
144 extern int panel_handle_x_error(Display * d, XErrorEvent * ev);
145 extern int panel_handle_x_error_swallow_BadWindow_BadDrawable(Display * d, XErrorEvent * ev);
146
147 /**
148 * expand_tilda
149 * @file: file path
150 *
151 * If first char of @file is a tilda (~) then replaces it with content of
152 * environment variable HOME.
153 *
154 * Returns: (transfer full): new allocated path string.
155 */
156 gchar *expand_tilda(const gchar *file);
157
158 /**
159 * gcolor2rgb24
160 * @color: a color structure
161 *
162 * Creates integer @color representation which can be easily converted
163 * into string using printf conversion "#%06x".
164 *
165 * Returns: a 32-bit integer.
166 */
167 guint32 gcolor2rgb24(GdkColor *color);
168
169 /**
170 * lxpanel_button_new_for_icon
171 * @panel: panel instance
172 * @name: icon name or path
173 * @color: (allow-none): hilight color for icon
174 * @label: (allow-none): optional label for button
175 *
176 * Creates new #GtkEventBox button which will follow theme and icon size
177 * changes on @panel. If icon name is not found in theme then fallback
178 * name "application-x-executable" will be used. Button is flagged to be
179 * displayed.
180 *
181 * Returns: (transfer full): a new #GtkEventBox widget.
182 */
183 extern GtkWidget *lxpanel_button_new_for_icon(LXPanel *panel, const gchar *name, GdkColor *color, const gchar *label);
184 extern GtkWidget *lxpanel_button_new_for_fm_icon(LXPanel *panel, FmIcon *icon, GdkColor *color, const gchar *label);
185
186 /**
187 * lxpanel_button_set_icon
188 * @btn: a button instance
189 * @name: icon name or path
190 * @size: new icon size
191 *
192 * Updates icon in the button created with lxpanel_button_new_for_icon()
193 * or lxpanel_button_new_for_fm_icon() before. If @size > 0 then stop
194 * following panel icon size and use this fixed size, if @size is 0 then
195 * do no changes on icons size.
196 */
197 extern void lxpanel_button_set_icon(GtkWidget* btn, const gchar *name, gint size);
198 extern void lxpanel_button_update_icon(GtkWidget* btn, FmIcon *icon, gint size);
199
200 /**
201 * lxpanel_button_set_label
202 * @btn: a button instance
203 * @label: new label text
204 *
205 * Changes text of label created with lxpanel_button_new_for_icon(),
206 * lxpanel_button_new_for_fm_icon(), or lxpanel_button_compose(). Does
207 * nothing if those API were called with NULL passed as label.
208 *
209 * Returns: %TRUE in case of success.
210 *
211 * Since: 0.8.0
212 */
213 extern gboolean lxpanel_button_set_label(GtkWidget *btn, const char *label);
214
215 /**
216 * lxpanel_button_compose
217 * @event_box: a widget to add image and label
218 * @image: an image widget
219 * @color: (allow-none): hilight color for icon
220 * @label: (allow-none): optional label for button
221 *
222 * Composes button similarly to lxpanel_button_new_for_icon() but using
223 * existing container @event_box and @image. The @image should be created
224 * using lxpanel_image_new_for_icon() or lxpanel_image_new_for_fm_icon(),
225 * and it can be updated later using lxpanel_button_set_icon() API.
226 *
227 * Returns: (transfer none): @event_box.
228 *
229 * Since: 0.8.0
230 */
231 extern GtkWidget *lxpanel_button_compose(GtkWidget *event_box, GtkWidget *image,
232 GdkColor *color, const gchar *label);
233
234 /**
235 * lxpanel_image_new_for_icon
236 * @panel: (allow-none): panel instance
237 * @name: icon name or image path
238 * @height: image size
239 * @fallback: (allow-none): fallback image name or path
240 *
241 * Creates new #GtkImage which will follow theme if @name is a themed
242 * icon name. If @height is -1 then created image will also follow icon
243 * size changes on @panel. If icon not found in theme and @fallback is
244 * not %NULL then it will be used to load icon or image. Otherwise the
245 * "application-x-executable" will be used as fallback.
246 *
247 * Returns: (transfer full): a new #GtkImage widget.
248 *
249 * Since: 0.8.0
250 */
251 extern GtkWidget *lxpanel_image_new_for_icon(LXPanel *panel, const gchar *name,
252 gint height, const gchar *fallback);
253 extern GtkWidget *lxpanel_image_new_for_fm_icon(LXPanel *panel, FmIcon *icon,
254 gint height, const gchar *fallback);
255
256 /**
257 * lxpanel_image_change_icon
258 * @img: an image
259 * @name: icon name or image path
260 * @fallback: (allow-none): fallback image name or path
261 *
262 * Changes an image @img created by lxpanel_image_new_for_icon() to use
263 * new icon @name and @fallback.
264 *
265 * Returns: %TRUE.
266 *
267 * Since: 0.8.0
268 */
269 extern gboolean lxpanel_image_change_icon(GtkWidget *img, const gchar *name,
270 const char *fallback);
271
272 G_END_DECLS
273
274 #endif