diff options
-rw-r--r-- | src/Window.cc | 180 |
1 files changed, 124 insertions, 56 deletions
diff --git a/src/Window.cc b/src/Window.cc index fbec829..b03ee6f 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -3814,74 +3814,142 @@ void FluxboxWindow::setupWindow() { | |||
3814 | 3814 | ||
3815 | // clear old buttons from frame | 3815 | // clear old buttons from frame |
3816 | frame().removeAllButtons(); | 3816 | frame().removeAllButtons(); |
3817 | //!! TODO: fix this ugly hack | 3817 | |
3818 | // get titlebar configuration | 3818 | typedef FbTk::Resource<std::vector<WinButton::Type> > WinButtonsResource; |
3819 | const vector<Fluxbox::Titlebar> *dir = &Fluxbox::instance()->getTitlebarLeft(); | 3819 | |
3820 | for (char c=0; c<2; c++) { | 3820 | std::string titlebar_name[2]; |
3821 | for (size_t i=0; i< dir->size(); ++i) { | 3821 | std::string titlebar_alt_name[2]; |
3822 | titlebar_name[0] = screen().name() + ".titlebar.left"; | ||
3823 | titlebar_alt_name[0] = screen().altName() + ".Titlebar.Left"; | ||
3824 | titlebar_name[1] = screen().name() + ".titlebar.right"; | ||
3825 | titlebar_alt_name[1] = screen().altName() + ".Titlebar.Right"; | ||
3826 | |||
3827 | WinButtonsResource *titlebar_side[2]; | ||
3828 | |||
3829 | |||
3830 | |||
3831 | ResourceManager &rm = screen().resourceManager(); | ||
3832 | |||
3833 | // create resource for titlebar | ||
3834 | for (int i=0; i < 2; ++i) { | ||
3835 | titlebar_side[i] = dynamic_cast<WinButtonsResource *>( | ||
3836 | rm.findResource( titlebar_name[i] ) ); | ||
3837 | |||
3838 | if (titlebar_side[i] != 0) | ||
3839 | continue; // find next resource too | ||
3840 | |||
3841 | WinButton::Type titlebar_left[] = { | ||
3842 | WinButton::STICK | ||
3843 | }; | ||
3844 | |||
3845 | WinButton::Type titlebar_right[] = { | ||
3846 | WinButton::MINIMIZE, | ||
3847 | WinButton::MAXIMIZE, | ||
3848 | WinButton::CLOSE | ||
3849 | }; | ||
3850 | |||
3851 | WinButton::Type *begin = 0; | ||
3852 | WinButton::Type *end = 0; | ||
3853 | |||
3854 | if (i == 0) { | ||
3855 | begin = titlebar_left; | ||
3856 | end = titlebar_left + 1; | ||
3857 | } else { | ||
3858 | begin = titlebar_right; | ||
3859 | end = titlebar_right + 3; | ||
3860 | } | ||
3861 | |||
3862 | titlebar_side[i] = | ||
3863 | new WinButtonsResource(rm, | ||
3864 | WinButtonsResource::Type(begin, end), | ||
3865 | titlebar_name[i], titlebar_alt_name[i]); | ||
3866 | |||
3867 | |||
3868 | screen().addManagedResource(titlebar_side[i]); | ||
3869 | } | ||
3870 | |||
3871 | |||
3872 | |||
3873 | |||
3874 | for (char c = 0; c < 2 ; c++) { | ||
3875 | // get titlebar configuration for current side | ||
3876 | const std::vector<WinButton::Type> &dir = *(*titlebar_side[c]); | ||
3877 | |||
3878 | for (size_t i=0; i < dir.size(); ++i) { | ||
3822 | //create new buttons | 3879 | //create new buttons |
3823 | FbTk::Button *newbutton = 0; | 3880 | WinButton *winbtn = 0; |
3824 | if (isIconifiable() && (*dir)[i] == Fluxbox::MINIMIZE) { | 3881 | |
3825 | newbutton = new WinButton(*this, winbutton_theme, | 3882 | switch (dir[i]) { |
3826 | WinButton::MINIMIZE, | 3883 | case WinButton::MINIMIZE: |
3827 | frame().titlebar(), | 3884 | if (isIconifiable()) { |
3828 | 0, 0, 10, 10); | 3885 | winbtn = new WinButton(*this, winbutton_theme, |
3829 | newbutton->setOnClick(iconify_cmd); | 3886 | WinButton::MINIMIZE, |
3830 | 3887 | frame().titlebar(), | |
3831 | } else if (isMaximizable() && (*dir)[i] == Fluxbox::MAXIMIZE) { | 3888 | 0, 0, 10, 10); |
3832 | newbutton = new WinButton(*this, winbutton_theme, | 3889 | winbtn->setOnClick(iconify_cmd); |
3833 | WinButton::MAXIMIZE, | 3890 | } |
3834 | frame().titlebar(), | 3891 | break; |
3835 | 0, 0, 10, 10); | 3892 | case WinButton::MAXIMIZE: |
3836 | 3893 | if (isMaximizable()) { | |
3837 | newbutton->setOnClick(maximize_cmd, 1); | 3894 | winbtn = new WinButton(*this, winbutton_theme, |
3838 | newbutton->setOnClick(maximize_horiz_cmd, 3); | 3895 | dir[i], |
3839 | newbutton->setOnClick(maximize_vert_cmd, 2); | 3896 | frame().titlebar(), |
3840 | 3897 | 0, 0, 10, 10); | |
3841 | } else if (m_client->isClosable() && (*dir)[i] == Fluxbox::CLOSE) { | 3898 | winbtn->setOnClick(maximize_cmd, 1); |
3842 | newbutton = new WinButton(*this, winbutton_theme, | 3899 | winbtn->setOnClick(maximize_horiz_cmd, 3); |
3843 | WinButton::CLOSE, | 3900 | winbtn->setOnClick(maximize_vert_cmd, 2); |
3844 | frame().titlebar(), | 3901 | |
3845 | 0, 0, 10, 10); | 3902 | } |
3846 | 3903 | break; | |
3847 | newbutton->setOnClick(close_cmd); | 3904 | case WinButton::CLOSE: |
3848 | 3905 | if (m_client->isClosable()) { | |
3849 | } else if ((*dir)[i] == Fluxbox::STICK) { | 3906 | winbtn = new WinButton(*this, winbutton_theme, |
3850 | WinButton *winbtn = new WinButton(*this, winbutton_theme, | 3907 | dir[i], |
3851 | WinButton::STICK, | 3908 | frame().titlebar(), |
3852 | frame().titlebar(), | 3909 | 0, 0, 10, 10); |
3853 | 0, 0, 10, 10); | 3910 | |
3854 | stateSig().attach(winbtn); | 3911 | winbtn->setOnClick(close_cmd); |
3912 | stateSig().attach(winbtn); | ||
3913 | } | ||
3914 | break; | ||
3915 | case WinButton::STICK: | ||
3916 | winbtn = new WinButton(*this, winbutton_theme, | ||
3917 | dir[i], | ||
3918 | frame().titlebar(), | ||
3919 | 0, 0, 10, 10); | ||
3920 | |||
3855 | winbtn->setOnClick(stick_cmd); | 3921 | winbtn->setOnClick(stick_cmd); |
3856 | newbutton = winbtn; | 3922 | break; |
3857 | } else if ((*dir)[i] == Fluxbox::SHADE) { | 3923 | case WinButton::SHADE: |
3858 | WinButton *winbtn = new WinButton(*this, winbutton_theme, | 3924 | winbtn = new WinButton(*this, winbutton_theme, |
3859 | WinButton::SHADE, | 3925 | dir[i], |
3860 | frame().titlebar(), | 3926 | frame().titlebar(), |
3861 | 0, 0, 10, 10); | 3927 | 0, 0, 10, 10); |
3862 | stateSig().attach(winbtn); | 3928 | stateSig().attach(winbtn); |
3863 | winbtn->setOnClick(shade_cmd); | 3929 | winbtn->setOnClick(shade_cmd); |
3864 | newbutton = winbtn; | 3930 | break; |
3865 | } else if ((*dir)[i] == Fluxbox::MENUICON) { | 3931 | case WinButton::MENUICON: |
3866 | WinButton* winbtn = new WinButton(*this, winbutton_theme, | 3932 | winbtn = new WinButton(*this, winbutton_theme, |
3867 | WinButton::MENUICON, | 3933 | dir[i], |
3868 | frame().titlebar(), | 3934 | frame().titlebar(), |
3869 | 0, 0, 10, 10); | 3935 | 0, 0, 10, 10); |
3870 | hintSig().attach(winbtn); | 3936 | hintSig().attach(winbtn); |
3871 | titleSig().attach(winbtn); | 3937 | titleSig().attach(winbtn); |
3872 | winbtn->setOnClick(show_menu_cmd); | 3938 | winbtn->setOnClick(show_menu_cmd); |
3873 | newbutton = winbtn; | 3939 | break; |
3874 | } | 3940 | } |
3875 | 3941 | ||
3876 | if (newbutton != 0) { | 3942 | |
3877 | newbutton->show(); | 3943 | if (winbtn != 0) { |
3944 | winbtn->show(); | ||
3878 | if (c == 0) | 3945 | if (c == 0) |
3879 | frame().addLeftButton(newbutton); | 3946 | frame().addLeftButton(winbtn); |
3880 | else | 3947 | else |
3881 | frame().addRightButton(newbutton); | 3948 | frame().addRightButton(winbtn); |
3882 | } | 3949 | } |
3883 | } //end for i | 3950 | } //end for i |
3884 | dir = &Fluxbox::instance()->getTitlebarRight(); | 3951 | |
3952 | |||
3885 | } // end for c | 3953 | } // end for c |
3886 | 3954 | ||
3887 | frame().reconfigure(); | 3955 | frame().reconfigure(); |