~ubuntu-branches/ubuntu/wily/lxpanel/wily-proposed

« back to all changes in this revision

Viewing changes to plugins/pager.c

  • Committer: Package Import Robot
  • Author(s): Julien Lavergne
  • Date: 2015-01-31 15:30:45 UTC
  • mfrom: (1.3.3)
  • mto: This revision was merged to the branch mainline in revision 45.
  • Revision ID: package-import@ubuntu.com-20150131153045-1r9i4602vrplnx3i
ImportĀ upstreamĀ versionĀ 0.7.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* pager.c -- pager module of lxpanel project
 
2
 *
 
3
 * Copyright (C) 2009 Dongxu Li <song6song@sourceforge.net>
 
4
 *               2012 Julien Lavergne <gilir@ubuntu.com>
 
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>
 
25
#include <gdk/gdkx.h>
 
26
#include <libfm/fm-gtk.h>
 
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
 
 
34
#include "plugin.h"
 
35
 
 
36
/* command to configure desktop, it will be set by .config callback */
 
37
static const char *configure_command = NULL;
 
38
 
 
39
static void on_realize(GtkWidget *p, LXPanel *panel)
 
40
{
 
41
    WnckPager *pager = WNCK_PAGER(gtk_bin_get_child(GTK_BIN(p)));
 
42
    int rows, r, h = panel_get_height(panel);
 
43
 
 
44
    /* set geometry */
 
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); */
 
51
    rows = MAX(rows, r);
 
52
    wnck_pager_set_n_rows(pager, rows);
 
53
}
 
54
 
 
55
static void on_size_allocate(GtkWidget *p, GdkRectangle *allocation, LXPanel *panel)
 
56
{
 
57
    /* g_debug("pager: on_size_allocate(): %dx%d", allocation->width, allocation->height); */
 
58
    on_realize(p, panel);
 
59
}
 
60
 
 
61
static GtkWidget *pager_constructor(LXPanel *panel, config_setting_t *settings)
 
62
{
 
63
    GtkWidget *p, *w;
 
64
    int border = 1; /* NOTE: old 'pager' used 2, WnckPager has 1, need 1 more */
 
65
 
 
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);
 
70
 
 
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);
 
75
 
 
76
    gtk_widget_show(w);
 
77
 
 
78
    gtk_alignment_set_padding(GTK_ALIGNMENT(p), border, border, border, border);
 
79
    gtk_container_add(GTK_CONTAINER(p), w);
 
80
 
 
81
    return p;
 
82
}
 
83
 
 
84
/* this is a modified version of patch from Lubuntu */
 
85
static GtkWidget *pager_configure(LXPanel *panel, GtkWidget *instance)
 
86
{
 
87
    if (configure_command)
 
88
        fm_launch_command_simple(NULL, NULL, G_APP_INFO_CREATE_NONE,
 
89
                                 configure_command, NULL);
 
90
    else
 
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 */
 
94
}
 
95
 
 
96
static void pager_menu_callback(GtkWidget *widget, gpointer data)
 
97
{
 
98
    gtk_widget_set_sensitive(widget, FALSE);
 
99
}
 
100
 
 
101
static 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);
 
105
    char *path = NULL;
 
106
 
 
107
    /* update configure_command */
 
108
    configure_command = NULL;
 
109
    if (g_strcmp0(wm_name, "Openbox") == 0)
 
110
    {
 
111
        if ((path = g_find_program_in_path("obconf")))
 
112
        {
 
113
            configure_command = "obconf --tab 6";
 
114
        }
 
115
    }
 
116
    else if (g_strcmp0(wm_name, "compiz") == 0)
 
117
    {
 
118
         if ((path = g_find_program_in_path("ccsm")))
 
119
         {
 
120
              configure_command = "ccsm";
 
121
         }
 
122
         else if ((path = g_find_program_in_path("simple-ccsm")))
 
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
    }
 
133
    /* FIXME: else replace 'Settings' item label with "Launch Workspaces Configurator (%s)" */
 
134
    g_free(path);
 
135
    return FALSE;
 
136
}
 
137
 
 
138
static void pager_panel_configuration_changed(LXPanel *panel, GtkWidget *p)
 
139
{
 
140
    on_realize(p, panel);
 
141
}
 
142
 
 
143
static LXPanelPluginInit wnck_pager = {
 
144
    .name = N_("Desktop Pager"),
 
145
    .description = N_("Simple pager plugin"),
 
146
 
 
147
    .superseded = TRUE,
 
148
    .new_instance = pager_constructor,
 
149
    .config = pager_configure,
 
150
    .update_context_menu = pager_update_context_menu,
 
151
    .reconfigure = pager_panel_configuration_changed
 
152
};
 
153
 
 
154
static void pager_wnck_init(void)
 
155
{
 
156
    lxpanel_register_plugin_type("wnckpager", &wnck_pager);
 
157
}
 
158
 
 
159
LXPanelPluginInit lxpanel_static_plugin_pager = {
 
160
    .name = N_("Desktop Pager"),
 
161
    .description = N_("Simple pager plugin"),
 
162
 
 
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
 
168
};