diff options
Diffstat (limited to 'src/Toolbar.cc')
-rw-r--r-- | src/Toolbar.cc | 152 |
1 files changed, 127 insertions, 25 deletions
diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 9cf2752..3b9b652 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc | |||
@@ -1,3 +1,6 @@ | |||
1 | // Toolbar.cc for Fluxbox | ||
2 | // Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org) | ||
3 | // | ||
1 | // Toolbar.cc for Blackbox - an X11 Window manager | 4 | // Toolbar.cc for Blackbox - an X11 Window manager |
2 | // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) | 5 | // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net) |
3 | // | 6 | // |
@@ -13,13 +16,13 @@ | |||
13 | // | 16 | // |
14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
17 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 20 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | 21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
21 | 24 | ||
22 | // $Id: Toolbar.cc,v 1.13 2002/03/19 00:12:36 fluxgen Exp $ | 25 | // $Id: Toolbar.cc,v 1.14 2002/03/19 14:30:42 fluxgen Exp $ |
23 | 26 | ||
24 | // stupid macros needed to access some functions in version 2 of the GNU C | 27 | // stupid macros needed to access some functions in version 2 of the GNU C |
25 | // library | 28 | // library |
@@ -215,9 +218,38 @@ void Toolbar::delIcon(FluxboxWindow *w) { | |||
215 | } | 218 | } |
216 | 219 | ||
217 | void Toolbar::reconfigure(void) { | 220 | void Toolbar::reconfigure(void) { |
221 | int head_x = 0, | ||
222 | head_y = 0, | ||
223 | head_w, | ||
224 | head_h; | ||
225 | |||
218 | frame.bevel_w = screen->getBevelWidth(); | 226 | frame.bevel_w = screen->getBevelWidth(); |
227 | #ifdef XINERAMA | ||
228 | int head = (screen->hasXinerama()) | ||
229 | ? screen->getToolbarOnHead() | ||
230 | : -1; | ||
231 | |||
232 | if (head >= 0) { // toolbar on head nr, if -1 then over ALL heads | ||
233 | head_x = screen->getHeadX(head); | ||
234 | head_y = screen->getHeadY(head); | ||
235 | head_w = screen->getHeadWidth(head); | ||
236 | head_h = screen->getHeadHeight(head); | ||
237 | |||
238 | frame.width = | ||
239 | (screen->getHeadWidth(head) * screen->getToolbarWidthPercent() / 100); | ||
240 | } else { | ||
241 | head_w = screen->getHeadWidth(head); | ||
242 | head_h = screen->getHeadHeight(head); | ||
243 | |||
244 | frame.width = screen->getWidth() * screen->getToolbarWidthPercent() / 100; | ||
245 | } | ||
246 | #else // !XINERAMA | ||
247 | head_w = screen->getWidth(); | ||
248 | head_h = screen->getHeight(); | ||
249 | |||
219 | frame.width = screen->getWidth() * screen->getToolbarWidthPercent() / 100; | 250 | frame.width = screen->getWidth() * screen->getToolbarWidthPercent() / 100; |
220 | 251 | #endif // XINERAMA | |
252 | |||
221 | I18n *i18n = I18n::instance(); | 253 | I18n *i18n = I18n::instance(); |
222 | 254 | ||
223 | if (i18n->multibyte()) | 255 | if (i18n->multibyte()) |
@@ -233,50 +265,51 @@ void Toolbar::reconfigure(void) { | |||
233 | 265 | ||
234 | switch (screen->getToolbarPlacement()) { | 266 | switch (screen->getToolbarPlacement()) { |
235 | case TOPLEFT: | 267 | case TOPLEFT: |
236 | frame.x = 0; | 268 | frame.x = head_x; |
237 | frame.y = 0; | 269 | frame.y = head_y; |
238 | frame.x_hidden = 0; | 270 | frame.x_hidden = head_x; |
239 | frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth() - frame.height; | 271 | frame.y_hidden = head_y + |
272 | screen->getBevelWidth() - screen->getBorderWidth() - frame.height; | ||
240 | break; | 273 | break; |
241 | 274 | ||
242 | case BOTTOMLEFT: | 275 | case BOTTOMLEFT: |
243 | frame.x = 0; | 276 | frame.x = head_x; |
244 | frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x(); | 277 | frame.y = head_y + head_h - frame.height - screen->getBorderWidth2x(); |
245 | frame.x_hidden = 0; | 278 | frame.x_hidden = head_x; |
246 | frame.y_hidden = screen->getHeight() - screen->getBevelWidth() - | 279 | frame.y_hidden = head_y + head_h - screen->getBevelWidth() - |
247 | screen->getBorderWidth(); | 280 | screen->getBorderWidth(); |
248 | break; | 281 | break; |
249 | 282 | ||
250 | case TOPCENTER: | 283 | case TOPCENTER: |
251 | frame.x = (screen->getWidth() - frame.width) / 2; | 284 | frame.x = head_x + ((head_w - frame.width) / 2); |
252 | frame.y = 0; | 285 | frame.y = head_y; |
253 | frame.x_hidden = frame.x; | 286 | frame.x_hidden = frame.x; |
254 | frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth() - | 287 | frame.y_hidden = head_y + |
255 | frame.height; | 288 | screen->getBevelWidth() - screen->getBorderWidth() - frame.height; |
256 | break; | 289 | break; |
257 | 290 | ||
258 | case BOTTOMCENTER: | 291 | case BOTTOMCENTER: |
259 | default: | 292 | default: |
260 | frame.x = (screen->getWidth() - frame.width) / 2; | 293 | frame.x = head_x + ((head_w - frame.width) / 2); |
261 | frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x(); | 294 | frame.y = head_y + head_h - frame.height - screen->getBorderWidth2x(); |
262 | frame.x_hidden = frame.x; | 295 | frame.x_hidden = frame.x; |
263 | frame.y_hidden = screen->getHeight() - screen->getBevelWidth() - | 296 | frame.y_hidden = head_y + head_h - screen->getBevelWidth() - |
264 | screen->getBorderWidth(); | 297 | screen->getBorderWidth(); |
265 | break; | 298 | break; |
266 | 299 | ||
267 | case TOPRIGHT: | 300 | case TOPRIGHT: |
268 | frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x(); | 301 | frame.x = head_x + head_w - frame.width - screen->getBorderWidth2x(); |
269 | frame.y = 0; | 302 | frame.y = head_y; |
270 | frame.x_hidden = frame.x; | 303 | frame.x_hidden = frame.x; |
271 | frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth() - | 304 | frame.y_hidden = head_y + |
272 | frame.height; | 305 | screen->getBevelWidth() - screen->getBorderWidth() - frame.height; |
273 | break; | 306 | break; |
274 | 307 | ||
275 | case BOTTOMRIGHT: | 308 | case BOTTOMRIGHT: |
276 | frame.x = screen->getWidth() - frame.width - screen->getBorderWidth2x(); | 309 | frame.x = head_x + head_w - frame.width - screen->getBorderWidth2x(); |
277 | frame.y = screen->getHeight() - frame.height - screen->getBorderWidth2x(); | 310 | frame.y = head_y + head_h - frame.height - screen->getBorderWidth2x(); |
278 | frame.x_hidden = frame.x; | 311 | frame.x_hidden = frame.x; |
279 | frame.y_hidden = screen->getHeight() - screen->getBevelWidth() - | 312 | frame.y_hidden = head_y + head_h - screen->getBevelWidth() - |
280 | screen->getBorderWidth(); | 313 | screen->getBorderWidth(); |
281 | break; | 314 | break; |
282 | } | 315 | } |
@@ -1226,6 +1259,11 @@ Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) { | |||
1226 | setInternalMenu(); | 1259 | setInternalMenu(); |
1227 | 1260 | ||
1228 | placementmenu = new Placementmenu(this); | 1261 | placementmenu = new Placementmenu(this); |
1262 | #ifdef XINERAMA | ||
1263 | if (toolbar->screen->hasXinerama()) { // only create if we need it | ||
1264 | headmenu = new Headmenu(this); | ||
1265 | } | ||
1266 | #endif // XINERAMA | ||
1229 | 1267 | ||
1230 | insert(i18n->getMessage( | 1268 | insert(i18n->getMessage( |
1231 | #ifdef NLS | 1269 | #ifdef NLS |
@@ -1235,6 +1273,13 @@ Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) { | |||
1235 | #endif // NLS | 1273 | #endif // NLS |
1236 | "Placement"), | 1274 | "Placement"), |
1237 | placementmenu); | 1275 | placementmenu); |
1276 | |||
1277 | #ifdef XINERAMA | ||
1278 | if (toolbar->screen->hasXinerama()) { //TODO: NLS | ||
1279 | insert(i18n->getMessage(0, 0, "Place on Head"), headmenu); | ||
1280 | } | ||
1281 | #endif // XINERAMA | ||
1282 | |||
1238 | insert(i18n->getMessage( | 1283 | insert(i18n->getMessage( |
1239 | #ifdef NLS | 1284 | #ifdef NLS |
1240 | CommonSet, CommonAlwaysOnTop, | 1285 | CommonSet, CommonAlwaysOnTop, |
@@ -1271,6 +1316,12 @@ Toolbarmenu::Toolbarmenu(Toolbar *tb) : Basemenu(tb->screen) { | |||
1271 | 1316 | ||
1272 | Toolbarmenu::~Toolbarmenu(void) { | 1317 | Toolbarmenu::~Toolbarmenu(void) { |
1273 | delete placementmenu; | 1318 | delete placementmenu; |
1319 | #ifdef XINERAMA | ||
1320 | if (toolbar->screen->hasXinerama()) { | ||
1321 | delete headmenu; | ||
1322 | } | ||
1323 | #endif // XINERAMA | ||
1324 | |||
1274 | } | 1325 | } |
1275 | 1326 | ||
1276 | 1327 | ||
@@ -1321,6 +1372,11 @@ void Toolbarmenu::internal_hide(void) { | |||
1321 | 1372 | ||
1322 | void Toolbarmenu::reconfigure(void) { | 1373 | void Toolbarmenu::reconfigure(void) { |
1323 | placementmenu->reconfigure(); | 1374 | placementmenu->reconfigure(); |
1375 | #ifdef XINERAMA | ||
1376 | if (toolbar->screen->hasXinerama()) { | ||
1377 | headmenu->reconfigure(); | ||
1378 | } | ||
1379 | #endif // XINERAMA | ||
1324 | 1380 | ||
1325 | Basemenu::reconfigure(); | 1381 | Basemenu::reconfigure(); |
1326 | } | 1382 | } |
@@ -1413,3 +1469,49 @@ void Toolbarmenu::Placementmenu::itemSelected(int button, int index) { | |||
1413 | 1469 | ||
1414 | } | 1470 | } |
1415 | } | 1471 | } |
1472 | |||
1473 | #ifdef XINERAMA | ||
1474 | |||
1475 | Toolbarmenu::Headmenu::Headmenu(Toolbarmenu *tm) | ||
1476 | : Basemenu(tm->toolbar->screen) { | ||
1477 | toolbarmenu = tm; | ||
1478 | I18n *i18n = I18n::instance(); | ||
1479 | |||
1480 | setLabel(i18n->getMessage(0, 0, "Place on Head")); //TODO: NLS | ||
1481 | setInternalMenu(); | ||
1482 | |||
1483 | int numHeads = toolbarmenu->toolbar->screen->getNumHeads(); | ||
1484 | // fill menu with head entries | ||
1485 | for (int i = 0; i < numHeads; i++) { | ||
1486 | char headName[32]; | ||
1487 | sprintf(headName, "Head %i", i+1); //TODO: NLS | ||
1488 | insert(i18n->getMessage(0, 0, headName), i); | ||
1489 | } | ||
1490 | |||
1491 | insert(i18n->getMessage(0, 0, "All Heads"), -1); //TODO: NLS | ||
1492 | |||
1493 | update(); | ||
1494 | } | ||
1495 | |||
1496 | |||
1497 | void Toolbarmenu::Headmenu::itemSelected(int button, int index) { | ||
1498 | if (button == 1) { | ||
1499 | BasemenuItem *item = find(index); | ||
1500 | if (! item) | ||
1501 | return; | ||
1502 | |||
1503 | toolbarmenu->toolbar->screen->saveToolbarOnHead( | ||
1504 | static_cast<int>(item->function())); | ||
1505 | hide(); | ||
1506 | toolbarmenu->toolbar->reconfigure(); | ||
1507 | |||
1508 | #ifdef SLIT | ||
1509 | // reposition the slit as well to make sure it doesn't intersect the | ||
1510 | // toolbar | ||
1511 | toolbarmenu->toolbar->screen->getSlit()->reposition(); | ||
1512 | #endif // SLIT | ||
1513 | |||
1514 | } | ||
1515 | } | ||
1516 | |||
1517 | #endif // XINERAMA | ||