diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 87 |
1 files changed, 43 insertions, 44 deletions
diff --git a/src/Window.cc b/src/Window.cc index f4b69ee..68494e2 100644 --- a/src/Window.cc +++ b/src/Window.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: Window.cc,v 1.90 2002/10/15 17:37:28 fluxgen Exp $ | 25 | // $Id: Window.cc,v 1.91 2002/10/19 10:56:30 fluxgen Exp $ |
26 | 26 | ||
27 | #include "Window.hh" | 27 | #include "Window.hh" |
28 | 28 | ||
@@ -68,7 +68,7 @@ screen(0), | |||
68 | timer(this), | 68 | timer(this), |
69 | display(0), | 69 | display(0), |
70 | lastButtonPressTime(0), | 70 | lastButtonPressTime(0), |
71 | windowmenu(0), | 71 | m_windowmenu(0), |
72 | m_layer(LAYER_NORMAL), | 72 | m_layer(LAYER_NORMAL), |
73 | tab(0) { | 73 | tab(0) { |
74 | 74 | ||
@@ -300,7 +300,7 @@ tab(0) { | |||
300 | XMapSubwindows(display, frame.window); | 300 | XMapSubwindows(display, frame.window); |
301 | 301 | ||
302 | if (decorations.menu) | 302 | if (decorations.menu) |
303 | windowmenu = new Windowmenu(*this); | 303 | m_windowmenu = std::auto_ptr<Windowmenu>(new Windowmenu(*this)); |
304 | 304 | ||
305 | if (workspace_number < 0 || workspace_number >= screen->getCount()) | 305 | if (workspace_number < 0 || workspace_number >= screen->getCount()) |
306 | screen->getCurrentWorkspace()->addWindow(this, place_window); | 306 | screen->getCurrentWorkspace()->addWindow(this, place_window); |
@@ -355,11 +355,6 @@ FluxboxWindow::~FluxboxWindow() { | |||
355 | } else //it's iconic | 355 | } else //it's iconic |
356 | screen->removeIcon(this); | 356 | screen->removeIcon(this); |
357 | 357 | ||
358 | if (windowmenu) { | ||
359 | delete windowmenu; | ||
360 | windowmenu = 0; | ||
361 | } | ||
362 | |||
363 | if (tab != 0) { | 358 | if (tab != 0) { |
364 | delete tab; | 359 | delete tab; |
365 | tab = 0; | 360 | tab = 0; |
@@ -1031,9 +1026,9 @@ void FluxboxWindow::reconfigure() { | |||
1031 | 1026 | ||
1032 | grabButtons(); | 1027 | grabButtons(); |
1033 | 1028 | ||
1034 | if (windowmenu) { | 1029 | if (m_windowmenu.get()) { |
1035 | windowmenu->move(windowmenu->x(), frame.y + frame.title_h); | 1030 | m_windowmenu->move(m_windowmenu->x(), frame.y + frame.title_h); |
1036 | windowmenu->reconfigure(); | 1031 | m_windowmenu->reconfigure(); |
1037 | } | 1032 | } |
1038 | 1033 | ||
1039 | 1034 | ||
@@ -1296,8 +1291,8 @@ void FluxboxWindow::getMWMHints() { | |||
1296 | } else { | 1291 | } else { |
1297 | decorations.titlebar = decorations.handle = decorations.border = | 1292 | decorations.titlebar = decorations.handle = decorations.border = |
1298 | decorations.iconify = decorations.maximize = | 1293 | decorations.iconify = decorations.maximize = |
1299 | decorations.close = decorations.menu = decorations.tab = false; | 1294 | decorations.close = decorations.tab = false; |
1300 | 1295 | decorations.menu = true; | |
1301 | if (client.mwm_hint->decorations & MwmDecorBorder) | 1296 | if (client.mwm_hint->decorations & MwmDecorBorder) |
1302 | decorations.border = true; | 1297 | decorations.border = true; |
1303 | if (client.mwm_hint->decorations & MwmDecorHandle) | 1298 | if (client.mwm_hint->decorations & MwmDecorHandle) |
@@ -1570,8 +1565,8 @@ void FluxboxWindow::iconify() { | |||
1570 | if (iconic) | 1565 | if (iconic) |
1571 | return; | 1566 | return; |
1572 | 1567 | ||
1573 | if (windowmenu) | 1568 | if (m_windowmenu.get()) |
1574 | windowmenu->hide(); | 1569 | m_windowmenu->hide(); |
1575 | 1570 | ||
1576 | setState(IconicState); | 1571 | setState(IconicState); |
1577 | 1572 | ||
@@ -1681,8 +1676,8 @@ void FluxboxWindow::withdraw() { | |||
1681 | XSelectInput(display, client.window, | 1676 | XSelectInput(display, client.window, |
1682 | PropertyChangeMask | StructureNotifyMask | FocusChangeMask); | 1677 | PropertyChangeMask | StructureNotifyMask | FocusChangeMask); |
1683 | 1678 | ||
1684 | if (windowmenu) | 1679 | if (m_windowmenu.get()) |
1685 | windowmenu->hide(); | 1680 | m_windowmenu->hide(); |
1686 | 1681 | ||
1687 | if (tab) | 1682 | if (tab) |
1688 | tab->withdraw(); | 1683 | tab->withdraw(); |
@@ -2358,11 +2353,13 @@ void FluxboxWindow::restoreAttributes() { | |||
2358 | } | 2353 | } |
2359 | 2354 | ||
2360 | void FluxboxWindow::showMenu(int mx, int my) { | 2355 | void FluxboxWindow::showMenu(int mx, int my) { |
2361 | windowmenu->move(mx, my); | 2356 | if (m_windowmenu.get() == 0) |
2362 | windowmenu->show(); | 2357 | return; |
2363 | windowmenu->raise(); | 2358 | m_windowmenu->move(mx, my); |
2364 | windowmenu->getSendToMenu().raise(); | 2359 | m_windowmenu->show(); |
2365 | windowmenu->getSendGroupToMenu().raise(); | 2360 | m_windowmenu->raise(); |
2361 | m_windowmenu->getSendToMenu().raise(); | ||
2362 | m_windowmenu->getSendGroupToMenu().raise(); | ||
2366 | } | 2363 | } |
2367 | 2364 | ||
2368 | void FluxboxWindow::restoreGravity() { | 2365 | void FluxboxWindow::restoreGravity() { |
@@ -2699,8 +2696,8 @@ void FluxboxWindow::propertyNotifyEvent(Atom atom) { | |||
2699 | 2696 | ||
2700 | if (decorations.titlebar) | 2697 | if (decorations.titlebar) |
2701 | positionButtons(true); | 2698 | positionButtons(true); |
2702 | if (windowmenu) | 2699 | if (m_windowmenu.get()) |
2703 | windowmenu->reconfigure(); | 2700 | m_windowmenu->reconfigure(); |
2704 | } | 2701 | } |
2705 | } else { | 2702 | } else { |
2706 | 2703 | ||
@@ -2808,8 +2805,8 @@ void FluxboxWindow::buttonPressEvent(XButtonEvent *be) { | |||
2808 | 2805 | ||
2809 | if (frame.plate == be->window) { | 2806 | if (frame.plate == be->window) { |
2810 | 2807 | ||
2811 | if (windowmenu && windowmenu->isVisible()) //hide menu if its visible | 2808 | if (m_windowmenu.get() && m_windowmenu->isVisible()) //hide menu if its visible |
2812 | windowmenu->hide(); | 2809 | m_windowmenu->hide(); |
2813 | //raise tab first, if there is any, so the focus on windows get | 2810 | //raise tab first, if there is any, so the focus on windows get |
2814 | //right and dont "hide" the tab behind other windows | 2811 | //right and dont "hide" the tab behind other windows |
2815 | if (tab) | 2812 | if (tab) |
@@ -2837,8 +2834,8 @@ void FluxboxWindow::buttonPressEvent(XButtonEvent *be) { | |||
2837 | frame.grab_x = be->x_root - frame.x - screen->getBorderWidth(); | 2834 | frame.grab_x = be->x_root - frame.x - screen->getBorderWidth(); |
2838 | frame.grab_y = be->y_root - frame.y - screen->getBorderWidth(); | 2835 | frame.grab_y = be->y_root - frame.y - screen->getBorderWidth(); |
2839 | 2836 | ||
2840 | if (windowmenu && windowmenu->isVisible()) | 2837 | if (m_windowmenu.get() && m_windowmenu->isVisible()) |
2841 | windowmenu->hide(); | 2838 | m_windowmenu->hide(); |
2842 | //raise tab first if there is any | 2839 | //raise tab first if there is any |
2843 | if (hasTab()) | 2840 | if (hasTab()) |
2844 | tab->raise(); | 2841 | tab->raise(); |
@@ -2850,47 +2847,47 @@ void FluxboxWindow::buttonPressEvent(XButtonEvent *be) { | |||
2850 | if (hasTab()) | 2847 | if (hasTab()) |
2851 | getTab()->lower(); //lower the tab AND it's windows | 2848 | getTab()->lower(); //lower the tab AND it's windows |
2852 | 2849 | ||
2853 | } else if (windowmenu && be->button == 3 && | 2850 | } else if (m_windowmenu.get() && be->button == 3 && |
2854 | (frame.title == be->window || frame.label == be->window || | 2851 | (frame.title == be->window || frame.label == be->window || |
2855 | frame.handle == be->window)) { | 2852 | frame.handle == be->window)) { |
2856 | 2853 | ||
2857 | int mx = 0, my = 0; | 2854 | int mx = 0, my = 0; |
2858 | 2855 | ||
2859 | if (frame.title == be->window || frame.label == be->window) { | 2856 | if (frame.title == be->window || frame.label == be->window) { |
2860 | mx = be->x_root - (windowmenu->width() / 2); | 2857 | mx = be->x_root - (m_windowmenu->width() / 2); |
2861 | my = frame.y + frame.title_h; | 2858 | my = frame.y + frame.title_h; |
2862 | } else if (frame.handle == be->window) { | 2859 | } else if (frame.handle == be->window) { |
2863 | mx = be->x_root - (windowmenu->width() / 2); | 2860 | mx = be->x_root - (m_windowmenu->width() / 2); |
2864 | my = frame.y + frame.y_handle - windowmenu->height(); | 2861 | my = frame.y + frame.y_handle - m_windowmenu->height(); |
2865 | } else { | 2862 | } else { |
2866 | bool buttonproc=false; | 2863 | bool buttonproc=false; |
2867 | 2864 | ||
2868 | if (buttonproc) | 2865 | if (buttonproc) |
2869 | mx = be->x_root - (windowmenu->width() / 2); | 2866 | mx = be->x_root - (m_windowmenu->width() / 2); |
2870 | 2867 | ||
2871 | if (be->y <= (signed) frame.bevel_w) | 2868 | if (be->y <= (signed) frame.bevel_w) |
2872 | my = frame.y + frame.y_border; | 2869 | my = frame.y + frame.y_border; |
2873 | else | 2870 | else |
2874 | my = be->y_root - (windowmenu->height() / 2); | 2871 | my = be->y_root - (m_windowmenu->height() / 2); |
2875 | } | 2872 | } |
2876 | 2873 | ||
2877 | if (mx > (signed) (frame.x + frame.width - windowmenu->width())) | 2874 | if (mx > (signed) (frame.x + frame.width - m_windowmenu->width())) |
2878 | mx = frame.x + frame.width - windowmenu->width(); | 2875 | mx = frame.x + frame.width - m_windowmenu->width(); |
2879 | if (mx < frame.x) | 2876 | if (mx < frame.x) |
2880 | mx = frame.x; | 2877 | mx = frame.x; |
2881 | 2878 | ||
2882 | if (my > (signed) (frame.y + frame.y_handle - windowmenu->height())) | 2879 | if (my > (signed) (frame.y + frame.y_handle - m_windowmenu->height())) |
2883 | my = frame.y + frame.y_handle - windowmenu->height(); | 2880 | my = frame.y + frame.y_handle - m_windowmenu->height(); |
2884 | if (my < (signed) (frame.y + ((decorations.titlebar) ? frame.title_h : | 2881 | if (my < (signed) (frame.y + ((decorations.titlebar) ? frame.title_h : |
2885 | frame.y_border))) | 2882 | frame.y_border))) |
2886 | my = frame.y + | 2883 | my = frame.y + |
2887 | ((decorations.titlebar) ? frame.title_h : frame.y_border); | 2884 | ((decorations.titlebar) ? frame.title_h : frame.y_border); |
2888 | 2885 | ||
2889 | if (windowmenu) { | 2886 | if (m_windowmenu.get()) { |
2890 | if (! windowmenu->isVisible()) { // if not window menu is visible then show it | 2887 | if (! m_windowmenu->isVisible()) { // if not window menu is visible then show it |
2891 | showMenu(mx, my); | 2888 | showMenu(mx, my); |
2892 | } else //else hide menu | 2889 | } else //else hide menu |
2893 | windowmenu->hide(); | 2890 | m_windowmenu->hide(); |
2894 | } | 2891 | } |
2895 | 2892 | ||
2896 | } else if (be->button == 4) { //scroll to tab right | 2893 | } else if (be->button == 4) { //scroll to tab right |
@@ -3124,10 +3121,12 @@ void FluxboxWindow::setDecoration(Decoration decoration) { | |||
3124 | case DECOR_NONE: | 3121 | case DECOR_NONE: |
3125 | decorations.titlebar = decorations.border = decorations.handle = | 3122 | decorations.titlebar = decorations.border = decorations.handle = |
3126 | decorations.iconify = decorations.maximize = | 3123 | decorations.iconify = decorations.maximize = |
3127 | decorations.menu = decorations.tab = false; //tab is also a decor | 3124 | decorations.tab = false; //tab is also a decor |
3125 | decorations.menu = true; // menu is present | ||
3128 | functions.iconify = functions.maximize = false; | 3126 | functions.iconify = functions.maximize = false; |
3129 | functions.move = true; // We need to move even without decor | 3127 | functions.move = true; // We need to move even without decor |
3130 | functions.resize = true; // We need to resize even without decor | 3128 | functions.resize = true; // We need to resize even without decor |
3129 | |||
3131 | break; | 3130 | break; |
3132 | 3131 | ||
3133 | default: | 3132 | default: |
@@ -3201,8 +3200,8 @@ void FluxboxWindow::startMoving(Window win) { | |||
3201 | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, | 3200 | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, |
3202 | None, fluxbox->getMoveCursor(), CurrentTime); | 3201 | None, fluxbox->getMoveCursor(), CurrentTime); |
3203 | 3202 | ||
3204 | if (windowmenu && windowmenu->isVisible()) | 3203 | if (m_windowmenu.get() && m_windowmenu->isVisible()) |
3205 | windowmenu->hide(); | 3204 | m_windowmenu->hide(); |
3206 | 3205 | ||
3207 | fluxbox->maskWindowEvents(client.window, this); | 3206 | fluxbox->maskWindowEvents(client.window, this); |
3208 | 3207 | ||