2 * screen.c - screen management
4 * Copyright © 2007 Julien Danjou <julien@danjou.info>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 extern Client
*sel
, *clients
;
30 * \param disp Display ref
31 * \param screen Screen number
32 * \param statusbar statusbar
33 * \param screen_number int pointer filled with number of screens
34 * \return ScreenInfo struct array with all screens info
37 get_screen_info(Display
*disp
, int screen
, Statusbar
*statusbar
, int *screen_number
)
39 int i
, fake_screen_number
= 0;
42 if(XineramaIsActive(disp
))
44 si
= XineramaQueryScreens(disp
, screen_number
);
45 fake_screen_number
= *screen_number
;
49 /* emulate Xinerama info but only fill the screen we want */
51 si
= p_new(ScreenInfo
, screen
+ 1);
52 si
[screen
].width
= DisplayWidth(disp
, screen
);
53 si
[screen
].height
= DisplayHeight(disp
, screen
);
56 fake_screen_number
= screen
+ 1;
60 for(i
= 0; i
< fake_screen_number
; i
++)
62 if(statusbar
->position
== BarTop
63 || statusbar
->position
== BarBot
)
64 si
[i
].height
-= statusbar
->height
;
65 if(statusbar
->position
== BarTop
)
66 si
[i
].y_org
+= statusbar
->height
;
73 * \param disp Display ref
74 * \param screen Screen number
75 * \param statusbar the statusbar
76 * \return ScreenInfo struct pointer with all display info
79 get_display_info(Display
*disp
, int screen
, Statusbar statusbar
)
83 si
= p_new(ScreenInfo
, 1);
86 si
->y_org
= statusbar
.position
== BarTop
? statusbar
.height
: 0;
87 si
->width
= DisplayWidth(disp
, screen
);
88 si
->height
= DisplayHeight(disp
, screen
) -
89 ((statusbar
.position
== BarTop
|| statusbar
.position
== BarBot
) ? statusbar
.height
: 0);
94 /** Return the Xinerama screen number where the window is placed
95 * \param disp Display ref
96 * \param x x coordinate of the window
97 * \param y y coordinate of the window
98 * \return screen number or -1 on no match
101 get_screen_bycoord(Display
*disp
, int x
, int y
)
104 int screen_number
, i
;
106 /* don't waste our time */
107 if(!XineramaIsActive(disp
))
110 si
= get_screen_info(disp
, 0, NULL
, &screen_number
);
112 for(i
= 0; i
< screen_number
; i
++)
113 if(x
>= si
[i
].x_org
&& x
<= si
[i
].x_org
+ si
[i
].width
114 && y
>= si
[i
].y_org
&& y
<= si
[i
].x_org
+ si
[i
].height
)
125 uicb_focusnextscreen(Display
*disp
,
127 awesome_config
* awesomeconf
,
128 const char *arg
__attribute__ ((unused
)))
131 int next_screen
= awesomeconf
->screen
+ 1 >= ScreenCount(disp
) ? 0 : awesomeconf
->screen
+ 1;
133 for(c
= clients
; c
&& !isvisible(c
, next_screen
, awesomeconf
[next_screen
- awesomeconf
->screen
].tags
, awesomeconf
[next_screen
- awesomeconf
->screen
].ntags
); c
= c
->next
);
136 focus(c
->display
, &drawcontext
[next_screen
- awesomeconf
->screen
], c
, True
, &awesomeconf
[next_screen
- awesomeconf
->screen
]);
137 restack(c
->display
, &drawcontext
[next_screen
- awesomeconf
->screen
], &awesomeconf
[next_screen
- awesomeconf
->screen
]);
142 uicb_focusprevscreen(Display
*disp
,
144 awesome_config
* awesomeconf
,
145 const char *arg
__attribute__ ((unused
)))
148 int prev_screen
= awesomeconf
->screen
- 1 < 0 ? ScreenCount(disp
) - 1 : awesomeconf
->screen
- 1;
150 for(c
= clients
; c
&& !isvisible(c
, prev_screen
, awesomeconf
[prev_screen
- awesomeconf
->screen
].tags
, awesomeconf
[prev_screen
- awesomeconf
->screen
].ntags
); c
= c
->next
);
153 focus(c
->display
, &drawcontext
[prev_screen
- awesomeconf
->screen
], c
, True
, &awesomeconf
[prev_screen
- awesomeconf
->screen
]);
154 restack(c
->display
, &drawcontext
[prev_screen
- awesomeconf
->screen
], &awesomeconf
[prev_screen
- awesomeconf
->screen
]);