source: trunk/third/gnome-panel/gnome-panel/multiscreen-stuff.c @ 18631

Revision 18631, 5.4 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18630, which included commits to RCS files with non-trunk default branches.
Line 
1/*
2 *   multiscreen-stuff: Multiscreen and Xinerama support for the panel.
3 *
4 *   Copyright (C) 2001 George Lebl <jirka@5z.com>
5 *                 2002 Sun Microsystems Inc.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20 * USA
21 *
22 * Authors: George Lebl <jirka@5z.com>,
23 *          Mark McLoughlin <mark@skynet.ie>
24 */
25
26#include <config.h>
27
28#include "multiscreen-stuff.h"
29#include "panel-util.h"
30#include "panel.h"
31#include "basep-widget.h"
32#include "foobar-widget.h"
33
34extern GSList *panel_list;
35
36static int            screens     = 0;
37static int           *monitors    = NULL;
38static GdkRectangle **geometries  = NULL;
39static gboolean       initialized = FALSE;
40
41static void
42multiscreen_screen_size_changed (GdkScreen *screen)
43{
44        GSList *l;
45
46        multiscreen_reinit ();
47
48        for (l = panel_list; l; l = l->next) {
49                PanelData *panel_data = l->data;
50
51                g_assert (panel_data->panel != NULL);
52
53                if (BASEP_IS_WIDGET (panel_data->panel))
54                        basep_widget_screen_size_changed (
55                                BASEP_WIDGET (panel_data->panel), screen);
56
57                else if (FOOBAR_IS_WIDGET (panel_data->panel))
58                        foobar_widget_screen_size_changed (
59                                FOOBAR_WIDGET (panel_data->panel), screen);
60        }
61}
62
63static void
64multiscreen_support_init (void)
65{
66        GdkDisplay *display;
67        int         i;
68
69        display = gdk_display_get_default ();
70        screens = gdk_display_get_n_screens (display);
71
72        monitors   = g_new0 (int, screens);
73        geometries = g_new0 (GdkRectangle *, screens);
74
75        for (i = 0; i < screens; i++) {
76                GdkScreen *screen;
77                int        j;
78
79                screen = gdk_display_get_screen (display, i);
80
81                g_signal_connect (screen, "size_changed",
82                                  G_CALLBACK (multiscreen_screen_size_changed), NULL);
83
84                monitors   [i] = gdk_screen_get_n_monitors (screen);
85                geometries [i] = g_new0 (GdkRectangle, monitors [i]);
86
87                for (j = 0; j < monitors [i]; j++)
88                        gdk_screen_get_monitor_geometry (
89                                screen, j, &geometries [i][j]);
90        }
91}
92
93void
94multiscreen_init (void)
95{
96        if (initialized)
97                return;
98
99        if (g_getenv ("FAKE_XINERAMA_PANEL")) {
100                int width, height;
101
102                width  = gdk_screen_get_width  (gdk_screen_get_default ());
103                height = gdk_screen_get_height (gdk_screen_get_default ());
104
105                /* fake xinerama setup for debugging */
106                screens = 1;
107                monitors = g_new0 (int, screens);
108                geometries = g_new0 (GdkRectangle *, screens);
109                monitors [0] = 2;
110                geometries [0] = g_new0 (GdkRectangle, monitors [0]);
111
112                geometries [0][0].x      = 0;
113                geometries [0][0].y      = 0;
114                geometries [0][0].width  = width / 2;
115                geometries [0][0].height = height;
116
117                geometries [0][1].x      = width / 2;
118                geometries [0][1].y      = 0;
119                geometries [0][1].width  = width - geometries [0][1].x;
120                geometries [0][1].height = height;
121
122                initialized = TRUE;
123
124                return;
125        }
126
127        multiscreen_support_init ();
128
129        initialized = TRUE;
130}
131
132void
133multiscreen_reinit (void)
134{
135        if (monitors)
136                g_free (monitors);
137
138        if (geometries) {
139                int i;
140
141                for (i = 0; i < screens; i++)
142                        g_free (geometries[i]);
143                g_free (geometries);
144        }
145
146        initialized = FALSE;
147        multiscreen_init ();
148}
149       
150int
151multiscreen_screens ()
152{
153        g_return_val_if_fail (initialized, 1);
154
155        return screens;
156}
157
158int
159multiscreen_monitors (int screen)
160{
161        g_return_val_if_fail (initialized, 1);
162        g_return_val_if_fail (screen >= 0 && screen < screens, 1);
163
164        return monitors [screen];
165}
166
167int
168multiscreen_x (int screen,
169               int monitor)
170{
171        g_return_val_if_fail (initialized, 0);
172        g_return_val_if_fail (screen >= 0 && screen < screens, 0);
173        g_return_val_if_fail (monitor >= 0 || monitor < monitors [screen], 0);
174
175        return geometries [screen][monitor].x;
176}
177
178int
179multiscreen_y (int screen,
180               int monitor)
181{
182        g_return_val_if_fail (initialized, 0);
183        g_return_val_if_fail (screen >= 0 && screen < screens, 0);
184        g_return_val_if_fail (monitor >= 0 || monitor < monitors [screen], 0);
185
186        return geometries [screen][monitor].y;
187}
188
189int
190multiscreen_width (int screen,
191                   int monitor)
192{
193        g_return_val_if_fail (initialized, 0);
194        g_return_val_if_fail (screen >= 0 && screen < screens, 0);
195        g_return_val_if_fail (monitor >= 0 || monitor < monitors [screen], 0);
196
197        return geometries [screen][monitor].width;
198}
199
200int
201multiscreen_height (int screen,
202                    int monitor)
203{
204        g_return_val_if_fail (initialized, 0);
205        g_return_val_if_fail (screen >= 0 && screen < screens, 0);
206        g_return_val_if_fail (monitor >= 0 || monitor < monitors [screen], 0);
207
208        return geometries [screen][monitor].height;
209}
210
211int
212multiscreen_locate_coords (int screen,
213                           int x,
214                           int y)
215{
216        int i;
217
218        for (i = 0; i < monitors [screen]; i++)
219                if (x >= geometries [screen][i].x &&
220                    x <  geometries [screen][i].x + geometries [screen][i].width &&
221                    y >= geometries [screen][i].y &&
222                    y <  geometries [screen][i].y + geometries [screen][i].height)
223                        return i;
224
225        return -1;
226}
227
228int
229multiscreen_locate_widget (int        screen,
230                           GtkWidget *widget)
231{
232        return panel_monitor_from_toplevel (
233                                gtk_widget_get_toplevel (widget));
234}
Note: See TracBrowser for help on using the repository browser.