Update copyrights everywhere.
[lxde/lxpanel.git] / src / private.h
1 /**
2 * Copyright (c) 2006-2014 LxDE Developers, see the file AUTHORS for details.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
19 #ifndef PRIVATE_H
20 #define PRIVATE_H
21
22 #include "plugin.h"
23 #include "conf.h"
24
25 #include <gmodule.h>
26
27 #include <gtk/gtk.h>
28 #include <gdk/gdk.h>
29 #include <stdio.h>
30 #include "panel.h"
31
32 #include <gdk/gdk.h>
33
34 #include "bg.h"
35 #include "ev.h"
36
37 /* -----------------------------------------------------------------------------
38 * Definitions used by lxpanel main code internally */
39
40 /* Extracted from panel.h */
41 enum { ALLIGN_NONE, ALLIGN_LEFT, ALLIGN_CENTER, ALLIGN_RIGHT };
42 enum { EDGE_NONE=0, EDGE_LEFT, EDGE_RIGHT, EDGE_TOP, EDGE_BOTTOM };
43 enum { WIDTH_NONE, WIDTH_REQUEST, WIDTH_PIXEL, WIDTH_PERCENT };
44 enum { HEIGHT_NONE, HEIGHT_PIXEL, HEIGHT_REQUEST };
45
46 #define PANEL_ICON_SIZE 24 /* Default size of panel icons */
47 #define PANEL_HEIGHT_DEFAULT 26 /* Default height of horizontal panel */
48 #define PANEL_WIDTH_DEFAULT 150 /* Default "height" of vertical panel */
49 #define PANEL_HEIGHT_MAX 200 /* Maximum height of panel */
50 #define PANEL_HEIGHT_MIN 16 /* Minimum height of panel */
51 #define PANEL_ICON_HIGHLIGHT 0x202020 /* Constant to pass to icon loader */
52
53 /* to check if we are in LXDE */
54 extern gboolean is_in_lxde;
55
56 /* Context of a panel on a given edge. */
57 struct _Panel {
58 char* name;
59 LXPanel * topgwin; /* Main panel window */
60 Window topxwin; /* Main panel's X window */
61 GdkDisplay * display; /* Main panel's GdkDisplay */
62 GtkStyle * defstyle;
63 GtkIconTheme* icon_theme; /*Default icon theme*/
64
65 GtkWidget * box; /* Top level widget */
66
67 GtkRequisition requisition;
68 GtkWidget *(*my_box_new) (gboolean, gint);
69 GtkWidget *(*my_separator_new) ();
70
71 FbBg *bg;
72 int alpha;
73 guint32 tintcolor;
74 guint32 fontcolor;
75 GdkColor gtintcolor;
76 GdkColor gfontcolor;
77
78 int ax, ay, aw, ah; /* prefferd allocation of a panel */
79 int cx, cy, cw, ch; /* current allocation (as reported by configure event) allocation */
80 int allign, edge, margin;
81 guint orientation;
82 int widthtype, width;
83 int heighttype, height;
84 gint monitor;
85 gulong strut_size; /* Values for WM_STRUT_PARTIAL */
86 gulong strut_lower;
87 gulong strut_upper;
88 int strut_edge;
89
90 guint config_changed : 1;
91 guint self_destroy : 1;
92 guint setdocktype : 1;
93 guint setstrut : 1;
94 guint round_corners : 1;
95 guint usefontcolor : 1;
96 guint usefontsize : 1;
97 guint fontsize;
98 guint transparent : 1;
99 guint background : 1;
100 guint spacing;
101
102 guint autohide : 1;
103 guint visible : 1;
104 int height_when_hidden;
105 guint hide_timeout;
106 int icon_size; /* Icon size */
107
108 int desknum;
109 int curdesk;
110 guint32 *workarea;
111 int wa_len;
112
113 char* background_file;
114
115 PanelConf * config; /* Panel configuration data */
116 GSList * system_menus; /* List of plugins having menus: deprecated */
117
118 GtkWidget* plugin_pref_dialog; /* Plugin preference dialog */
119 GtkWidget* pref_dialog; /* preference dialog */
120 GtkWidget* margin_control; /* Margin control in preference dialog */
121 GtkWidget* height_label; /* Label of height control */
122 GtkWidget* width_label; /* Label of width control */
123 GtkWidget* alignment_left_label; /* Label of alignment: left control */
124 GtkWidget* alignment_right_label; /* Label of alignment: right control */
125 GtkWidget* height_control; /* Height control in preference dialog */
126 GtkWidget* width_control; /* Width control in preference dialog */
127
128 guint initialized : 1; /* Should be grouped better later, */
129 guint ah_far : 1; /* placed here for binary compatibility */
130 guint ah_state : 3;
131 guint mouse_timeout;
132 //gint dyn_space; /* Space for expandable plugins */
133 //guint calculate_size_idle; /* The idle handler for dyn_space calc */
134 };
135
136 typedef struct {
137 char *name;
138 char *disp_name;
139 void (*cmd)(void);
140 } Command;
141
142 extern Command commands[];
143
144 #define FBPANEL_WIN(win) gdk_window_lookup(win)
145
146 /* Extracted from misc.h */
147 typedef struct {
148 int num;
149 gchar *str;
150 } pair;
151
152 extern pair allign_pair[];
153 extern pair edge_pair[];
154 extern pair width_pair[];
155 extern pair height_pair[];
156 extern pair bool_pair[];
157
158 int str2num(pair *p, const gchar *str, int defval);
159 const gchar *num2str(pair *p, int num, const gchar *defval);
160
161 #ifdef __LXPANEL_INTERNALS__
162 static inline char *_system_config_file_name(const char *file_name)
163 {
164 return g_build_filename(PACKAGE_SYSCONF_DIR, cprofile, file_name, NULL);
165 }
166
167 static inline char *_old_system_config_file_name(const char *file_name)
168 {
169 return g_build_filename(PACKAGE_DATA_DIR "/profile", cprofile, file_name, NULL);
170 }
171
172 static inline char *_user_config_file_name(const char *name1, const char *name2)
173 {
174 return g_build_filename(g_get_user_config_dir(), "lxpanel", cprofile, name1,
175 name2, NULL);
176 }
177 #endif
178
179 //void _queue_panel_calculate_size(Panel *panel);
180
181 /* FIXME: optional definitions */
182 #define STATIC_SEPARATOR
183 #define STATIC_LAUNCHBAR
184 #define STATIC_LAUNCHTASKBAR
185 #define STATIC_DCLOCK
186 #define STATIC_WINCMD
187 #define STATIC_DIRMENU
188 #define STATIC_TASKBAR
189 #define STATIC_PAGER
190 #define STATIC_TRAY
191 #define STATIC_MENU
192 #define STATIC_SPACE
193 #define STATIC_ICONS
194
195 /* Plugins management - new style */
196 void _prepare_modules(void);
197 void _unload_modules(void);
198
199 GtkWidget *lxpanel_add_plugin(LXPanel *p, const char *name, config_setting_t *cfg, gint at);
200 GHashTable *lxpanel_get_all_types(void); /* transfer none */
201
202 extern GQuark lxpanel_plugin_qinit; /* access to LXPanelPluginInit data */
203 #define PLUGIN_CLASS(_i) ((LXPanelPluginInit*)g_object_get_qdata(G_OBJECT(_i),lxpanel_plugin_qinit))
204
205 extern GQuark lxpanel_plugin_qconf; /* access to congig_setting_t data */
206
207 #define PLUGIN_PANEL(_i) ((LXPanel*)gtk_widget_get_toplevel(_i))
208
209 gboolean _class_is_present(LXPanelPluginInit *init);
210
211 void _panel_show_config_dialog(LXPanel *panel, GtkWidget *p, GtkWidget *dlg);
212
213 void _calculate_position(LXPanel *panel);
214
215 void _panel_determine_background_pixmap(LXPanel * p, GtkWidget * widget);
216 void _panel_establish_autohide(LXPanel *p);
217 void _panel_set_wm_strut(LXPanel *p);
218 void _panel_set_panel_configuration_changed(LXPanel *p);
219 void _panel_update_background(LXPanel *p);
220
221 /* -----------------------------------------------------------------------------
222 * Deprecated declarations. Kept for compatibility with old code plugins.
223 * Should be removed and appropriate code cleaned on some of next releases. */
224
225 /* Extracted from panel.h */
226 extern int verbose;
227
228 extern void panel_destroy(Panel *p);
229 extern void panel_adjust_geometry_terminology(Panel *p);
230 extern void panel_determine_background_pixmap(Panel * p, GtkWidget * widget, GdkWindow * window);
231 extern void panel_draw_label_text(Panel * p, GtkWidget * label, const char * text,
232 gboolean bold, float custom_size_factor,
233 gboolean custom_color);
234 extern void panel_establish_autohide(Panel *p);
235 extern void panel_image_set_from_file(Panel * p, GtkWidget * image, const char * file);
236 extern gboolean panel_image_set_icon_theme(Panel * p, GtkWidget * image, const gchar * icon);
237 extern void panel_set_wm_strut(Panel *p);
238 extern void panel_set_dock_type(Panel *p);
239 extern void panel_set_panel_configuration_changed(Panel *p);
240 extern void panel_update_background( Panel* p );
241
242 /* if current window manager is EWMH conforming. */
243 extern gboolean is_ewmh_supported;
244
245 /*
246 This function is used to re-create a new box with different
247 orientation from the old one, add all children of the old one to
248 the new one, and then destroy the old box.
249 It's mainly used when we need to change the orientation of the panel or
250 any plugin with a layout box. Since GtkHBox cannot be changed to GtkVBox,
251 recreating a new box to replace the old one is required.
252 */
253 GtkWidget* recreate_box( GtkBox* oldbox, GtkOrientation orientation );
254
255 extern const char* lxpanel_get_file_manager();
256
257
258 /* Extracted from misc.h */
259 typedef struct _Plugin Plugin;
260
261 enum { LINE_NONE, LINE_BLOCK_START, LINE_BLOCK_END, LINE_VAR };
262
263 typedef struct {
264 int num, len, type;
265 gchar str[256];
266 gchar *t[3];
267 } line;
268
269 void calculate_position(Panel *np);
270
271 extern int lxpanel_get_line(char **fp, line *s);
272 extern int lxpanel_put_line(FILE* fp, const char* format, ...);
273 #define lxpanel_put_str(fp, name, val) (G_UNLIKELY( !(val) || !*(val) )) ? 0 : lxpanel_put_line(fp, "%s=%s", name, val)
274 #define lxpanel_put_bool(fp, name, val) lxpanel_put_line(fp, "%s=%c", name, (val) ? '1' : '0')
275 #define lxpanel_put_int(fp, name, val) lxpanel_put_line(fp, "%s=%d", name, val)
276
277 GtkWidget *_gtk_image_new_from_file_scaled(const gchar *file, gint width,
278 gint height, gboolean keep_ratio);
279
280 GtkWidget * fb_button_new_from_file(
281 const gchar * image_file, int width, int height, gulong highlight_color, gboolean keep_ratio);
282 GtkWidget * fb_button_new_from_file_with_label(
283 const gchar * image_file, int width, int height, gulong highlight_color, gboolean keep_ratio, Panel * panel, const gchar * label);
284
285 void fb_button_set_from_file(GtkWidget* btn, const char* img_file, gint width, gint height, gboolean keep_ratio);
286
287 char* translate_exec_to_cmd( const char* exec, const char* icon,
288 const char* title, const char* fpath );
289
290 void show_error( GtkWindow* parent_win, const char* msg );
291
292 gboolean spawn_command_async(GtkWindow *parent_window, gchar const* workdir,
293 gchar const* cmd);
294
295 /* Parameters: const char* name, gpointer ret_value, GType type, ....NULL */
296 GtkWidget* create_generic_config_dlg( const char* title, GtkWidget* parent,
297 GSourceFunc apply_func, Plugin * plugin,
298 const char* name, ... );
299
300 extern GtkMenu* lxpanel_get_panel_menu( Panel* panel, Plugin* plugin, gboolean use_sub_menu );
301
302 gboolean lxpanel_launch_app(const char* exec, GList* files, gboolean in_terminal, char const* in_workdir);
303
304 extern GdkPixbuf* lxpanel_load_icon( const char* name, int width, int height, gboolean use_fallback );
305
306
307 /* Extracted from plugin.h */
308 struct _Plugin;
309
310 /* Support for external plugin versioning.
311 * Plugins must invoke PLUGINCLASS_VERSIONING when they instantiate PluginClass. */
312 #define PLUGINCLASS_VERSION 1
313 #define PLUGINCLASS_VERSIONING \
314 .structure_size = sizeof(PluginClass), \
315 .structure_version = PLUGINCLASS_VERSION
316
317 /* Representative of an available plugin. */
318 typedef struct {
319
320 /* Keep these first. Do not make unnecessary changes in structure layout. */
321 unsigned short structure_size; /* Structure size, for versioning support */
322 unsigned short structure_version; /* Structure version, for versioning support */
323
324 char * fname; /* Plugin file pathname */
325 int count; /* Reference count */
326 GModule * gmodule; /* Associated GModule structure */
327
328 int dynamic : 1; /* True if dynamically loaded */
329 int unused_invisible : 1; /* Unused; reserved bit */
330 int not_unloadable : 1; /* Not unloadable due to GModule restriction */
331 int one_per_system : 1; /* Special: only one possible per system, such as system tray */
332 int one_per_system_instantiated : 1; /* True if one instance exists */
333 int expand_available : 1; /* True if "stretch" option is available */
334 int expand_default : 1; /* True if "stretch" option is default */
335
336 /* These fields point within the plugin image. */
337 char * type; /* Internal name of plugin, to match external filename */
338 char * name; /* Display name of plugin for selection UI */
339 char * version; /* Version of plugin */
340 char * description; /* Brief textual description of plugin for selection UI */
341
342 int (*constructor)(struct _Plugin * plugin, char ** fp); /* Create an instance of the plugin */
343 void (*destructor)(struct _Plugin * plugin); /* Destroy an instance of the plugin */
344 void (*config)(struct _Plugin * plugin, GtkWindow * parent); /* Request the plugin to display its configuration dialog */
345 void (*save)(struct _Plugin * plugin, FILE * fp); /* Request the plugin to save its configuration to a file */
346 void (*panel_configuration_changed)(struct _Plugin * plugin); /* Request the plugin to do a full redraw after a panel configuration change */
347 } PluginClass;
348
349 /* Representative of a loaded and active plugin attached to a panel. */
350 struct _Plugin {
351 PluginClass * class; /* Back pointer to PluginClass */
352 Panel * panel; /* Back pointer to Panel */
353 GtkWidget * pwid; /* Top level widget; plugin allocates, but plugin mechanism, not plugin itself, destroys this */
354 int expand; /* Expand ("stretch") setting for container */
355 int padding; /* Padding setting for container */
356 int border; /* Border setting for container */
357 gpointer priv; /* Private context for plugin; plugin frees this in its destructor */
358 };
359
360 /* Plugins management - deprecated style, for backward compatibility */
361 extern gboolean plugin_button_press_event(GtkWidget *widget, GdkEventButton *event, Plugin *plugin);
362 /* Handler for "button_press_event" signal with Plugin as parameter */
363 extern void plugin_adjust_popup_position(GtkWidget * popup, Plugin * plugin);
364 /* Helper to move popup windows away from the panel */
365 extern void plugin_popup_set_position_helper(Plugin * p, GtkWidget * near, GtkWidget * popup, GtkRequisition * popup_req, gint * px, gint * py);
366 /* Helper for position-calculation callback for popup menus */
367
368 #endif