diff options
-rw-r--r-- | src/Screen.hh | 1 | ||||
-rw-r--r-- | src/ScreenResources.cc | 4 | ||||
-rw-r--r-- | src/Window.cc | 55 | ||||
-rw-r--r-- | src/Window.hh | 3 |
4 files changed, 48 insertions, 15 deletions
diff --git a/src/Screen.hh b/src/Screen.hh index 4f91d9c..7954456 100644 --- a/src/Screen.hh +++ b/src/Screen.hh | |||
@@ -90,6 +90,7 @@ public: | |||
90 | enum ResizeModel { | 90 | enum ResizeModel { |
91 | BOTTOMRESIZE = 0, | 91 | BOTTOMRESIZE = 0, |
92 | QUADRANTRESIZE, | 92 | QUADRANTRESIZE, |
93 | CENTERRESIZE, | ||
93 | DEFAULTRESIZE = BOTTOMRESIZE }; | 94 | DEFAULTRESIZE = BOTTOMRESIZE }; |
94 | 95 | ||
95 | 96 | ||
diff --git a/src/ScreenResources.cc b/src/ScreenResources.cc index f26a376..7a58914 100644 --- a/src/ScreenResources.cc +++ b/src/ScreenResources.cc | |||
@@ -58,6 +58,8 @@ std::string FbTk::Resource<BScreen::ResizeModel>::getString() const { | |||
58 | return std::string("Quadrant"); | 58 | return std::string("Quadrant"); |
59 | case BScreen::BOTTOMRESIZE: | 59 | case BScreen::BOTTOMRESIZE: |
60 | return std::string("Bottom"); | 60 | return std::string("Bottom"); |
61 | case BScreen::CENTERRESIZE: | ||
62 | return std::string("Center"); | ||
61 | } | 63 | } |
62 | 64 | ||
63 | return std::string("Default"); | 65 | return std::string("Default"); |
@@ -70,6 +72,8 @@ setFromString(char const *strval) { | |||
70 | m_value = BScreen::BOTTOMRESIZE; | 72 | m_value = BScreen::BOTTOMRESIZE; |
71 | } else if (strcasecmp(strval, "Quadrant") == 0) { | 73 | } else if (strcasecmp(strval, "Quadrant") == 0) { |
72 | m_value = BScreen::QUADRANTRESIZE; | 74 | m_value = BScreen::QUADRANTRESIZE; |
75 | } else if (strcasecmp(strval, "Center") == 0) { | ||
76 | m_value = BScreen::CENTERRESIZE; | ||
73 | } else | 77 | } else |
74 | m_value = BScreen::DEFAULTRESIZE; | 78 | m_value = BScreen::DEFAULTRESIZE; |
75 | } | 79 | } |
diff --git a/src/Window.cc b/src/Window.cc index a3b20f9..e6db450 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -2814,9 +2814,12 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { | |||
2814 | m_resize_corner = RIGHTBOTTOM; | 2814 | m_resize_corner = RIGHTBOTTOM; |
2815 | else if (me.window == frame().gripLeft()) | 2815 | else if (me.window == frame().gripLeft()) |
2816 | m_resize_corner = LEFTBOTTOM; | 2816 | m_resize_corner = LEFTBOTTOM; |
2817 | else if (screen().getResizeModel() != BScreen::QUADRANTRESIZE) | 2817 | else if (screen().getResizeModel() != BScreen::QUADRANTRESIZE) { |
2818 | m_resize_corner = RIGHTBOTTOM; | 2818 | if (screen().getResizeModel() == BScreen::CENTERRESIZE) |
2819 | else if (me.x < cx) | 2819 | m_resize_corner = ALLCORNERS; |
2820 | else | ||
2821 | m_resize_corner = RIGHTBOTTOM; | ||
2822 | } else if (me.x < cx) | ||
2820 | m_resize_corner = (me.y < cy) ? LEFTTOP : LEFTBOTTOM; | 2823 | m_resize_corner = (me.y < cy) ? LEFTTOP : LEFTBOTTOM; |
2821 | else | 2824 | else |
2822 | m_resize_corner = (me.y < cy) ? RIGHTTOP : RIGHTBOTTOM; | 2825 | m_resize_corner = (me.y < cy) ? RIGHTTOP : RIGHTBOTTOM; |
@@ -2835,21 +2838,45 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) { | |||
2835 | 2838 | ||
2836 | int dx = me.x - m_button_grab_x; | 2839 | int dx = me.x - m_button_grab_x; |
2837 | int dy = me.y - m_button_grab_y; | 2840 | int dy = me.y - m_button_grab_y; |
2838 | 2841 | switch (m_resize_corner) { | |
2839 | if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP) { | 2842 | case LEFTTOP: |
2843 | m_last_resize_w = frame().width() - dx; | ||
2844 | m_last_resize_x = frame().x() + dx; | ||
2845 | // no break, use code below too | ||
2846 | case RIGHTTOP: | ||
2840 | m_last_resize_h = frame().height() - dy; | 2847 | m_last_resize_h = frame().height() - dy; |
2841 | m_last_resize_y = frame().y() + dy; | 2848 | m_last_resize_y = frame().y() + dy; |
2842 | } else { | 2849 | break; |
2843 | m_last_resize_h = frame().height() + dy; | 2850 | case LEFTBOTTOM: |
2844 | } | ||
2845 | |||
2846 | if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM) { | ||
2847 | m_last_resize_w = frame().width() - dx; | 2851 | m_last_resize_w = frame().width() - dx; |
2848 | m_last_resize_x = frame().x() + dx; | 2852 | m_last_resize_x = frame().x() + dx; |
2849 | } else { | 2853 | break; |
2850 | m_last_resize_w = frame().width() + dx; | 2854 | case ALLCORNERS: |
2851 | } | 2855 | // dx or dy must be at least 2 |
2856 | if (abs(dx) >= 2 || abs(dy) >= 2) { | ||
2857 | // take max and make it even | ||
2858 | int diff = 2 * (max(dx, dy) / 2); | ||
2859 | |||
2860 | m_last_resize_h = frame().height() + diff; | ||
2861 | |||
2862 | m_last_resize_w = frame().width() + diff; | ||
2863 | m_last_resize_x = frame().x() - diff/2; | ||
2864 | m_last_resize_y = frame().y() - diff/2; | ||
2865 | } | ||
2866 | break; | ||
2867 | }; | ||
2852 | 2868 | ||
2869 | // if not on top or all corner then move bottom | ||
2870 | |||
2871 | if (!(m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP || | ||
2872 | m_resize_corner == ALLCORNERS)) | ||
2873 | m_last_resize_h = frame().height() + dy; | ||
2874 | |||
2875 | // if not top or left bottom or all corners then move right side | ||
2876 | if (!(m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM || | ||
2877 | m_resize_corner == ALLCORNERS)) | ||
2878 | m_last_resize_w = frame().width() + dx; | ||
2879 | |||
2853 | fixsize(&gx, &gy); | 2880 | fixsize(&gx, &gy); |
2854 | 2881 | ||
2855 | if (old_resize_x != m_last_resize_x || | 2882 | if (old_resize_x != m_last_resize_x || |
@@ -3692,7 +3719,7 @@ void FluxboxWindow::fixsize(int *user_w, int *user_h) { | |||
3692 | // move X if necessary | 3719 | // move X if necessary |
3693 | if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM) { | 3720 | if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM) { |
3694 | m_last_resize_x = frame().x() + frame().width() - m_last_resize_w; | 3721 | m_last_resize_x = frame().x() + frame().width() - m_last_resize_w; |
3695 | } | 3722 | } |
3696 | 3723 | ||
3697 | if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP) { | 3724 | if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP) { |
3698 | m_last_resize_y = frame().y() + frame().height() - m_last_resize_h; | 3725 | m_last_resize_y = frame().y() + frame().height() - m_last_resize_h; |
diff --git a/src/Window.hh b/src/Window.hh index 87a78af..7c59371 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -137,7 +137,8 @@ public: | |||
137 | LEFTTOP, | 137 | LEFTTOP, |
138 | LEFTBOTTOM, | 138 | LEFTBOTTOM, |
139 | RIGHTBOTTOM, | 139 | RIGHTBOTTOM, |
140 | RIGHTTOP | 140 | RIGHTTOP, |
141 | ALLCORNERS | ||
141 | }; | 142 | }; |
142 | 143 | ||
143 | typedef struct _blackbox_hints { | 144 | typedef struct _blackbox_hints { |