Simplify 'cpufreq' plugin using lxpanel_button_new_for_icon().
[lxde/lxpanel.git] / plugins / pager.c
CommitLineData
365bfaec
AG
1/* pager.c -- pager module of lxpanel project
2 *
3 * Copyright (C) 2009 Dongxu Li <song6song@sourceforge.net>
eb713fbc 4 * 2012 Julien Lavergne <gilir@ubuntu.com>
365bfaec
AG
5 *
6 * This file is part of lxpanel.
7 *
8 * lxpanel is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
12 *
13 * lxpanel is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with sawfish; see the file COPYING. If not, write to
20 * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 */
23
24#include <gtk/gtk.h>
eb713fbc
AG
25#include <gdk/gdkx.h>
26#include <libfm/fm-gtk.h>
365bfaec
AG
27
28#include <glib/gi18n.h>
29#ifndef WNCK_I_KNOW_THIS_IS_UNSTABLE
30#define WNCK_I_KNOW_THIS_IS_UNSTABLE
31#endif
32#include <libwnck/libwnck.h>
33
0c86059b 34#include "plugin.h"
365bfaec 35
eb713fbc
AG
36/* command to configure desktop, it will be set by .config callback */
37static const char *configure_command = NULL;
365bfaec 38
a7bd16a4 39static void on_realize(GtkWidget *p, LXPanel *panel)
365bfaec 40{
0c86059b 41 WnckPager *pager = WNCK_PAGER(gtk_bin_get_child(GTK_BIN(p)));
4da53742 42 int rows, r, h = panel_get_height(panel);
0c86059b
AG
43
44 /* set geometry */
45 wnck_pager_set_orientation(pager, panel_get_orientation(panel));
4da53742
AG
46 if (panel_get_orientation(panel) == GTK_ORIENTATION_VERTICAL)
47 h *= ((gfloat) gdk_screen_height() / (gfloat) gdk_screen_width());
48 rows = h / (panel_get_icon_size(panel) * 2) + 1; /* min */
49 r = (h - 4) / panel_get_icon_size(panel); /* max */
0c86059b
AG
50 /* g_debug("pager for height %d and icon size %d: %d to %d",panel_get_height(panel),panel_get_icon_size(panel),r,rows); */
51 rows = MAX(rows, r);
52 wnck_pager_set_n_rows(pager, rows);
53}
365bfaec 54
a7bd16a4 55static void on_size_allocate(GtkWidget *p, GdkRectangle *allocation, LXPanel *panel)
4da53742
AG
56{
57 /* g_debug("pager: on_size_allocate(): %dx%d", allocation->width, allocation->height); */
58 on_realize(p, panel);
59}
60
a7bd16a4 61static GtkWidget *pager_constructor(LXPanel *panel, config_setting_t *settings)
0c86059b
AG
62{
63 GtkWidget *p, *w;
8952f589 64 int border = 1; /* NOTE: old 'pager' used 2, WnckPager has 1, need 1 more */
365bfaec 65
8952f589 66 /* FIXME: use some global setting for border */
0c86059b
AG
67 w = wnck_pager_new(NULL);
68 g_return_val_if_fail(w != NULL, 0);
8952f589 69 p = gtk_alignment_new(0, 0, 1.0, 1.0);
365bfaec 70
0c86059b
AG
71 /* we cannot configure pager until it added into widgets hierarchy */
72 g_signal_connect(p, "realize", G_CALLBACK(on_realize), panel);
4da53742 73 g_signal_connect(p, "size-allocate", G_CALLBACK(on_size_allocate), panel);
0c86059b 74 wnck_pager_set_display_mode(WNCK_PAGER(w), WNCK_PAGER_DISPLAY_CONTENT);
365bfaec 75
0c86059b 76 gtk_widget_show(w);
365bfaec 77
8952f589 78 gtk_alignment_set_padding(GTK_ALIGNMENT(p), border, border, border, border);
0c86059b 79 gtk_container_add(GTK_CONTAINER(p), w);
365bfaec 80
0c86059b 81 return p;
365bfaec
AG
82}
83
eb713fbc 84/* this is a modified version of patch from Lubuntu */
752ee4e2 85static GtkWidget *pager_configure(LXPanel *panel, GtkWidget *instance)
eb713fbc
AG
86{
87 if (configure_command)
88 fm_launch_command_simple(NULL, NULL, G_APP_INFO_CREATE_NONE,
89 configure_command, NULL);
c065f0b3
AG
90 else
91 fm_show_error(NULL, NULL,
92 _("Sorry, there was no window manager configuration program found."));
eb713fbc
AG
93 return NULL; /* no configuration dialog of lxpanel available */
94}
95
96static void pager_menu_callback(GtkWidget *widget, gpointer data)
97{
98 gtk_widget_set_sensitive(widget, FALSE);
99}
100
101static gboolean pager_update_context_menu(GtkWidget *plugin, GtkMenu *menu)
102{
103 GdkScreen *screen = gdk_screen_get_default();
104 const char *wm_name = gdk_x11_screen_get_window_manager_name(screen);
300d5400 105 char *path = NULL;
eb713fbc
AG
106
107 /* update configure_command */
108 configure_command = NULL;
109 if (g_strcmp0(wm_name, "Openbox") == 0)
110 {
300d5400 111 if ((path = g_find_program_in_path("obconf")))
eb713fbc
AG
112 {
113 configure_command = "obconf --tab 6";
114 }
115 }
116 else if (g_strcmp0(wm_name, "compiz") == 0)
117 {
300d5400 118 if ((path = g_find_program_in_path("ccsm")))
eb713fbc
AG
119 {
120 configure_command = "ccsm";
121 }
300d5400 122 else if ((path = g_find_program_in_path("simple-ccsm")))
eb713fbc
AG
123 {
124 configure_command = "simple-ccsm";
125 }
126 }
127 /* FIXME: support other WMs */
128 if (configure_command == NULL)
129 {
130 /* disable 'Settings' menu item */
131 gtk_container_foreach(GTK_CONTAINER(menu), pager_menu_callback, NULL);
132 }
c6cfaae8 133 /* FIXME: else replace 'Settings' item label with "Launch Workspaces Configurator (%s)" */
300d5400 134 g_free(path);
eb713fbc
AG
135 return FALSE;
136}
137
a7bd16a4 138static void pager_panel_configuration_changed(LXPanel *panel, GtkWidget *p)
365bfaec 139{
0c86059b 140 on_realize(p, panel);
365bfaec
AG
141}
142
ae4e6dc6
AG
143static LXPanelPluginInit wnck_pager = {
144 .name = N_("Desktop Pager"),
145 .description = N_("Simple pager plugin"),
146
147 .superseded = TRUE,
148 .new_instance = pager_constructor,
eb713fbc
AG
149 .config = pager_configure,
150 .update_context_menu = pager_update_context_menu,
ae4e6dc6
AG
151 .reconfigure = pager_panel_configuration_changed
152};
153
154static void pager_wnck_init(void)
155{
156 lxpanel_register_plugin_type("wnckpager", &wnck_pager);
157}
158
0c86059b 159LXPanelPluginInit lxpanel_static_plugin_pager = {
365bfaec 160 .name = N_("Desktop Pager"),
365bfaec
AG
161 .description = N_("Simple pager plugin"),
162
ae4e6dc6 163 .init = pager_wnck_init,
0c86059b 164 .new_instance = pager_constructor,
eb713fbc
AG
165 .config = pager_configure,
166 .update_context_menu = pager_update_context_menu,
0c86059b 167 .reconfigure = pager_panel_configuration_changed
365bfaec 168};