Correctly resize PanelIconGrid on allocation changes.
[lxde/lxpanel.git] / src / private.h
CommitLineData
b31cb1d2
AG
1/**
2 * Copyright (c) 2006 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
17fab6e5
AG
22#include "plugin.h"
23#include "conf.h"
b31cb1d2
AG
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
908d9fdc
AG
37/* -----------------------------------------------------------------------------
38 * Definitions used by lxpanel main code internally */
39
b31cb1d2
AG
40/* Extracted from panel.h */
41enum { ALLIGN_NONE, ALLIGN_LEFT, ALLIGN_CENTER, ALLIGN_RIGHT };
42enum { EDGE_NONE=0, EDGE_LEFT, EDGE_RIGHT, EDGE_TOP, EDGE_BOTTOM };
43enum { WIDTH_NONE, WIDTH_REQUEST, WIDTH_PIXEL, WIDTH_PERCENT };
44enum { HEIGHT_NONE, HEIGHT_PIXEL, HEIGHT_REQUEST };
b31cb1d2
AG
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 */
54extern gboolean is_in_lxde;
55
56/* Context of a panel on a given edge. */
57struct _Panel {
58 char* name;
59 GtkWidget * 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;
cfde283a 81 guint orientation;
b31cb1d2
AG
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;
0bcf9045 97 guint fontsize;
b31cb1d2
AG
98 guint transparent : 1;
99 guint background : 1;
100 guint spacing;
101
102 guint autohide : 1;
103 guint visible : 1;
9a2c13d0
AG
104 guint ah_far : 1;
105 guint ah_state : 3;
b31cb1d2
AG
106 int height_when_hidden;
107 guint hide_timeout;
9a2c13d0 108 guint mouse_timeout;
b31cb1d2
AG
109 int icon_size; /* Icon size */
110
111 int desknum;
112 int curdesk;
113 guint32 *workarea;
114 int wa_len;
115
116 char* background_file;
117
17fab6e5 118 PanelConf * config; /* Panel configuration data */
dd731fde 119 GSList * system_menus; /* List of plugins having menus: deprecated */
b31cb1d2
AG
120
121 GtkWidget* plugin_pref_dialog; /* Plugin preference dialog */
122 GtkWidget* pref_dialog; /* preference dialog */
123 GtkWidget* margin_control; /* Margin control in preference dialog */
124 GtkWidget* height_label; /* Label of height control */
125 GtkWidget* width_label; /* Label of width control */
126 GtkWidget* alignment_left_label; /* Label of alignment: left control */
127 GtkWidget* alignment_right_label; /* Label of alignment: right control */
128 GtkWidget* height_control; /* Height control in preference dialog */
129 GtkWidget* width_control; /* Width control in preference dialog */
de5a8e6c
AG
130
131 //gint dyn_space; /* Space for expandable plugins */
132 //guint calculate_size_idle; /* The idle handler for dyn_space calc */
b31cb1d2
AG
133};
134
135typedef struct {
136 char *name;
137 char *disp_name;
138 void (*cmd)(void);
139} Command;
140
141extern Command commands[];
142
b31cb1d2
AG
143#define FBPANEL_WIN(win) gdk_window_lookup(win)
144
b31cb1d2 145/* Extracted from misc.h */
b31cb1d2
AG
146typedef struct {
147 int num;
148 gchar *str;
149} pair;
150
151extern pair allign_pair[];
152extern pair edge_pair[];
153extern pair width_pair[];
154extern pair height_pair[];
155extern pair bool_pair[];
b31cb1d2 156
17fab6e5
AG
157int str2num(pair *p, const gchar *str, int defval);
158const gchar *num2str(pair *p, int num, const gchar *defval);
b31cb1d2 159
1f4bc3aa
AG
160#ifdef __LXPANEL_INTERNALS__
161static inline char *_system_config_file_name(const char *file_name)
162{
163 return g_build_filename(PACKAGE_SYSCONF_DIR, cprofile, file_name, NULL);
164}
165
166static inline char *_old_system_config_file_name(const char *file_name)
167{
168 return g_build_filename(PACKAGE_DATA_DIR "/profile", cprofile, file_name, NULL);
169}
170
171static inline char *_user_config_file_name(const char *name1, const char *name2)
172{
173 return g_build_filename(g_get_user_config_dir(), "lxpanel", cprofile, name1,
174 name2, NULL);
175}
176#endif
908d9fdc 177
de5a8e6c
AG
178//void _queue_panel_calculate_size(Panel *panel);
179
049061d8
AG
180/* FIXME: optional definitions */
181#define STATIC_SEPARATOR
182#define STATIC_LAUNCHBAR
89930ab6 183#define STATIC_LAUNCHTASKBAR
049061d8
AG
184#define STATIC_DCLOCK
185#define STATIC_WINCMD
186#define STATIC_DIRMENU
187#define STATIC_TASKBAR
188#define STATIC_PAGER
189#define STATIC_TRAY
190#define STATIC_MENU
191#define STATIC_SPACE
192#define STATIC_ICONS
193
194/* Plugins management - new style */
195void _prepare_modules(void);
196void _unload_modules(void);
197
198GtkWidget *lxpanel_add_plugin(Panel *p, const char *name, config_setting_t *cfg, gint at);
199GHashTable *lxpanel_get_all_types(void); /* transfer none */
200
201GQuark lxpanel_plugin_qinit; /* access to LXPanelPluginInit data */
202#define PLUGIN_CLASS(_i) ((LXPanelPluginInit*)g_object_get_qdata(G_OBJECT(_i),lxpanel_plugin_qinit))
203
204GQuark lxpanel_plugin_qconf; /* access to congig_setting_t data */
205
206GQuark lxpanel_plugin_qpanel; /* access to Panel */
207#define PLUGIN_PANEL(_i) ((Panel*)g_object_get_qdata(G_OBJECT(_i),lxpanel_plugin_qpanel))
908d9fdc 208
10d93053
AG
209gboolean _class_is_present(LXPanelPluginInit *init);
210
131514c9
AG
211void _panel_show_config_dialog(Panel *panel, GtkWidget *p, GtkWidget *dlg);
212
908d9fdc
AG
213/* -----------------------------------------------------------------------------
214 * Deprecated declarations. Kept for compatibility with old code plugins.
215 * Should be removed and appropriate code cleaned on some of next releases. */
216
8dfa5918 217/* Extracted from panel.h */
f9e8104e
AG
218extern int verbose;
219
220/* if current window manager is EWMH conforming. */
221extern gboolean is_ewmh_supported;
222
223/*
224 This function is used to re-create a new box with different
225 orientation from the old one, add all children of the old one to
226 the new one, and then destroy the old box.
227 It's mainly used when we need to change the orientation of the panel or
228 any plugin with a layout box. Since GtkHBox cannot be changed to GtkVBox,
229 recreating a new box to replace the old one is required.
230*/
231GtkWidget* recreate_box( GtkBox* oldbox, GtkOrientation orientation );
232
8dfa5918
AG
233extern const char* lxpanel_get_file_manager();
234
235
908d9fdc
AG
236/* Extracted from misc.h */
237typedef struct _Plugin Plugin;
238
239enum { LINE_NONE, LINE_BLOCK_START, LINE_BLOCK_END, LINE_VAR };
240
241typedef struct {
242 int num, len, type;
243 gchar str[256];
244 gchar *t[3];
245} line;
246
247
b31cb1d2
AG
248extern int lxpanel_get_line(char **fp, line *s);
249extern int lxpanel_put_line(FILE* fp, const char* format, ...);
250#define lxpanel_put_str(fp, name, val) (G_UNLIKELY( !(val) || !*(val) )) ? 0 : lxpanel_put_line(fp, "%s=%s", name, val)
251#define lxpanel_put_bool(fp, name, val) lxpanel_put_line(fp, "%s=%c", name, (val) ? '1' : '0')
252#define lxpanel_put_int(fp, name, val) lxpanel_put_line(fp, "%s=%d", name, val)
b31cb1d2
AG
253
254GtkWidget *_gtk_image_new_from_file_scaled(const gchar *file, gint width,
255 gint height, gboolean keep_ratio);
256
c8e5ebb2
AG
257GtkWidget * fb_button_new_from_file(
258 const gchar * image_file, int width, int height, gulong highlight_color, gboolean keep_ratio);
259GtkWidget * fb_button_new_from_file_with_label(
dd731fde 260 const gchar * image_file, int width, int height, gulong highlight_color, gboolean keep_ratio, Panel * panel, const gchar * label);
c8e5ebb2
AG
261
262void fb_button_set_from_file(GtkWidget* btn, const char* img_file, gint width, gint height, gboolean keep_ratio);
263
b31cb1d2
AG
264char* translate_exec_to_cmd( const char* exec, const char* icon,
265 const char* title, const char* fpath );
266
267void show_error( GtkWindow* parent_win, const char* msg );
268
aaaef690
AG
269gboolean spawn_command_async(GtkWindow *parent_window, gchar const* workdir,
270 gchar const* cmd);
271
b31cb1d2
AG
272/* Parameters: const char* name, gpointer ret_value, GType type, ....NULL */
273GtkWidget* create_generic_config_dlg( const char* title, GtkWidget* parent,
274 GSourceFunc apply_func, Plugin * plugin,
275 const char* name, ... );
276
277extern GtkMenu* lxpanel_get_panel_menu( Panel* panel, Plugin* plugin, gboolean use_sub_menu );
278
279gboolean lxpanel_launch_app(const char* exec, GList* files, gboolean in_terminal, char const* in_workdir);
280
63e2d9e5
AG
281extern GdkPixbuf* lxpanel_load_icon( const char* name, int width, int height, gboolean use_fallback );
282
b31cb1d2
AG
283
284/* Extracted from plugin.h */
285struct _Plugin;
286
287/* Support for external plugin versioning.
288 * Plugins must invoke PLUGINCLASS_VERSIONING when they instantiate PluginClass. */
289#define PLUGINCLASS_VERSION 1
290#define PLUGINCLASS_VERSIONING \
291 .structure_size = sizeof(PluginClass), \
292 .structure_version = PLUGINCLASS_VERSION
293
294/* Representative of an available plugin. */
295typedef struct {
296
297 /* Keep these first. Do not make unnecessary changes in structure layout. */
298 unsigned short structure_size; /* Structure size, for versioning support */
299 unsigned short structure_version; /* Structure version, for versioning support */
300
301 char * fname; /* Plugin file pathname */
302 int count; /* Reference count */
303 GModule * gmodule; /* Associated GModule structure */
304
305 int dynamic : 1; /* True if dynamically loaded */
306 int unused_invisible : 1; /* Unused; reserved bit */
307 int not_unloadable : 1; /* Not unloadable due to GModule restriction */
308 int one_per_system : 1; /* Special: only one possible per system, such as system tray */
309 int one_per_system_instantiated : 1; /* True if one instance exists */
310 int expand_available : 1; /* True if "stretch" option is available */
311 int expand_default : 1; /* True if "stretch" option is default */
312
313 /* These fields point within the plugin image. */
314 char * type; /* Internal name of plugin, to match external filename */
315 char * name; /* Display name of plugin for selection UI */
316 char * version; /* Version of plugin */
317 char * description; /* Brief textual description of plugin for selection UI */
318
319 int (*constructor)(struct _Plugin * plugin, char ** fp); /* Create an instance of the plugin */
320 void (*destructor)(struct _Plugin * plugin); /* Destroy an instance of the plugin */
321 void (*config)(struct _Plugin * plugin, GtkWindow * parent); /* Request the plugin to display its configuration dialog */
322 void (*save)(struct _Plugin * plugin, FILE * fp); /* Request the plugin to save its configuration to a file */
323 void (*panel_configuration_changed)(struct _Plugin * plugin); /* Request the plugin to do a full redraw after a panel configuration change */
324} PluginClass;
325
326/* Representative of a loaded and active plugin attached to a panel. */
327struct _Plugin {
328 PluginClass * class; /* Back pointer to PluginClass */
329 Panel * panel; /* Back pointer to Panel */
330 GtkWidget * pwid; /* Top level widget; plugin allocates, but plugin mechanism, not plugin itself, destroys this */
331 int expand; /* Expand ("stretch") setting for container */
332 int padding; /* Padding setting for container */
333 int border; /* Border setting for container */
334 gpointer priv; /* Private context for plugin; plugin frees this in its destructor */
335};
336
337/* Plugins management - deprecated style, for backward compatibility */
b31cb1d2
AG
338extern gboolean plugin_button_press_event(GtkWidget *widget, GdkEventButton *event, Plugin *plugin);
339 /* Handler for "button_press_event" signal with Plugin as parameter */
340extern void plugin_adjust_popup_position(GtkWidget * popup, Plugin * plugin);
341 /* Helper to move popup windows away from the panel */
342extern void plugin_popup_set_position_helper(Plugin * p, GtkWidget * near, GtkWidget * popup, GtkRequisition * popup_req, gint * px, gint * py);
343 /* Helper for position-calculation callback for popup menus */
344
b31cb1d2 345#endif