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