diff options
Diffstat (limited to 'src/Window.cc')
-rw-r--r-- | src/Window.cc | 107 |
1 files changed, 74 insertions, 33 deletions
diff --git a/src/Window.cc b/src/Window.cc index 9bc4c5a..ba6fe6d 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1098,6 +1098,7 @@ void FluxboxWindow::reconfigure() { | |||
1098 | 1098 | ||
1099 | frame().setDoubleClickTime(Fluxbox::instance()->getDoubleClickInterval()); | 1099 | frame().setDoubleClickTime(Fluxbox::instance()->getDoubleClickInterval()); |
1100 | 1100 | ||
1101 | updateButtons(); | ||
1101 | frame().reconfigure(); | 1102 | frame().reconfigure(); |
1102 | 1103 | ||
1103 | menu().reconfigure(); | 1104 | menu().reconfigure(); |
@@ -3911,25 +3912,16 @@ void FluxboxWindow::setupWindow() { | |||
3911 | typedef RefCount<Command> CommandRef; | 3912 | typedef RefCount<Command> CommandRef; |
3912 | typedef SimpleCommand<FluxboxWindow> WindowCmd; | 3913 | typedef SimpleCommand<FluxboxWindow> WindowCmd; |
3913 | 3914 | ||
3914 | CommandRef iconify_cmd(new WindowCmd(*this, &FluxboxWindow::iconify)); | ||
3915 | CommandRef maximize_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeFull)); | ||
3916 | CommandRef maximize_vert_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeVertical)); | ||
3917 | CommandRef maximize_horiz_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeHorizontal)); | ||
3918 | CommandRef close_cmd(new WindowCmd(*this, &FluxboxWindow::close)); | ||
3919 | CommandRef shade_cmd(new WindowCmd(*this, &FluxboxWindow::shade)); | 3915 | CommandRef shade_cmd(new WindowCmd(*this, &FluxboxWindow::shade)); |
3920 | CommandRef shade_on_cmd(new WindowCmd(*this, &FluxboxWindow::shadeOn)); | 3916 | CommandRef shade_on_cmd(new WindowCmd(*this, &FluxboxWindow::shadeOn)); |
3921 | CommandRef shade_off_cmd(new WindowCmd(*this, &FluxboxWindow::shadeOff)); | 3917 | CommandRef shade_off_cmd(new WindowCmd(*this, &FluxboxWindow::shadeOff)); |
3922 | CommandRef next_tab_cmd(new WindowCmd(*this, &FluxboxWindow::nextClient)); | 3918 | CommandRef next_tab_cmd(new WindowCmd(*this, &FluxboxWindow::nextClient)); |
3923 | CommandRef prev_tab_cmd(new WindowCmd(*this, &FluxboxWindow::prevClient)); | 3919 | CommandRef prev_tab_cmd(new WindowCmd(*this, &FluxboxWindow::prevClient)); |
3924 | CommandRef raise_cmd(new WindowCmd(*this, &FluxboxWindow::raise)); | ||
3925 | CommandRef lower_cmd(new WindowCmd(*this, &FluxboxWindow::lower)); | 3920 | CommandRef lower_cmd(new WindowCmd(*this, &FluxboxWindow::lower)); |
3926 | CommandRef raise_and_focus_cmd(new WindowCmd(*this, &FluxboxWindow::raiseAndFocus)); | 3921 | CommandRef raise_and_focus_cmd(new WindowCmd(*this, &FluxboxWindow::raiseAndFocus)); |
3927 | CommandRef stick_cmd(new WindowCmd(*this, &FluxboxWindow::stick)); | 3922 | CommandRef stick_cmd(new WindowCmd(*this, &FluxboxWindow::stick)); |
3928 | CommandRef show_menu_cmd(new WindowCmd(*this, &FluxboxWindow::popupMenu)); | 3923 | CommandRef show_menu_cmd(new WindowCmd(*this, &FluxboxWindow::popupMenu)); |
3929 | 3924 | ||
3930 | // clear old buttons from frame | ||
3931 | frame().removeAllButtons(); | ||
3932 | |||
3933 | typedef FbTk::Resource<vector<WinButton::Type> > WinButtonsResource; | 3925 | typedef FbTk::Resource<vector<WinButton::Type> > WinButtonsResource; |
3934 | 3926 | ||
3935 | string titlebar_name[2]; | 3927 | string titlebar_name[2]; |
@@ -3983,12 +3975,85 @@ void FluxboxWindow::setupWindow() { | |||
3983 | screen().addManagedResource(titlebar_side[i]); | 3975 | screen().addManagedResource(titlebar_side[i]); |
3984 | } | 3976 | } |
3985 | 3977 | ||
3978 | updateButtons(); | ||
3979 | |||
3980 | // setup titlebar | ||
3981 | frame().setOnClickTitlebar(raise_and_focus_cmd, 1, false, true); // on press with button 1 | ||
3982 | frame().setOnClickTitlebar(shade_cmd, 1, true); // doubleclick with button 1 | ||
3983 | frame().setOnClickTitlebar(show_menu_cmd, 3); // on release with button 3 | ||
3984 | frame().setOnClickTitlebar(lower_cmd, 2); // on release with button 2 | ||
3985 | |||
3986 | int reverse = 0; | ||
3987 | if (screen().getScrollReverse()) | ||
3988 | reverse = 1; | ||
3989 | |||
3990 | if (StringUtil::toLower(screen().getScrollAction()) == string("shade")) { | ||
3991 | frame().setOnClickTitlebar(shade_on_cmd, 5 - reverse); // shade on mouse roll | ||
3992 | frame().setOnClickTitlebar(shade_off_cmd, 4 + reverse); // unshade if rolled oposite direction | ||
3993 | } else if (StringUtil::toLower(screen().getScrollAction()) == string("nexttab")) { | ||
3994 | frame().setOnClickTitlebar(next_tab_cmd, 5 - reverse); // next tab | ||
3995 | frame().setOnClickTitlebar(prev_tab_cmd, 4 + reverse); // previous tab | ||
3996 | } | ||
3997 | |||
3998 | frame().setDoubleClickTime(Fluxbox::instance()->getDoubleClickInterval()); | ||
3999 | |||
4000 | // end setup frame | ||
4001 | |||
4002 | } | ||
4003 | |||
4004 | void FluxboxWindow::updateButtons() { | ||
4005 | string titlebar_name[2]; | ||
4006 | titlebar_name[0] = screen().name() + ".titlebar.left"; | ||
4007 | titlebar_name[1] = screen().name() + ".titlebar.right"; | ||
4008 | |||
4009 | typedef FbTk::Resource<vector<WinButton::Type> > WinButtonsResource; | ||
4010 | WinButtonsResource *titlebar_side[2]; | ||
4011 | ResourceManager &rm = screen().resourceManager(); | ||
4012 | |||
4013 | bool need_update = false; | ||
4014 | // get resource for titlebar | ||
4015 | for (int i=0; i < 2; ++i) { | ||
4016 | titlebar_side[i] = dynamic_cast<WinButtonsResource *>( | ||
4017 | rm.findResource( titlebar_name[i] ) ); | ||
4018 | |||
4019 | // check if we need to update our buttons | ||
4020 | size_t new_size = (*titlebar_side[i])->size(); | ||
4021 | if (new_size != m_titlebar_buttons[i].size() || need_update) | ||
4022 | need_update = true; | ||
4023 | else { | ||
4024 | for (int j=0; j < new_size && !need_update; j++) { | ||
4025 | if ((*(*titlebar_side[i]))[j] != m_titlebar_buttons[i][j]) | ||
4026 | need_update = true; | ||
4027 | } | ||
4028 | } | ||
4029 | |||
4030 | } | ||
4031 | |||
4032 | if (!need_update) | ||
4033 | return; | ||
3986 | 4034 | ||
4035 | // clear old buttons from frame | ||
4036 | frame().removeAllButtons(); | ||
3987 | 4037 | ||
4038 | using namespace FbTk; | ||
4039 | typedef RefCount<Command> CommandRef; | ||
4040 | typedef SimpleCommand<FluxboxWindow> WindowCmd; | ||
4041 | |||
4042 | CommandRef iconify_cmd(new WindowCmd(*this, &FluxboxWindow::iconify)); | ||
4043 | CommandRef maximize_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeFull)); | ||
4044 | CommandRef maximize_vert_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeVertical)); | ||
4045 | CommandRef maximize_horiz_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeHorizontal)); | ||
4046 | CommandRef close_cmd(new WindowCmd(*this, &FluxboxWindow::close)); | ||
4047 | CommandRef shade_cmd(new WindowCmd(*this, &FluxboxWindow::shade)); | ||
4048 | CommandRef stick_cmd(new WindowCmd(*this, &FluxboxWindow::stick)); | ||
4049 | CommandRef show_menu_cmd(new WindowCmd(*this, &FluxboxWindow::popupMenu)); | ||
4050 | |||
4051 | WinButtonTheme &winbutton_theme = screen().winButtonTheme(); | ||
3988 | 4052 | ||
3989 | for (size_t c = 0; c < 2 ; c++) { | 4053 | for (size_t c = 0; c < 2 ; c++) { |
3990 | // get titlebar configuration for current side | 4054 | // get titlebar configuration for current side |
3991 | const vector<WinButton::Type> &dir = *(*titlebar_side[c]); | 4055 | const vector<WinButton::Type> &dir = *(*titlebar_side[c]); |
4056 | m_titlebar_buttons[c] = dir; | ||
3992 | 4057 | ||
3993 | for (size_t i=0; i < dir.size(); ++i) { | 4058 | for (size_t i=0; i < dir.size(); ++i) { |
3994 | //create new buttons | 4059 | //create new buttons |
@@ -4069,32 +4134,8 @@ void FluxboxWindow::setupWindow() { | |||
4069 | } // end for c | 4134 | } // end for c |
4070 | 4135 | ||
4071 | frame().reconfigure(); | 4136 | frame().reconfigure(); |
4072 | |||
4073 | // setup titlebar | ||
4074 | frame().setOnClickTitlebar(raise_and_focus_cmd, 1, false, true); // on press with button 1 | ||
4075 | frame().setOnClickTitlebar(shade_cmd, 1, true); // doubleclick with button 1 | ||
4076 | frame().setOnClickTitlebar(show_menu_cmd, 3); // on release with button 3 | ||
4077 | frame().setOnClickTitlebar(lower_cmd, 2); // on release with button 2 | ||
4078 | |||
4079 | int reverse = 0; | ||
4080 | if (screen().getScrollReverse()) | ||
4081 | reverse = 1; | ||
4082 | |||
4083 | if (StringUtil::toLower(screen().getScrollAction()) == string("shade")) { | ||
4084 | frame().setOnClickTitlebar(shade_on_cmd, 5 - reverse); // shade on mouse roll | ||
4085 | frame().setOnClickTitlebar(shade_off_cmd, 4 + reverse); // unshade if rolled oposite direction | ||
4086 | } else if (StringUtil::toLower(screen().getScrollAction()) == string("nexttab")) { | ||
4087 | frame().setOnClickTitlebar(next_tab_cmd, 5 - reverse); // next tab | ||
4088 | frame().setOnClickTitlebar(prev_tab_cmd, 4 + reverse); // previous tab | ||
4089 | } | ||
4090 | |||
4091 | frame().setDoubleClickTime(Fluxbox::instance()->getDoubleClickInterval()); | ||
4092 | |||
4093 | // end setup frame | ||
4094 | |||
4095 | } | 4137 | } |
4096 | 4138 | ||
4097 | |||
4098 | /** | 4139 | /** |
4099 | * reconfigTheme: must be called after frame is reconfigured | 4140 | * reconfigTheme: must be called after frame is reconfigured |
4100 | * Client windows need to be made the same size and location as | 4141 | * Client windows need to be made the same size and location as |