1
/* pager.c -- pager module of lxpanel project
3
* Copyright (C) 2009 Dongxu Li <song6song@sourceforge.net>
4
* 2012 Julien Lavergne <gilir@ubuntu.com>
6
* This file is part of lxpanel.
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)
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.
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.
26
#include <libfm/fm-gtk.h>
28
#include <glib/gi18n.h>
29
#ifndef WNCK_I_KNOW_THIS_IS_UNSTABLE
30
#define WNCK_I_KNOW_THIS_IS_UNSTABLE
32
#include <libwnck/libwnck.h>
36
/* command to configure desktop, it will be set by .config callback */
37
static const char *configure_command = NULL;
39
static void on_realize(GtkWidget *p, LXPanel *panel)
41
WnckPager *pager = WNCK_PAGER(gtk_bin_get_child(GTK_BIN(p)));
42
int rows, r, h = panel_get_height(panel);
45
wnck_pager_set_orientation(pager, panel_get_orientation(panel));
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 */
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); */
52
wnck_pager_set_n_rows(pager, rows);
55
static void on_size_allocate(GtkWidget *p, GdkRectangle *allocation, LXPanel *panel)
57
/* g_debug("pager: on_size_allocate(): %dx%d", allocation->width, allocation->height); */
61
static GtkWidget *pager_constructor(LXPanel *panel, config_setting_t *settings)
64
int border = 1; /* NOTE: old 'pager' used 2, WnckPager has 1, need 1 more */
66
/* FIXME: use some global setting for border */
67
w = wnck_pager_new(NULL);
68
g_return_val_if_fail(w != NULL, 0);
69
p = gtk_alignment_new(0, 0, 1.0, 1.0);
71
/* we cannot configure pager until it added into widgets hierarchy */
72
g_signal_connect(p, "realize", G_CALLBACK(on_realize), panel);
73
g_signal_connect(p, "size-allocate", G_CALLBACK(on_size_allocate), panel);
74
wnck_pager_set_display_mode(WNCK_PAGER(w), WNCK_PAGER_DISPLAY_CONTENT);
78
gtk_alignment_set_padding(GTK_ALIGNMENT(p), border, border, border, border);
79
gtk_container_add(GTK_CONTAINER(p), w);
84
/* this is a modified version of patch from Lubuntu */
85
static GtkWidget *pager_configure(LXPanel *panel, GtkWidget *instance)
87
if (configure_command)
88
fm_launch_command_simple(NULL, NULL, G_APP_INFO_CREATE_NONE,
89
configure_command, NULL);
91
fm_show_error(NULL, NULL,
92
_("Sorry, there was no window manager configuration program found."));
93
return NULL; /* no configuration dialog of lxpanel available */
96
static void pager_menu_callback(GtkWidget *widget, gpointer data)
98
gtk_widget_set_sensitive(widget, FALSE);
101
static gboolean pager_update_context_menu(GtkWidget *plugin, GtkMenu *menu)
103
GdkScreen *screen = gdk_screen_get_default();
104
const char *wm_name = gdk_x11_screen_get_window_manager_name(screen);
107
/* update configure_command */
108
configure_command = NULL;
109
if (g_strcmp0(wm_name, "Openbox") == 0)
111
if ((path = g_find_program_in_path("obconf")))
113
configure_command = "obconf --tab 6";
116
else if (g_strcmp0(wm_name, "compiz") == 0)
118
if ((path = g_find_program_in_path("ccsm")))
120
configure_command = "ccsm";
122
else if ((path = g_find_program_in_path("simple-ccsm")))
124
configure_command = "simple-ccsm";
127
/* FIXME: support other WMs */
128
if (configure_command == NULL)
130
/* disable 'Settings' menu item */
131
gtk_container_foreach(GTK_CONTAINER(menu), pager_menu_callback, NULL);
133
/* FIXME: else replace 'Settings' item label with "Launch Workspaces Configurator (%s)" */
138
static void pager_panel_configuration_changed(LXPanel *panel, GtkWidget *p)
140
on_realize(p, panel);
143
static LXPanelPluginInit wnck_pager = {
144
.name = N_("Desktop Pager"),
145
.description = N_("Simple pager plugin"),
148
.new_instance = pager_constructor,
149
.config = pager_configure,
150
.update_context_menu = pager_update_context_menu,
151
.reconfigure = pager_panel_configuration_changed
154
static void pager_wnck_init(void)
156
lxpanel_register_plugin_type("wnckpager", &wnck_pager);
159
LXPanelPluginInit lxpanel_static_plugin_pager = {
160
.name = N_("Desktop Pager"),
161
.description = N_("Simple pager plugin"),
163
.init = pager_wnck_init,
164
.new_instance = pager_constructor,
165
.config = pager_configure,
166
.update_context_menu = pager_update_context_menu,
167
.reconfigure = pager_panel_configuration_changed