packages feed

bluetileutils (empty) → 0.1

raw patch · 14 files changed

+1327/−0 lines, 14 filesdep +X11dep +basedep +directorysetup-changed

Dependencies added: X11, base, directory, filepath, glade, gtk, unix

Files

+ BluetileDock.hs view
@@ -0,0 +1,219 @@+{-# LANGUAGE ForeignFunctionInterface #-}+----------------------------------------------------------------------------+-- |+-- Module      :  Main+-- Copyright   :  (c) Jan Vornberger 2009+-- License     :  BSD3-style (see LICENSE)+--+-- Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de+-- Stability   :  unstable+-- Portability :  not portable+--+-----------------------------------------------------------------------------++module Main where++import Graphics.UI.Gtk+import Graphics.UI.Gtk.Glade+import Control.Concurrent+import Control.Monad(when, forM_)+import qualified Graphics.X11.Xlib as X+import qualified Graphics.X11.Xlib.Extras as XE+import System.Environment+import System.IO+import Data.Char+import Paths_bluetileutils+import Utils+import Data.IORef+import Data.Maybe++import Foreign+import Foreign.C.Types+import Unsafe.Coerce(unsafeCoerce)++foreign import ccall "set_strut_properties"+    c_set_strut_properties :: Ptr Window -> CLong -> CLong -> CLong -> CLong+                                            -> CLong -> CLong+                                            -> CLong -> CLong+                                            -> CLong -> CLong+                                            -> CLong -> CLong+                                            -> ()++setStrutProperties :: Window -> (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) -> IO ()+setStrutProperties gtkWindow (left, right, top, bottom,+                                left_start_y, left_end_y,+                                right_start_y, right_end_y,+                                top_start_x, top_end_x,+                                bottom_start_x, bottom_end_x) = do+    let ptrWin = unsafeCoerce gtkWindow :: ForeignPtr Window+    let fi = fromIntegral+    withForeignPtr ptrWin $ \realPointer -> do+        return $ c_set_strut_properties realPointer (fi left) (fi right) (fi top) (fi bottom)+                                                        (fi left_start_y) (fi left_end_y)+                                                        (fi right_start_y) (fi right_end_y)+                                                        (fi top_start_x) (fi top_end_x)+                                                        (fi bottom_start_x) (fi bottom_end_x)++data DockOutput = DO Int String String+                    | InternalQuitCmd+                    deriving (Show, Read)++nextScreenCmdOffset :: Int+nextScreenCmdOffset = 18++incMasterCmd :: Int+incMasterCmd = 15+decMasterCmd :: Int+decMasterCmd = 16+quitBluetileCmd :: Int+quitBluetileCmd = 17+quitBluetileStartMetacityCmd :: Int+quitBluetileStartMetacityCmd = 18++--          name of widget      caption identifier    group        command to execute+tbData :: [(String, String, String, String, ToggleButton -> Int -> IORef Bool -> IO ())]+tbData = [ ("togglebutton1"      , "1", "1"         , "workspace", sendCommandIfToggled 1)+         , ("togglebutton2"      , "2", "2"         , "workspace", sendCommandIfToggled 2)+         , ("togglebutton3"      , "3", "3"         , "workspace", sendCommandIfToggled 3)+         , ("togglebutton4"      , "4", "4"         , "workspace", sendCommandIfToggled 4)+         , ("togglebutton5"      , "5", "5"         , "workspace", sendCommandIfToggled 5)+         , ("togglebutton6"      , "6", "6"         , "workspace", sendCommandIfToggled 6)+         , ("togglebutton7"      , "7", "7"         , "workspace", sendCommandIfToggled 7)+         , ("togglebutton8"      , "8", "8"         , "workspace", sendCommandIfToggled 8)+         , ("togglebutton9"      , "9", "9"         , "workspace", sendCommandIfToggled 9)+         , ("togglebutton0"      , "0", "0"         , "workspace", sendCommandIfToggled 10)+         , ("togglebuttonlayouta", "A", "Floating"  , "layout"   , sendCommandIfToggled 11)+         , ("togglebuttonlayoutb", "S", "Tiled1"    , "layout"   , sendCommandIfToggled 12)+         , ("togglebuttonlayoutc", "D", "Tiled2"    , "layout"   , sendCommandIfToggled 13)+         , ("togglebuttonlayoutd", "F", "Fullscreen", "layout"   , sendCommandIfToggled 14)+         ]++main :: IO ()+main = do+    args <- getArgs+    let myScreenId = if (length args > 0 && head args == "--otherscreen")+                        then 1+                        else 0+    lockSendCommand <- newIORef False+    otherDockProcess <- newIORef Nothing++    -- prepare GUI+    initGUI+    gladeFile <- getDataFileName "bluetiledock.glade"+    Just xml <- xmlNew gladeFile+    Just dfltScreen <- screenGetDefault+    dfltWh <- screenGetWidth dfltScreen++    -- monitor0 dock+    monitor0Dock <- xmlGetWidget xml castToWindow "monitor0Dock"+    windowSetTypeHint monitor0Dock WindowTypeHintDock+    onDestroy monitor0Dock mainQuit+    (m0DockWh, m0DockHt) <- windowGetSize monitor0Dock+    quitBtn <- xmlGetWidget xml castToButton "quitbutton"+    let m0DockY = 50+    if myScreenId == 0+        then do+            windowMove monitor0Dock 0 m0DockY+            onRealize monitor0Dock $+                setStrutProperties monitor0Dock (m0DockWh + 1, 0, 0, 0,+                                                    m0DockY, m0DockY + m0DockHt,+                                                    0, 0, 0, 0, 0, 0)+            return ()+        else do+            windowMove monitor0Dock (dfltWh - m0DockWh) m0DockY+            onRealize monitor0Dock $+                setStrutProperties monitor0Dock (0, m0DockWh + 1, 0, 0,+                                                     0, 0,+                                                     m0DockY, m0DockY + m0DockHt,+                                                     0, 0, 0, 0)+            widgetSetSensitivity quitBtn False+            return ()+    widgetShowAll monitor0Dock++    -- toggle buttons+    forM_ tbData $ \(tbName, tbCaption, _, _, f) -> do+        widget <- getTogglebutton xml tbName+        buttonSetLabel widget tbCaption+        onToggled widget (f widget myScreenId lockSendCommand)++    -- master area buttons+    incMasterBtn <- xmlGetWidget xml castToButton "incmasterbutton"+    decMasterBtn <- xmlGetWidget xml castToButton "decmasterbutton"+    onClicked incMasterBtn $ sendCommand incMasterCmd myScreenId+    onClicked decMasterBtn $ sendCommand decMasterCmd myScreenId++    -- quit button+    onClicked quitBtn $ do+        dialog <- messageDialogNew (Just monitor0Dock) [DialogModal] MessageQuestion ButtonsNone "Really quit Bluetile?"+        dialogAddButton dialog "Quit" (ResponseUser quitBluetileCmd)+        dialogAddButton dialog "Quit and start Metacity" (ResponseUser quitBluetileStartMetacityCmd)+        dialogAddButton dialog "Cancel" ResponseCancel+        resp <- dialogRun dialog+        widgetDestroy dialog+        case resp of+            ResponseUser cmd -> do+                sendCommand cmd myScreenId+                hndlM <- readIORef otherDockProcess+                when (isJust hndlM) $ do+                    hPutStrLn (fromJust hndlM) $ show InternalQuitCmd+                mainQuit+            _ -> return ()++    -- prepare stdin reader+    updates <- getContents+    forkIO $ processUpdate (lines updates) xml myScreenId lockSendCommand otherDockProcess++    -- enter main GUI loop+    timeoutAddFull (yield >> return True) priorityDefaultIdle 50+    mainGUI++getTogglebutton :: GladeXML -> String -> IO (ToggleButton)+getTogglebutton xml tbName = xmlGetWidget xml castToToggleButton tbName++processUpdate :: [String] -> GladeXML -> Int -> IORef Bool -> IORef (Maybe Handle) -> IO ()+processUpdate updates xml myScreenId lockSendCommand otherDockProcess =+        mapM_ (pU . read) updates+    where+        pU :: DockOutput -> IO ()+        pU update@(DO sid longLayoutDesc cws) = do+            let layoutDesc = last $ words longLayoutDesc+            hndlM <- readIORef otherDockProcess+            when (sid == myScreenId) $ do+                writeIORef lockSendCommand True+                activateToggleButtons xml cws "workspace"+                activateToggleButtons xml layoutDesc "layout"+                writeIORef lockSendCommand False+            when (sid /= myScreenId && isNothing hndlM) $ do+                hndl <- spawnPipe "bluetiledock --otherscreen"+                writeIORef otherDockProcess (Just hndl)+                hPutStrLn hndl $ show update+            when (sid /= myScreenId && isJust hndlM) $ do+                hPutStrLn (fromJust hndlM) $ show update+        pU InternalQuitCmd = mainQuit++activateToggleButtons :: GladeXML -> String -> String -> IO ()+activateToggleButtons xml cws group = do+    let relevantTbData = filter (\(_, _, _, group', _) -> group' == group) tbData+    forM_ relevantTbData $ \(tbName, _, tag, _, _) -> do+        widget <- getTogglebutton xml tbName+        toggleButtonSetActive widget (tag == cws)++sendCommandIfToggled :: (ToggleButtonClass self) => Int -> self -> Int -> IORef Bool -> IO ()+sendCommandIfToggled cmd widget myScreenId lockSendCommand = do+    isToggled <- toggleButtonGetActive widget+    isLocked <- readIORef lockSendCommand+    when (isToggled && not isLocked) $ sendCommand cmd myScreenId++sendCommand :: Int -> Int -> IO ()+sendCommand cmd myScreenId = sendCommandX (cmd + myScreenId * nextScreenCmdOffset)++sendCommandX :: Int -> IO ()+sendCommandX com = do+  d   <- X.openDisplay ""+  rw  <- X.rootWindow d $ X.defaultScreen d+  a <- X.internAtom d "XMONAD_COMMAND" False+  X.allocaXEvent $ \e -> do+                  XE.setEventType e X.clientMessage+                  XE.setClientMessageEvent e rw a 32 (fromIntegral com) XE.currentTime+                  X.sendEvent d rw False X.structureNotifyMask e+                  X.sync d False
+ BluetileGreet.hs view
@@ -0,0 +1,56 @@+----------------------------------------------------------------------------+-- |+-- Module      :  Main+-- Copyright   :  (c) Jan Vornberger 2009+-- License     :  BSD3-style (see LICENSE)+--+-- Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de+-- Stability   :  unstable+-- Portability :  not portable+--+-----------------------------------------------------------------------------++module Main where++import Graphics.UI.Gtk+import Graphics.UI.Gtk.Glade+import Paths_bluetileutils+import Utils+import Control.Monad(when)+import System.Environment(getEnv)+import System.FilePath(pathSeparator)+import System.Directory(doesFileExist)++main :: IO ()+main = do+    home <- getEnv "HOME"+    let configFile = home ++ [pathSeparator] ++ ".bluetilegreet"+    exists <- doesFileExist configFile+    when (not exists) $ greetingScreen configFile++greetingScreen :: String -> IO ()+greetingScreen configFile = do+    initGUI+    gladeFile <- getDataFileName "bluetilegreet.glade"+    Just xml <- xmlNew gladeFile++    window <- xmlGetWidget xml castToWindow "bluetilegreetwindow"+    onDestroy window mainQuit+    windowSetPosition window WinPosCenter++    openWindowsBtn <- xmlGetWidget xml castToButton "openwindowsbutton"+    onClicked openWindowsBtn $ do+        spawnPipe "bluetilemockwin 0 0 65535"+        spawnPipe "bluetilemockwin 65535 0 0"+        return ()++    startBtn <- xmlGetWidget xml castToButton "startbutton"+    startupAgainChkBtn <- xmlGetWidget xml castToCheckButton "startupagaincheckbutton"+    onClicked startBtn $ do+        noFutureStartups <- toggleButtonGetActive startupAgainChkBtn+        when noFutureStartups $ do+            writeFile configFile "Delete this file to show the Bluetile greeting screen again.\n"+        mainQuit++    widgetShowAll window+    mainGUI
+ BluetileMockWin.hs view
@@ -0,0 +1,36 @@+----------------------------------------------------------------------------+-- |+-- Module      :  Main+-- Copyright   :  (c) Jan Vornberger 2009+-- License     :  BSD3-style (see LICENSE)+--+-- Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de+-- Stability   :  unstable+-- Portability :  not portable+--+-----------------------------------------------------------------------------++module Main where++import Graphics.UI.Gtk+import System.Environment(getArgs,getProgName)++main :: IO ()+main = do+    args <- getArgs+    progName <- getProgName+    if length args /= 3+        then putStrLn $ "Usage: " ++ progName ++ " 0 0 65535"+        else let r = read $ args !! 0+                 g = read $ args !! 1+                 b = read $ args !! 2+             in showMockWin (Color r g b)++showMockWin :: Color -> IO ()+showMockWin c = do+    initGUI+    window <- windowNew+    onDestroy window mainQuit+    widgetModifyBg window StateNormal c+    widgetShowAll window+    mainGUI
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2009 Jan Vornberger++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++1. Redistributions of source code must retain the above copyright+   notice, this list of conditions and the following disclaimer.++2. Redistributions in binary form must reproduce the above copyright+   notice, this list of conditions and the following disclaimer in the+   documentation and/or other materials provided with the distribution.++3. Neither the name of the author nor the names of his contributors+   may be used to endorse or promote products derived from this software+   without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ Utils.hs view
@@ -0,0 +1,35 @@+----------------------------------------------------------------------------+-- |+-- Module      :  Utils+-- Copyright   :  (c) Jan Vornberger 2009+-- License     :  BSD3-style (see LICENSE)+--+-- Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de+-- Stability   :  unstable+-- Portability :  not portable+--+-----------------------------------------------------------------------------++module Utils where++import System.Posix+import System.IO++-- | Launch an external application through the system shell and return a @Handle@ to its standard input.+spawnPipe :: String -> IO Handle+spawnPipe x = do+    (rd, wr) <- createPipe+    setFdOption wr CloseOnExec True+    h <- fdToHandle wr+    hSetBuffering h LineBuffering+    forkProcess $ do+        createSession+        uninstallSignalHandlers+        dupTo rd stdInput+        executeFile "/bin/sh" False ["-c", x] Nothing+    return h++uninstallSignalHandlers :: IO ()+uninstallSignalHandlers = do+    installHandler sigCHLD Default Nothing+    return ()
+ bluetiledock.glade view
@@ -0,0 +1,345 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">+<!--Generated with glade3 3.4.5 on Mon Jul 27 17:15:18 2009 -->+<glade-interface>+  <widget class="GtkWindow" id="monitor0Dock">+    <property name="width_request">30</property>+    <property name="height_request">690</property>+    <property name="title" translatable="yes">BluetileDock - Workspace</property>+    <child>+      <widget class="GtkVBox" id="vbox2">+        <property name="visible">True</property>+        <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+        <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+        <child>+          <widget class="GtkVBox" id="vbox3">+            <property name="visible">True</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <child>+              <widget class="GtkLabel" id="label2">+                <property name="visible">True</property>+                <property name="label" translatable="yes">Wrk-+spc</property>+              </widget>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton1">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 1</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">1</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton2">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 2</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">2</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton3">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 3</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">3</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton4">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 4</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">4</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton5">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 5</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">5</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton6">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 6</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">6</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton7">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 7</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">7</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton8">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 8</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">8</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton9">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 9</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">9</property>+              </packing>+            </child>+            <child>+              <widget class="GtkToggleButton" id="togglebutton0">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Switch to workspace 0</property>+                <property name="label" translatable="yes">togglebutton</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">10</property>+              </packing>+            </child>+          </widget>+        </child>+        <child>+          <widget class="GtkVBox" id="vbox1">+            <property name="visible">True</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <child>+              <widget class="GtkLabel" id="label1">+                <property name="visible">True</property>+                <property name="label" translatable="yes">Lay-+out</property>+              </widget>+            </child>+            <child>+              <widget class="GtkVBox" id="vbox4">+                <property name="visible">True</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <child>+                  <widget class="GtkImage" id="imagelayouta">+                    <property name="visible">True</property>+                    <property name="pixbuf">floating.svg</property>+                  </widget>+                </child>+                <child>+                  <widget class="GtkToggleButton" id="togglebuttonlayouta">+                    <property name="visible">True</property>+                    <property name="can_focus">True</property>+                    <property name="receives_default">True</property>+                    <property name="tooltip" translatable="yes">Switch to stacking window layout</property>+                    <property name="label" translatable="yes">...</property>+                    <property name="relief">GTK_RELIEF_HALF</property>+                    <property name="response_id">0</property>+                  </widget>+                  <packing>+                    <property name="position">1</property>+                  </packing>+                </child>+              </widget>+              <packing>+                <property name="padding">2</property>+                <property name="position">1</property>+              </packing>+            </child>+            <child>+              <widget class="GtkVBox" id="vbox5">+                <property name="visible">True</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <child>+                  <widget class="GtkImage" id="imagelayoutb">+                    <property name="visible">True</property>+                    <property name="pixbuf">tiled1.svg</property>+                  </widget>+                </child>+                <child>+                  <widget class="GtkToggleButton" id="togglebuttonlayoutb">+                    <property name="visible">True</property>+                    <property name="can_focus">True</property>+                    <property name="receives_default">True</property>+                    <property name="tooltip" translatable="yes">Switch to tiled horizontal layout</property>+                    <property name="label" translatable="yes">...</property>+                    <property name="response_id">0</property>+                  </widget>+                  <packing>+                    <property name="position">1</property>+                  </packing>+                </child>+              </widget>+              <packing>+                <property name="padding">2</property>+                <property name="position">2</property>+              </packing>+            </child>+            <child>+              <widget class="GtkVBox" id="vbox6">+                <property name="visible">True</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <child>+                  <widget class="GtkImage" id="imagelayoutc">+                    <property name="visible">True</property>+                    <property name="pixbuf">tiled2.svg</property>+                  </widget>+                </child>+                <child>+                  <widget class="GtkToggleButton" id="togglebuttonlayoutc">+                    <property name="visible">True</property>+                    <property name="can_focus">True</property>+                    <property name="receives_default">True</property>+                    <property name="tooltip" translatable="yes">Switch to tiled vertical layout</property>+                    <property name="label" translatable="yes">...</property>+                    <property name="response_id">0</property>+                  </widget>+                  <packing>+                    <property name="position">1</property>+                  </packing>+                </child>+              </widget>+              <packing>+                <property name="padding">2</property>+                <property name="position">3</property>+              </packing>+            </child>+            <child>+              <widget class="GtkVBox" id="vbox7">+                <property name="visible">True</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <child>+                  <widget class="GtkImage" id="imagelayoutd">+                    <property name="visible">True</property>+                    <property name="pixbuf">fullscreen.svg</property>+                  </widget>+                </child>+                <child>+                  <widget class="GtkToggleButton" id="togglebuttonlayoutd">+                    <property name="visible">True</property>+                    <property name="can_focus">True</property>+                    <property name="receives_default">True</property>+                    <property name="tooltip" translatable="yes">Switch to fullscreen layout</property>+                    <property name="label" translatable="yes">...</property>+                    <property name="response_id">0</property>+                  </widget>+                  <packing>+                    <property name="position">1</property>+                  </packing>+                </child>+              </widget>+              <packing>+                <property name="padding">2</property>+                <property name="position">4</property>+              </packing>+            </child>+          </widget>+          <packing>+            <property name="position">1</property>+          </packing>+        </child>+        <child>+          <widget class="GtkVBox" id="vbox8">+            <property name="visible">True</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <child>+              <widget class="GtkButton" id="incmasterbutton">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Increase number of windows in the master area</property>+                <property name="label" translatable="yes">+1</property>+                <property name="response_id">0</property>+              </widget>+            </child>+            <child>+              <widget class="GtkButton" id="decmasterbutton">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Decrease number of windows in the master area</property>+                <property name="label" translatable="yes">-1</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">1</property>+              </packing>+            </child>+            <child>+              <widget class="GtkButton" id="quitbutton">+                <property name="visible">True</property>+                <property name="can_focus">True</property>+                <property name="receives_default">True</property>+                <property name="tooltip" translatable="yes">Quit Bluetile</property>+                <property name="label" translatable="yes">Q</property>+                <property name="response_id">0</property>+              </widget>+              <packing>+                <property name="position">2</property>+              </packing>+            </child>+          </widget>+          <packing>+            <property name="position">2</property>+          </packing>+        </child>+      </widget>+    </child>+  </widget>+</glade-interface>
+ bluetilegreet.glade view
@@ -0,0 +1,178 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">+<!--Generated with glade3 3.4.5 on Sun Aug  2 16:49:06 2009 -->+<glade-interface>+  <widget class="GtkWindow" id="bluetilegreetwindow">+    <property name="width_request">450</property>+    <property name="height_request">450</property>+    <property name="title" translatable="yes">Welcome to Bluetile!</property>+    <child>+      <widget class="GtkAlignment" id="alignment1">+        <property name="visible">True</property>+        <property name="top_padding">10</property>+        <property name="bottom_padding">10</property>+        <property name="left_padding">10</property>+        <property name="right_padding">10</property>+        <child>+          <widget class="GtkVBox" id="vbox1">+            <property name="visible">True</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <property name="spacing">5</property>+            <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+            <child>+              <widget class="GtkLabel" id="label1">+                <property name="visible">True</property>+                <property name="label" translatable="yes">&lt;span size="large" font_weight="bold"&gt;Welcome to Bluetile!&lt;/span&gt;+A modern tiling window manager+with a gentle learning curve.</property>+                <property name="use_markup">True</property>+                <property name="justify">GTK_JUSTIFY_CENTER</property>+              </widget>+            </child>+            <child>+              <widget class="GtkTable" id="table2">+                <property name="visible">True</property>+                <property name="n_rows">3</property>+                <property name="n_columns">2</property>+                <property name="column_spacing">3</property>+                <property name="row_spacing">3</property>+                <child>+                  <placeholder/>+                </child>+                <child>+                  <placeholder/>+                </child>+                <child>+                  <widget class="GtkLabel" id="label2">+                    <property name="visible">True</property>+                    <property name="label" translatable="yes">Quickstart: Open a few windows and notice that you are currently in the traditional layout mode, known from most other window managers. To start tiling, switch to another layout in one of these ways:</property>+                    <property name="wrap">True</property>+                  </widget>+                </child>+                <child>+                  <widget class="GtkLabel" id="label3">+                    <property name="visible">True</property>+                    <property name="label" translatable="yes">* Using the dock on the left (buttons A, S, D or F),+* pressing the middle mouse button while+   holding down the Windows key or+* using the keyboard shortcuts Win+A, Win+S,+   Win+D or Win+F .</property>+                  </widget>+                  <packing>+                    <property name="top_attach">1</property>+                    <property name="bottom_attach">2</property>+                  </packing>+                </child>+                <child>+                  <widget class="GtkLabel" id="label4">+                    <property name="visible">True</property>+                    <property name="label" translatable="yes">You should be fine exploring the tiling paradigm with your mouse alone, but to get the most out of it you might want to look at the keyboard shortcuts at some point. They are documented on Bluetile's website.</property>+                    <property name="wrap">True</property>+                  </widget>+                  <packing>+                    <property name="top_attach">2</property>+                    <property name="bottom_attach">3</property>+                  </packing>+                </child>+                <child>+                  <widget class="GtkTable" id="table1">+                    <property name="visible">True</property>+                    <property name="n_rows">3</property>+                    <property name="n_columns">3</property>+                    <property name="column_spacing">3</property>+                    <property name="row_spacing">3</property>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <placeholder/>+                    </child>+                    <child>+                      <widget class="GtkButton" id="openwindowsbutton">+                        <property name="visible">True</property>+                        <property name="can_focus">True</property>+                        <property name="receives_default">True</property>+                        <property name="response_id">0</property>+                        <child>+                          <widget class="GtkLabel" id="label5">+                            <property name="visible">True</property>+                            <property name="label" translatable="yes">&lt;span size="x-small"&gt;Open+a few+windows&lt;/span&gt;</property>+                            <property name="use_markup">True</property>+                          </widget>+                        </child>+                      </widget>+                      <packing>+                        <property name="left_attach">1</property>+                        <property name="right_attach">2</property>+                        <property name="top_attach">1</property>+                        <property name="bottom_attach">2</property>+                      </packing>+                    </child>+                  </widget>+                  <packing>+                    <property name="left_attach">1</property>+                    <property name="right_attach">2</property>+                  </packing>+                </child>+              </widget>+              <packing>+                <property name="position">1</property>+              </packing>+            </child>+            <child>+              <widget class="GtkVBox" id="vbox3">+                <property name="visible">True</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <property name="orientation">GTK_ORIENTATION_VERTICAL</property>+                <child>+                  <widget class="GtkCheckButton" id="startupagaincheckbutton">+                    <property name="visible">True</property>+                    <property name="can_focus">True</property>+                    <property name="label" translatable="yes">Do not show this window on future startups.</property>+                    <property name="response_id">0</property>+                    <property name="draw_indicator">True</property>+                  </widget>+                </child>+                <child>+                  <widget class="GtkButton" id="startbutton">+                    <property name="visible">True</property>+                    <property name="can_focus">True</property>+                    <property name="receives_default">True</property>+                    <property name="label" translatable="yes">Let's start tiling!</property>+                    <property name="response_id">0</property>+                  </widget>+                  <packing>+                    <property name="position">1</property>+                  </packing>+                </child>+              </widget>+              <packing>+                <property name="position">2</property>+              </packing>+            </child>+          </widget>+        </child>+      </widget>+    </child>+  </widget>+</glade-interface>
+ bluetileutils.cabal view
@@ -0,0 +1,31 @@+Name:                bluetileutils+Version:             0.1+synopsis:            Utilities for Bluetile+category:            Utils+License:             BSD3+License-file:        LICENSE+Author:              Jan Vornberger+Maintainer:          jan.vornberger@informatik.uni-oldenburg.de+extra-source-files:  Utils.hs+data-files:          bluetiledock.glade, bluetilegreet.glade,+                     floating.svg, tiled1.svg, tiled2.svg, fullscreen.svg+Build-Type:          Simple+Cabal-Version:       >=1.2++Executable bluetiledock+  Main-is:           BluetileDock.hs+  Build-Depends:     base>=3, base<4, unix,+                     glade>=0.9, gtk>=0.9, X11>=1.4+  C-sources:         gdk_property_change_wrapper.c+  Ghc-options:       -Wall++Executable bluetilemockwin+  Main-is:           BluetileMockWin.hs+  Build-Depends:     base>=3, base<4, gtk>=0.9+  Ghc-options:       -Wall++Executable bluetilegreet+  Main-is:           BluetileGreet.hs+  Build-Depends:     base>=3, base<4, directory, filepath,+                     glade>=0.9, gtk>=0.9+  Ghc-options:       -Wall
+ floating.svg view
@@ -0,0 +1,91 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->+<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="32px"+   height="32px"+   id="svg2383"+   sodipodi:version="0.32"+   inkscape:version="0.46"+   sodipodi:docname="floating.svg"+   inkscape:output_extension="org.inkscape.output.svg.inkscape">+  <defs+     id="defs2385">+    <inkscape:perspective+       sodipodi:type="inkscape:persp3d"+       inkscape:vp_x="0 : 16 : 1"+       inkscape:vp_y="0 : 1000 : 0"+       inkscape:vp_z="32 : 16 : 1"+       inkscape:persp3d-origin="16 : 10.666667 : 1"+       id="perspective2391" />+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="15.836083"+     inkscape:cx="21.706824"+     inkscape:cy="13.892839"+     inkscape:current-layer="layer1"+     showgrid="true"+     inkscape:grid-bbox="true"+     inkscape:document-units="px"+     inkscape:window-width="956"+     inkscape:window-height="922"+     inkscape:window-x="1206"+     inkscape:window-y="18">+    <inkscape:grid+       type="xygrid"+       id="grid3251" />+  </sodipodi:namedview>+  <metadata+     id="metadata2388">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     id="layer1"+     inkscape:label="Layer 1"+     inkscape:groupmode="layer">+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect2393"+       width="12.515527"+       height="12.218931"+       x="4.3788815"+       y="5.5284805" />+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3247"+       width="16.493782"+       height="15.818596"+       x="8.1262932"+       y="9.4660864" />+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3249"+       width="7.9009342"+       height="8"+       x="20.035919"+       y="21.165613" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 20.039745,27.194004 L 20.039745,25.268023 L 14.104431,25.268023 L 8.1691171,25.268023 L 8.1528328,21.494994 L 8.1365491,17.721965 L 6.257928,17.705238 L 4.3793068,17.68851 L 4.3793068,11.627346 L 4.3793068,5.566181 L 10.630853,5.566181 L 16.882399,5.566181 L 16.882399,7.5237358 L 16.882399,9.4812906 L 20.734361,9.4812906 L 24.586324,9.4812906 L 24.586324,15.322381 L 24.586324,21.163472 L 26.259718,21.163472 L 27.933111,21.163472 L 27.933111,25.141729 L 27.933111,29.119985 L 23.986428,29.119985 L 20.039745,29.119985 L 20.039745,27.194004 z"+       id="path2443" />+  </g>+</svg>
+ fullscreen.svg view
@@ -0,0 +1,77 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->+<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="32px"+   height="32px"+   id="svg2383"+   sodipodi:version="0.32"+   inkscape:version="0.46"+   sodipodi:docname="fullscreen.svg"+   inkscape:output_extension="org.inkscape.output.svg.inkscape">+  <defs+     id="defs2385">+    <inkscape:perspective+       sodipodi:type="inkscape:persp3d"+       inkscape:vp_x="0 : 16 : 1"+       inkscape:vp_y="0 : 1000 : 0"+       inkscape:vp_z="32 : 16 : 1"+       inkscape:persp3d-origin="16 : 10.666667 : 1"+       id="perspective2391" />+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="15.836083"+     inkscape:cx="21.706824"+     inkscape:cy="13.892839"+     inkscape:current-layer="layer1"+     showgrid="true"+     inkscape:grid-bbox="true"+     inkscape:document-units="px"+     inkscape:window-width="956"+     inkscape:window-height="922"+     inkscape:window-x="1206"+     inkscape:window-y="18">+    <inkscape:grid+       type="xygrid"+       id="grid3251" />+  </sodipodi:namedview>+  <metadata+     id="metadata2388">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     id="layer1"+     inkscape:label="Layer 1"+     inkscape:groupmode="layer">+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3247"+       width="25.922001"+       height="25.844946"+       x="3.0779994"+       y="3.1550536" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 3.1163683,16.080145 L 3.1163683,3.1665977 L 16.029915,3.1665977 L 28.943462,3.1665977 L 28.943462,16.080145 L 28.943462,28.993691 L 16.029915,28.993691 L 3.1163683,28.993691 L 3.1163683,16.080145 z"+       id="path2481" />+  </g>+</svg>
+ gdk_property_change_wrapper.c view
@@ -0,0 +1,28 @@+////////////////////////////////////////////////////////////////////////////+// Copyright   :  (c) Jan Vornberger 2009+// License     :  BSD3-style (see LICENSE)+//+// Maintainer  :  jan.vornberger@informatik.uni-oldenburg.de+////////////////////////////////////////////////////////////////////////////-++#include <gtk/gtk.h>+#include <gdk/gdk.h>++void set_strut_properties(GtkWindow *window,+				long left, long right, long top, long bottom,+ 				long left_start_y, long left_end_y,+ 				long right_start_y, long right_end_y,+ 				long top_start_x, long top_end_x,+ 				long bottom_start_x, long bottom_end_x) {+	gulong data[12] = {0};+	data[0] = left; data[1] = right; data[2] = top; data[3] = bottom;+	data[4] = left_start_y; data[5] = left_end_y;+	data[6] = right_start_y; data[7] = right_end_y;+	data[8] = top_start_x; data[9] = top_end_x;+	data[10] = bottom_start_x; data[11] = bottom_end_x;++	gdk_property_change(GTK_WIDGET(window)->window,+				gdk_atom_intern("_NET_WM_STRUT_PARTIAL", FALSE),+				gdk_atom_intern ("CARDINAL", FALSE),+				32, GDK_PROP_MODE_REPLACE, (unsigned char *)data, 12);+}
+ tiled1.svg view
@@ -0,0 +1,99 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->+<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="32px"+   height="32px"+   id="svg2383"+   sodipodi:version="0.32"+   inkscape:version="0.46"+   sodipodi:docname="tiled1.svg"+   inkscape:output_extension="org.inkscape.output.svg.inkscape">+  <defs+     id="defs2385">+    <inkscape:perspective+       sodipodi:type="inkscape:persp3d"+       inkscape:vp_x="0 : 16 : 1"+       inkscape:vp_y="0 : 1000 : 0"+       inkscape:vp_z="32 : 16 : 1"+       inkscape:persp3d-origin="16 : 10.666667 : 1"+       id="perspective2391" />+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="15.836083"+     inkscape:cx="21.706824"+     inkscape:cy="13.892839"+     inkscape:current-layer="layer1"+     showgrid="true"+     inkscape:grid-bbox="true"+     inkscape:document-units="px"+     inkscape:window-width="956"+     inkscape:window-height="922"+     inkscape:window-x="1206"+     inkscape:window-y="18">+    <inkscape:grid+       type="xygrid"+       id="grid3251" />+  </sodipodi:namedview>+  <metadata+     id="metadata2388">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     id="layer1"+     inkscape:label="Layer 1"+     inkscape:groupmode="layer">+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect2393"+       width="11.96369"+       height="11.02142"+       x="3.0363102"+       y="18.031572" />+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3247"+       width="25.922001"+       height="11.966633"+       x="3.0779994"+       y="3.1550536" />+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3249"+       width="10.805693"+       height="10.919038"+       x="18.083906"+       y="18" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 3.1163683,9.1339825 L 3.1163683,3.1665977 L 16.029915,3.1665977 L 28.943462,3.1665977 L 28.943462,9.1339825 L 28.943462,15.101367 L 16.029915,15.101367 L 3.1163683,15.101367 L 3.1163683,9.1339825 z"+       id="path2563" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 3.0532213,23.531482 L 3.0532213,18.069273 L 9.0206061,18.069273 L 14.987991,18.069273 L 14.987991,23.531482 L 14.987991,28.993691 L 9.0206061,28.993691 L 3.0532213,28.993691 L 3.0532213,23.531482 z"+       id="path2565" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 18.08219,23.436762 L 18.08219,18.006126 L 23.481253,18.006126 L 28.880315,18.006126 L 28.880315,23.436762 L 28.880315,28.867398 L 23.481253,28.867398 L 18.08219,28.867398 L 18.08219,23.436762 z"+       id="path2567" />+  </g>+</svg>
+ tiled2.svg view
@@ -0,0 +1,99 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->+<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="32px"+   height="32px"+   id="svg2383"+   sodipodi:version="0.32"+   inkscape:version="0.46"+   sodipodi:docname="tiled2.svg"+   inkscape:output_extension="org.inkscape.output.svg.inkscape">+  <defs+     id="defs2385">+    <inkscape:perspective+       sodipodi:type="inkscape:persp3d"+       inkscape:vp_x="0 : 16 : 1"+       inkscape:vp_y="0 : 1000 : 0"+       inkscape:vp_z="32 : 16 : 1"+       inkscape:persp3d-origin="16 : 10.666667 : 1"+       id="perspective2391" />+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="15.836083"+     inkscape:cx="21.706824"+     inkscape:cy="13.892839"+     inkscape:current-layer="layer1"+     showgrid="true"+     inkscape:grid-bbox="true"+     inkscape:document-units="px"+     inkscape:window-width="956"+     inkscape:window-height="922"+     inkscape:window-x="1206"+     inkscape:window-y="18">+    <inkscape:grid+       type="xygrid"+       id="grid3251" />+  </sodipodi:namedview>+  <metadata+     id="metadata2388">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     id="layer1"+     inkscape:label="Layer 1"+     inkscape:groupmode="layer">+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect2393"+       width="11.96369"+       height="25.987242"+       x="3.0363102"+       y="3.0657501" />+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3247"+       width="10.893032"+       height="11.966633"+       x="18.106968"+       y="3.1550536" />+    <rect+       style="fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       id="rect3249"+       width="10.805693"+       height="10.919038"+       x="18.083906"+       y="18" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 18.145337,9.1339825 L 18.145337,3.1665977 L 23.5444,3.1665977 L 28.943462,3.1665977 L 28.943462,9.1339825 L 28.943462,15.101367 L 23.5444,15.101367 L 18.145337,15.101367 L 18.145337,9.1339825 z"+       id="path2609" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 3.0532213,16.048571 L 3.0532213,3.1034508 L 9.0206061,3.1034508 L 14.987991,3.1034508 L 14.987991,16.048571 L 14.987991,28.993691 L 9.0206061,28.993691 L 3.0532213,28.993691 L 3.0532213,16.048571 z"+       id="path2611" />+    <path+       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:4.92700005;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+       d="M 18.08219,23.436762 L 18.08219,18.006126 L 23.481253,18.006126 L 28.880315,18.006126 L 28.880315,23.436762 L 28.880315,28.867398 L 23.481253,28.867398 L 18.08219,28.867398 L 18.08219,23.436762 z"+       id="path2613" />+  </g>+</svg>