Rename lxpanel_button_set_icon2() into lxpanel_button_update_icon().
[lxde/lxpanel.git] / src / private.h
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
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 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;
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 */
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 //gint dyn_space; /* Space for expandable plugins */
129 //guint calculate_size_idle; /* The idle handler for dyn_space calc */
130 };
131
132 typedef struct {
133 char *name;
134 char *disp_name;
135 void (*cmd)(void);
136 } Command;
137
138 extern Command commands[];
139
140 extern FbEv *fbev;
141
142 #define FBPANEL_WIN(win) gdk_window_lookup(win)
143
144 /* Extracted from misc.h */
145 typedef struct {
146 int num;
147 gchar *str;
148 } pair;
149
150 extern pair allign_pair[];
151 extern pair edge_pair[];
152 extern pair width_pair[];
153 extern pair height_pair[];
154 extern pair bool_pair[];
155
156 int str2num(pair *p, const gchar *str, int defval);
157 const gchar *num2str(pair *p, int num, const gchar *defval);
158
159 char* get_config_file( const char* profile, const char* file_name, gboolean is_global );
160
161 //void _queue_panel_calculate_size(Panel *panel);
162
163 /* FIXME: optional definitions */
164 #define STATIC_SEPARATOR
165 #define STATIC_LAUNCHBAR
166 #define STATIC_DCLOCK
167 #define STATIC_WINCMD
168 #define STATIC_DIRMENU
169 #define STATIC_TASKBAR
170 #define STATIC_PAGER
171 #define STATIC_TRAY
172 #define STATIC_MENU
173 #define STATIC_SPACE
174 #define STATIC_ICONS
175
176 /* Plugins management - new style */
177 void _prepare_modules(void);
178 void _unload_modules(void);
179
180 GtkWidget *lxpanel_add_plugin(Panel *p, const char *name, config_setting_t *cfg, gint at);
181 GHashTable *lxpanel_get_all_types(void); /* transfer none */
182
183 GQuark lxpanel_plugin_qinit; /* access to LXPanelPluginInit data */
184 #define PLUGIN_CLASS(_i) ((LXPanelPluginInit*)g_object_get_qdata(G_OBJECT(_i),lxpanel_plugin_qinit))
185
186 GQuark lxpanel_plugin_qconf; /* access to congig_setting_t data */
187
188 GQuark lxpanel_plugin_qpanel; /* access to Panel */
189 #define PLUGIN_PANEL(_i) ((Panel*)g_object_get_qdata(G_OBJECT(_i),lxpanel_plugin_qpanel))
190
191 gboolean _class_is_present(LXPanelPluginInit *init);
192
193 /* -----------------------------------------------------------------------------
194 * Deprecated declarations. Kept for compatibility with old code plugins.
195 * Should be removed and appropriate code cleaned on some of next releases. */
196
197 /* Extracted from panel.h */
198 extern int verbose;
199
200 /* if current window manager is EWMH conforming. */
201 extern gboolean is_ewmh_supported;
202
203 /*
204 This function is used to re-create a new box with different
205 orientation from the old one, add all children of the old one to
206 the new one, and then destroy the old box.
207 It's mainly used when we need to change the orientation of the panel or
208 any plugin with a layout box. Since GtkHBox cannot be changed to GtkVBox,
209 recreating a new box to replace the old one is required.
210 */
211 GtkWidget* recreate_box( GtkBox* oldbox, GtkOrientation orientation );
212
213 extern const char* lxpanel_get_file_manager();
214
215
216 /* Extracted from misc.h */
217 typedef struct _Plugin Plugin;
218
219 enum { LINE_NONE, LINE_BLOCK_START, LINE_BLOCK_END, LINE_VAR };
220
221 typedef struct {
222 int num, len, type;
223 gchar str[256];
224 gchar *t[3];
225 } line;
226
227
228 extern int lxpanel_get_line(char **fp, line *s);
229 extern int lxpanel_put_line(FILE* fp, const char* format, ...);
230 #define lxpanel_put_str(fp, name, val) (G_UNLIKELY( !(val) || !*(val) )) ? 0 : lxpanel_put_line(fp, "%s=%s", name, val)
231 #define lxpanel_put_bool(fp, name, val) lxpanel_put_line(fp, "%s=%c", name, (val) ? '1' : '0')
232 #define lxpanel_put_int(fp, name, val) lxpanel_put_line(fp, "%s=%d", name, val)
233
234 GtkWidget *_gtk_image_new_from_file_scaled(const gchar *file, gint width,
235 gint height, gboolean keep_ratio);
236
237 GtkWidget * fb_button_new_from_file(
238 const gchar * image_file, int width, int height, gulong highlight_color, gboolean keep_ratio);
239 GtkWidget * fb_button_new_from_file_with_label(
240 const gchar * image_file, int width, int height, gulong highlight_color, gboolean keep_ratio, Panel * panel, gchar * label);
241
242 void fb_button_set_from_file(GtkWidget* btn, const char* img_file, gint width, gint height, gboolean keep_ratio);
243
244 char* translate_exec_to_cmd( const char* exec, const char* icon,
245 const char* title, const char* fpath );
246
247 void show_error( GtkWindow* parent_win, const char* msg );
248
249 gboolean spawn_command_async(GtkWindow *parent_window, gchar const* workdir,
250 gchar const* cmd);
251
252 /* Parameters: const char* name, gpointer ret_value, GType type, ....NULL */
253 GtkWidget* create_generic_config_dlg( const char* title, GtkWidget* parent,
254 GSourceFunc apply_func, Plugin * plugin,
255 const char* name, ... );
256
257 extern GtkMenu* lxpanel_get_panel_menu( Panel* panel, Plugin* plugin, gboolean use_sub_menu );
258
259 gboolean lxpanel_launch_app(const char* exec, GList* files, gboolean in_terminal, char const* in_workdir);
260
261 extern GdkPixbuf* lxpanel_load_icon( const char* name, int width, int height, gboolean use_fallback );
262
263
264 /* Extracted from plugin.h */
265 struct _Plugin;
266
267 /* Support for external plugin versioning.
268 * Plugins must invoke PLUGINCLASS_VERSIONING when they instantiate PluginClass. */
269 #define PLUGINCLASS_VERSION 1
270 #define PLUGINCLASS_VERSIONING \
271 .structure_size = sizeof(PluginClass), \
272 .structure_version = PLUGINCLASS_VERSION
273
274 /* Representative of an available plugin. */
275 typedef struct {
276
277 /* Keep these first. Do not make unnecessary changes in structure layout. */
278 unsigned short structure_size; /* Structure size, for versioning support */
279 unsigned short structure_version; /* Structure version, for versioning support */
280
281 char * fname; /* Plugin file pathname */
282 int count; /* Reference count */
283 GModule * gmodule; /* Associated GModule structure */
284
285 int dynamic : 1; /* True if dynamically loaded */
286 int unused_invisible : 1; /* Unused; reserved bit */
287 int not_unloadable : 1; /* Not unloadable due to GModule restriction */
288 int one_per_system : 1; /* Special: only one possible per system, such as system tray */
289 int one_per_system_instantiated : 1; /* True if one instance exists */
290 int expand_available : 1; /* True if "stretch" option is available */
291 int expand_default : 1; /* True if "stretch" option is default */
292
293 /* These fields point within the plugin image. */
294 char * type; /* Internal name of plugin, to match external filename */
295 char * name; /* Display name of plugin for selection UI */
296 char * version; /* Version of plugin */
297 char * description; /* Brief textual description of plugin for selection UI */
298
299 int (*constructor)(struct _Plugin * plugin, char ** fp); /* Create an instance of the plugin */
300 void (*destructor)(struct _Plugin * plugin); /* Destroy an instance of the plugin */
301 void (*config)(struct _Plugin * plugin, GtkWindow * parent); /* Request the plugin to display its configuration dialog */
302 void (*save)(struct _Plugin * plugin, FILE * fp); /* Request the plugin to save its configuration to a file */
303 void (*panel_configuration_changed)(struct _Plugin * plugin); /* Request the plugin to do a full redraw after a panel configuration change */
304 } PluginClass;
305
306 /* Representative of a loaded and active plugin attached to a panel. */
307 struct _Plugin {
308 PluginClass * class; /* Back pointer to PluginClass */
309 Panel * panel; /* Back pointer to Panel */
310 GtkWidget * pwid; /* Top level widget; plugin allocates, but plugin mechanism, not plugin itself, destroys this */
311 int expand; /* Expand ("stretch") setting for container */
312 int padding; /* Padding setting for container */
313 int border; /* Border setting for container */
314 gpointer priv; /* Private context for plugin; plugin frees this in its destructor */
315 };
316
317 /* Plugins management - deprecated style, for backward compatibility */
318 extern gboolean plugin_button_press_event(GtkWidget *widget, GdkEventButton *event, Plugin *plugin);
319 /* Handler for "button_press_event" signal with Plugin as parameter */
320 extern void plugin_adjust_popup_position(GtkWidget * popup, Plugin * plugin);
321 /* Helper to move popup windows away from the panel */
322 extern void plugin_popup_set_position_helper(Plugin * p, GtkWidget * near, GtkWidget * popup, GtkRequisition * popup_req, gint * px, gint * py);
323 /* Helper for position-calculation callback for popup menus */
324
325 #endif