From a7ca5002293726ce3280c626a741fc9f0dd30940 Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Sun, 5 Jan 2003 22:26:56 +0000
Subject: added max functions so we can determine maximum workspace area.
 Creation of a new FluxboxWindow object is now handled in
 BScreen::createWindow

---
 src/Screen.cc | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 126 insertions(+), 16 deletions(-)

diff --git a/src/Screen.cc b/src/Screen.cc
index d85021a..efc5afd 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -22,7 +22,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: Screen.cc,v 1.92 2002/12/13 20:19:05 fluxgen Exp $
+// $Id: Screen.cc,v 1.93 2003/01/05 22:26:56 fluxgen Exp $
 
 
 #include "Screen.hh"
@@ -40,6 +40,8 @@
 #include "StringUtil.hh"
 #include "Netizen.hh"
 #include "DirHelper.hh"
+#include "WinButton.hh"
+#include "SimpleCommand.hh"
 
 //use GNU extensions
 #ifndef	 _GNU_SOURCE
@@ -270,7 +272,7 @@ BScreen::BScreen(ResourceManager &rm,
                              m_workspacecount_sig(*this), // workspace count signal
                              m_workspacenames_sig(*this), // workspace names signal 
                              m_currentworkspace_sig(*this), // current workspace signal
-                             theme(0),
+                             theme(0), m_windowtheme(scrn),
                              resource(rm, screenname, altscreenname)
 {
     Display *disp = BaseDisplay::getXDisplay();
@@ -425,10 +427,10 @@ BScreen::BScreen(ResourceManager &rm,
 
     //update menus
     m_rootmenu->update();
-
+#ifdef SLIT
     if (m_slit.get())
         m_slit->reconfigure();
-
+#endif // SLIT
 
     // start with workspace 0
     changeWorkspaceID(0);
@@ -472,20 +474,13 @@ BScreen::BScreen(ResourceManager &rm,
                 continue;
 
             if (attrib.map_state != IsUnmapped) {
-				
-                FluxboxWindow *win = new FluxboxWindow(children[i], this);
-                if (!win->isManaged()) {
-                    delete win;
-                    win = 0;
-                } else {
-                    Fluxbox::instance()->attachSignals(*win);
-                }
-				
+				FluxboxWindow *win = createWindow(children[i]);
+
                 if (win) {
                     XMapRequestEvent mre;
                     mre.window = children[i];
                     win->restoreAttributes();
-                    win->mapRequestEvent(&mre);
+                    win->mapRequestEvent(mre);
                 }
             }
         }
@@ -543,6 +538,25 @@ BScreen::~BScreen() {
 
 }
 
+/// TODO
+unsigned int BScreen::getMaxLeft() const {
+    return 0;
+}
+
+/// TODO
+unsigned int BScreen::getMaxRight() const {
+    return getWidth();
+}
+
+/// TODO
+unsigned int BScreen::getMaxTop() const {
+    return 0;
+}
+/// TODO
+unsigned int BScreen::getMaxBottom() const {
+    return getHeight();
+}
+
 void BScreen::iconUpdate() { 
     m_iconmenu->update();
 }
@@ -633,10 +647,11 @@ void BScreen::reconfigure() {
     if (m_toolbar->theme().font().isAntialias() != *resource.antialias)
         m_toolbar->theme().font().setAntialias(*resource.antialias);
    
-    
+#ifdef SLIT    
     if (m_slit.get())
         m_slit->reconfigure();
-	
+#endif // SLIT
+
     //reconfigure workspaces
     Workspaces::iterator wit = workspacesList.begin();
     Workspaces::iterator wit_end = workspacesList.end();
@@ -1004,7 +1019,100 @@ void BScreen::updateNetizenConfigNotify(XEvent *e) {
     }
 }
 
+FluxboxWindow *BScreen::createWindow(Window client) {
+    FluxboxWindow *win = new FluxboxWindow(client, this, getScreenNumber(), *getImageControl(), winFrameTheme());
+ 
+#ifdef SLIT
+    if (win->initialState() == WithdrawnState)
+        getSlit()->addClient(win->getClientWindow());
+#endif // SLIT
+
+    if (!win->isManaged()) {
+        delete win;
+        return 0;
+    } else {
+        Fluxbox::instance()->saveWindowSearch(client, win);
+        Fluxbox::instance()->attachSignals(*win);
+        setupWindowActions(*win);
+     }
+    return win;
+}
+
+void BScreen::setupWindowActions(FluxboxWindow &win) {
+
+    FbWinFrame &frame = win.frame();
+
+    // clear old buttons from frame
+    frame.removeAllButtons();
+
+    typedef FbTk::RefCount<FbTk::Command> CommandRef;
+
+    using namespace FbTk;
+
+    //create new buttons
+    if (win.isIconifiable()) {
+        FbTk::Button *iconifybtn = new WinButton(WinButton::MINIMIZE, frame.titlebar(), 0, 0, 10, 10);
+        CommandRef iconifycmd(new SimpleCommand<FluxboxWindow>(win, &FluxboxWindow::iconify));
+        iconifybtn->setOnClick(iconifycmd);
+        iconifybtn->show();
+        frame.addRightButton(iconifybtn);
+#ifdef DEBUG
+        cerr<<"Creating iconify button"<<endl;
+#endif //DEBUG
+    }
+
+    if (win.isMaximizable()) {
+        FbTk::Button *maximizebtn = new WinButton(WinButton::MAXIMIZE, frame.titlebar(), 0, 0, 10, 10);
+        CommandRef maximizecmd(new SimpleCommand<FluxboxWindow>(win, &FluxboxWindow::maximize));
+        CommandRef maximize_horiz_cmd(new SimpleCommand<FluxboxWindow>(win, &FluxboxWindow::maximizeHorizontal));
+        CommandRef maximize_vert_cmd(new SimpleCommand<FluxboxWindow>(win, &FluxboxWindow::maximizeVertical));
+
+        maximizebtn->setOnClick(maximizecmd, 1);
+        maximizebtn->setOnClick(maximize_horiz_cmd, 3);
+        maximizebtn->setOnClick(maximize_vert_cmd, 2);
+        maximizebtn->show();
+        frame.addRightButton(maximizebtn);
+#ifdef DEBUG
+        cerr<<"Creating maximize button"<<endl;
+#endif // DEBUG
+    }
 
+    if (win.isClosable()) {
+        Button *closebtn = new WinButton(WinButton::CLOSE, frame.titlebar(), 0, 0, 10, 10);
+        CommandRef closecmd(new SimpleCommand<FluxboxWindow>(win, &FluxboxWindow::close));
+        closebtn->setOnClick(closecmd);
+        closebtn->show();
+        frame.addRightButton(closebtn);
+#ifdef DEBUG
+        cerr<<"Creating close button"<<endl;
+#endif // DEBUG
+    }
+    /*
+    if (decorations.sticky) {
+        FbTk::Button *stickbtn = new WinButton(WinButton::STICK, m_frame.titlebar(),
+                                               0, 0, 10, 10);
+        FbTk::RefCount<FbTk::Command> stickcmd(new FbTk::SimpleCommand<FluxboxWindow>(*this, &FluxboxWindow::stick));
+        stickbtn->setOnClick(stickcmd);
+        stickbtn->show();
+        m_frame.addLeftButton(stickbtn);
+#ifdef DEBUG
+        cerr<<"Creating sticky button"<<endl;
+#endif // DEBUG
+    }
+    */
+    /*    if (decorations.shade) {
+        FbTk::Button *shadebtn = new WinButton(WinButton::SHADE, m_frame.titlebar(),
+                                               0, 0, 10, 10);
+        FbTk::RefCount<FbTk::Command> shadecmd(new FbTk::SimpleCommand<FluxboxWindow>(*this, &FluxboxWindow::shade));
+        shadebtn->setOnClick(shadecmd);
+        shadebtn->show();
+        m_frame.addRightButton(shadebtn);
+#ifdef DEBUG
+        cerr<<"Creating shade button"<<endl;
+#endif // DEBUG
+    }
+    */
+}
 void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) {
 
     Window session_stack[(workspace_stack.size() + workspacesList.size() + rootmenuList.size() + 30)];
@@ -1606,8 +1714,10 @@ void BScreen::shutdown() {
         }
     }
 
+#ifdef SLIT
     if (m_slit.get())
         m_slit->shutdown();
+#endif // SLIT
 
 }
 
-- 
cgit v0.11.2