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