diff options
-rw-r--r-- | src/Screen.cc | 95 |
1 files changed, 84 insertions, 11 deletions
diff --git a/src/Screen.cc b/src/Screen.cc index dfe92fb..a81ee9e 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // 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 |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Screen.cc,v 1.260 2004/01/11 16:06:22 fluxgen Exp $ | 25 | // $Id: Screen.cc,v 1.261 2004/01/16 11:47:07 fluxgen Exp $ |
26 | 26 | ||
27 | 27 | ||
28 | #include "Screen.hh" | 28 | #include "Screen.hh" |
@@ -485,6 +485,11 @@ BScreen::BScreen(FbTk::ResourceManager &rm, | |||
485 | int geom_h = 10; | 485 | int geom_h = 10; |
486 | int geom_w = 100; // just initial, will be fixed in render | 486 | int geom_w = 100; // just initial, will be fixed in render |
487 | 487 | ||
488 | // create geometry window | ||
489 | |||
490 | int pos_h = 10; | ||
491 | int pos_w = 100; // just initial, will be fixed in render | ||
492 | |||
488 | XSetWindowAttributes attrib; | 493 | XSetWindowAttributes attrib; |
489 | unsigned long mask = CWBorderPixel | CWColormap | CWSaveUnder; | 494 | unsigned long mask = CWBorderPixel | CWColormap | CWSaveUnder; |
490 | attrib.border_pixel = winFrameTheme().border().color().pixel(); | 495 | attrib.border_pixel = winFrameTheme().border().color().pixel(); |
@@ -502,6 +507,15 @@ BScreen::BScreen(FbTk::ResourceManager &rm, | |||
502 | 507 | ||
503 | renderGeomWindow(); | 508 | renderGeomWindow(); |
504 | 509 | ||
510 | m_pos_window = | ||
511 | XCreateWindow(disp, rootWindow().window(), | ||
512 | 0, 0, pos_w, pos_h, winFrameTheme().border().width(), rootWindow().depth(), | ||
513 | InputOutput, rootWindow().visual(), mask, &attrib); | ||
514 | pos_visible = false; | ||
515 | pos_pixmap = 0; | ||
516 | |||
517 | renderPosWindow(); | ||
518 | |||
505 | // setup workspaces and workspace menu | 519 | // setup workspaces and workspace menu |
506 | 520 | ||
507 | workspacemenu.reset(createMenu("")); | 521 | workspacemenu.reset(createMenu("")); |
@@ -633,6 +647,9 @@ BScreen::~BScreen() { | |||
633 | if (geom_pixmap != None) | 647 | if (geom_pixmap != None) |
634 | imageControl().removeImage(geom_pixmap); | 648 | imageControl().removeImage(geom_pixmap); |
635 | 649 | ||
650 | if (pos_pixmap != None) | ||
651 | imageControl().removeImage(pos_pixmap); | ||
652 | |||
636 | removeWorkspaceNames(); | 653 | removeWorkspaceNames(); |
637 | 654 | ||
638 | Workspaces::iterator w_it = m_workspaces_list.begin(); | 655 | Workspaces::iterator w_it = m_workspaces_list.begin(); |
@@ -731,6 +748,7 @@ void BScreen::update(FbTk::Subject *subj) { | |||
731 | // if another signal is added later, will need to differentiate here | 748 | // if another signal is added later, will need to differentiate here |
732 | 749 | ||
733 | renderGeomWindow(); | 750 | renderGeomWindow(); |
751 | renderPosWindow(); | ||
734 | } | 752 | } |
735 | 753 | ||
736 | FbTk::Menu *BScreen::createMenu(const std::string &label) { | 754 | FbTk::Menu *BScreen::createMenu(const std::string &label) { |
@@ -800,6 +818,7 @@ void BScreen::reconfigure() { | |||
800 | m_menutheme->frameFont().setAntialias(*resource.antialias); | 818 | m_menutheme->frameFont().setAntialias(*resource.antialias); |
801 | 819 | ||
802 | renderGeomWindow(); | 820 | renderGeomWindow(); |
821 | renderPosWindow(); | ||
803 | 822 | ||
804 | //reconfigure menus | 823 | //reconfigure menus |
805 | workspacemenu->reconfigure(); | 824 | workspacemenu->reconfigure(); |
@@ -2238,21 +2257,21 @@ void BScreen::showPosition(int x, int y) { | |||
2238 | if (!doShowWindowPos()) | 2257 | if (!doShowWindowPos()) |
2239 | return; | 2258 | return; |
2240 | 2259 | ||
2241 | if (! geom_visible) { | 2260 | if (! pos_visible) { |
2242 | if (hasXinerama()) { | 2261 | if (hasXinerama()) { |
2243 | unsigned int head = getCurrHead(); | 2262 | unsigned int head = getCurrHead(); |
2244 | 2263 | ||
2245 | m_geom_window.move(getHeadX(head) + (getHeadWidth(head) - m_geom_window.width()) / 2, | 2264 | m_pos_window.move(getHeadX(head) + (getHeadWidth(head) - m_pos_window.width()) / 2, |
2246 | getHeadY(head) + (getHeadHeight(head) - m_geom_window.height()) / 2); | 2265 | getHeadY(head) + (getHeadHeight(head) - m_pos_window.height()) / 2); |
2247 | 2266 | ||
2248 | } else { | 2267 | } else { |
2249 | m_geom_window.move((width() - m_geom_window.width()) / 2, (height() - m_geom_window.height()) / 2); | 2268 | m_pos_window.move((width() - m_pos_window.width()) / 2, (height() - m_pos_window.height()) / 2); |
2250 | } | 2269 | } |
2251 | 2270 | ||
2252 | m_geom_window.show(); | 2271 | m_pos_window.show(); |
2253 | m_geom_window.raise(); | 2272 | m_pos_window.raise(); |
2254 | 2273 | ||
2255 | geom_visible = true; | 2274 | pos_visible = true; |
2256 | } | 2275 | } |
2257 | char label[256]; | 2276 | char label[256]; |
2258 | 2277 | ||
@@ -2260,9 +2279,9 @@ void BScreen::showPosition(int x, int y) { | |||
2260 | I18n::instance()->getMessage(FBNLS::ScreenSet, FBNLS::ScreenPositionFormat, | 2279 | I18n::instance()->getMessage(FBNLS::ScreenSet, FBNLS::ScreenPositionFormat, |
2261 | "X: %4d x Y: %4d"), x, y); | 2280 | "X: %4d x Y: %4d"), x, y); |
2262 | 2281 | ||
2263 | m_geom_window.clear(); | 2282 | m_pos_window.clear(); |
2264 | 2283 | ||
2265 | winFrameTheme().font().drawText(m_geom_window.window(), | 2284 | winFrameTheme().font().drawText(m_pos_window.window(), |
2266 | screenNumber(), | 2285 | screenNumber(), |
2267 | winFrameTheme().labelTextFocusGC(), | 2286 | winFrameTheme().labelTextFocusGC(), |
2268 | label, strlen(label), | 2287 | label, strlen(label), |
@@ -2273,6 +2292,14 @@ void BScreen::showPosition(int x, int y) { | |||
2273 | } | 2292 | } |
2274 | 2293 | ||
2275 | 2294 | ||
2295 | void BScreen::hidePosition() { | ||
2296 | if (pos_visible) { | ||
2297 | m_pos_window.hide(); | ||
2298 | pos_visible = false; | ||
2299 | } | ||
2300 | } | ||
2301 | |||
2302 | |||
2276 | void BScreen::showGeometry(unsigned int gx, unsigned int gy) { | 2303 | void BScreen::showGeometry(unsigned int gx, unsigned int gy) { |
2277 | if (!doShowWindowPos()) | 2304 | if (!doShowWindowPos()) |
2278 | return; | 2305 | return; |
@@ -2370,7 +2397,7 @@ bool BScreen::doSkipWindow(const WinClient &winclient, int opts) { | |||
2370 | void BScreen::renderGeomWindow() { | 2397 | void BScreen::renderGeomWindow() { |
2371 | 2398 | ||
2372 | const char *s = I18n::instance()->getMessage(FBNLS::ScreenSet, | 2399 | const char *s = I18n::instance()->getMessage(FBNLS::ScreenSet, |
2373 | FBNLS::ScreenPositionLength, | 2400 | FBNLS::ScreenGeometryLength, |
2374 | "W: 0000 x H: 0000"); | 2401 | "W: 0000 x H: 0000"); |
2375 | int l = strlen(s); | 2402 | int l = strlen(s); |
2376 | 2403 | ||
@@ -2409,6 +2436,52 @@ void BScreen::renderGeomWindow() { | |||
2409 | 2436 | ||
2410 | } | 2437 | } |
2411 | 2438 | ||
2439 | |||
2440 | void BScreen::renderPosWindow() { | ||
2441 | |||
2442 | const char *s = I18n::instance()->getMessage(FBNLS::ScreenSet, | ||
2443 | FBNLS::ScreenPositionLength, | ||
2444 | "0: 0000 x 0: 0000"); | ||
2445 | int l = strlen(s); | ||
2446 | |||
2447 | int pos_h = winFrameTheme().font().height() + winFrameTheme().bevelWidth()*2; | ||
2448 | int pos_w = winFrameTheme().font().textWidth(s, l) + winFrameTheme().bevelWidth()*2; | ||
2449 | m_pos_window.resize(pos_w, pos_h); | ||
2450 | |||
2451 | m_pos_window.setBorderWidth(winFrameTheme().border().width()); | ||
2452 | m_pos_window.setBorderColor(winFrameTheme().border().color()); | ||
2453 | |||
2454 | |||
2455 | Pixmap tmp = pos_pixmap; | ||
2456 | |||
2457 | if (winFrameTheme().labelFocusTexture().type() & FbTk::Texture::PARENTRELATIVE) { | ||
2458 | if (!winFrameTheme().titleFocusTexture().usePixmap()) { | ||
2459 | pos_pixmap = None; | ||
2460 | m_pos_window.setBackgroundColor(winFrameTheme().titleFocusTexture().color()); | ||
2461 | } else { | ||
2462 | pos_pixmap = imageControl().renderImage(m_pos_window.width(), m_pos_window.height(), | ||
2463 | winFrameTheme().titleFocusTexture()); | ||
2464 | m_pos_window.setBackgroundPixmap(pos_pixmap); | ||
2465 | } | ||
2466 | } else { | ||
2467 | if (!winFrameTheme().labelFocusTexture().usePixmap()) { | ||
2468 | pos_pixmap = None; | ||
2469 | m_pos_window.setBackgroundColor(winFrameTheme().labelFocusTexture().color()); | ||
2470 | } else { | ||
2471 | pos_pixmap = imageControl().renderImage(m_pos_window.width(), m_pos_window.height(), | ||
2472 | winFrameTheme().labelFocusTexture()); | ||
2473 | m_pos_window.setBackgroundPixmap(pos_pixmap); | ||
2474 | } | ||
2475 | } | ||
2476 | |||
2477 | if (tmp) | ||
2478 | imageControl().removeImage(tmp); | ||
2479 | |||
2480 | } | ||
2481 | |||
2482 | |||
2483 | |||
2484 | |||
2412 | /** | 2485 | /** |
2413 | Called when a set of watched modifiers has been released | 2486 | Called when a set of watched modifiers has been released |
2414 | */ | 2487 | */ |