10bbfda8aSnia/* 20bbfda8aSnia * Functions related to icon managers and the workspace manager. 30bbfda8aSnia */ 40bbfda8aSnia 50bbfda8aSnia#include "ctwm.h" 60bbfda8aSnia 70bbfda8aSnia#include "functions_internal.h" 80bbfda8aSnia#include "iconmgr.h" 90bbfda8aSnia#include "icons.h" 100bbfda8aSnia#include "otp.h" 110bbfda8aSnia#include "screen.h" 120bbfda8aSnia#include "vscreen.h" 130bbfda8aSnia#include "win_iconify.h" 140bbfda8aSnia#include "win_utils.h" 150bbfda8aSnia#include "workspace_manager.h" 160bbfda8aSnia 170bbfda8aSnia 180bbfda8aSnia/* 190bbfda8aSnia * Moving around in the icon manager. 200bbfda8aSnia * 210bbfda8aSnia * XXX These backend funcs in iconmgr.c are passed func directly. That's 220bbfda8aSnia * a bit of a layering violation; they should maybe be changed to have 230bbfda8aSnia * their own idea of directionality... 240bbfda8aSnia */ 250bbfda8aSniaDFHANDLER(upiconmgr) 260bbfda8aSnia{ 270bbfda8aSnia MoveIconManager(func); 280bbfda8aSnia} 290bbfda8aSniaDFHANDLER(downiconmgr) 300bbfda8aSnia{ 310bbfda8aSnia MoveIconManager(func); 320bbfda8aSnia} 330bbfda8aSniaDFHANDLER(lefticonmgr) 340bbfda8aSnia{ 350bbfda8aSnia MoveIconManager(func); 360bbfda8aSnia} 370bbfda8aSniaDFHANDLER(righticonmgr) 380bbfda8aSnia{ 390bbfda8aSnia MoveIconManager(func); 400bbfda8aSnia} 410bbfda8aSniaDFHANDLER(forwiconmgr) 420bbfda8aSnia{ 430bbfda8aSnia MoveIconManager(func); 440bbfda8aSnia} 450bbfda8aSniaDFHANDLER(backiconmgr) 460bbfda8aSnia{ 470bbfda8aSnia MoveIconManager(func); 480bbfda8aSnia} 490bbfda8aSnia 500bbfda8aSnia/* XXX These two functions (Move/MoveMapped) really should be merged... */ 510bbfda8aSniaDFHANDLER(forwmapiconmgr) 520bbfda8aSnia{ 530bbfda8aSnia MoveMappedIconManager(func); 540bbfda8aSnia} 550bbfda8aSniaDFHANDLER(backmapiconmgr) 560bbfda8aSnia{ 570bbfda8aSnia MoveMappedIconManager(func); 580bbfda8aSnia} 590bbfda8aSnia 600bbfda8aSnia/* Moving between icon managers */ 610bbfda8aSniaDFHANDLER(nexticonmgr) 620bbfda8aSnia{ 630bbfda8aSnia JumpIconManager(func); 640bbfda8aSnia} 650bbfda8aSniaDFHANDLER(previconmgr) 660bbfda8aSnia{ 670bbfda8aSnia JumpIconManager(func); 680bbfda8aSnia} 690bbfda8aSnia 700bbfda8aSnia 710bbfda8aSnia/* 720bbfda8aSnia * Showing/hiding the icon managers 730bbfda8aSnia */ 740bbfda8aSniaDFHANDLER(showiconmgr) 750bbfda8aSnia{ 760bbfda8aSnia IconMgr *i; 770bbfda8aSnia WorkSpace *wl; 780bbfda8aSnia 790bbfda8aSnia /* 800bbfda8aSnia * XXX I don't think this is right; there can still be icon managers 810bbfda8aSnia * to show even if we've never set any Workspaces {}. And 820bbfda8aSnia * HideIconManager() doesn't have this extra condition either... 830bbfda8aSnia */ 840bbfda8aSnia if(! Scr->workSpaceManagerActive) { 850bbfda8aSnia return; 860bbfda8aSnia } 870bbfda8aSnia 880bbfda8aSnia if(Scr->NoIconManagers) { 890bbfda8aSnia return; 900bbfda8aSnia } 910bbfda8aSnia 920bbfda8aSnia for(wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { 930bbfda8aSnia for(i = wl->iconmgr; i != NULL; i = i->next) { 940bbfda8aSnia /* Don't show iconmgr's with nothing in 'em */ 950bbfda8aSnia if(i->count == 0) { 960bbfda8aSnia continue; 970bbfda8aSnia } 980bbfda8aSnia 990bbfda8aSnia /* If it oughta be in a vscreen, show it */ 1000bbfda8aSnia if(visible(i->twm_win)) { 1010bbfda8aSnia /* IM window */ 1020bbfda8aSnia SetMapStateProp(i->twm_win, NormalState); 1030bbfda8aSnia XMapWindow(dpy, i->twm_win->w); 1040bbfda8aSnia OtpRaise(i->twm_win, WinWin); 1050bbfda8aSnia XMapWindow(dpy, i->twm_win->frame); 1060bbfda8aSnia 1070bbfda8aSnia /* Hide icon */ 1080bbfda8aSnia if(i->twm_win->icon && i->twm_win->icon->w) { 1090bbfda8aSnia XUnmapWindow(dpy, i->twm_win->icon->w); 1100bbfda8aSnia } 1110bbfda8aSnia } 1120bbfda8aSnia 1130bbfda8aSnia /* Mark as shown */ 1140bbfda8aSnia i->twm_win->mapped = true; 1150bbfda8aSnia i->twm_win->isicon = false; 1160bbfda8aSnia } 1170bbfda8aSnia } 1180bbfda8aSnia} 1190bbfda8aSnia 1200bbfda8aSnia 1210bbfda8aSnia/* 1220bbfda8aSnia * f.hideiconmanager is split into an external function (which is also 1230bbfda8aSnia * exported) because it also gets called when f.delete{,ordestroy} is 1240bbfda8aSnia * called on an icon manager. 1250bbfda8aSnia * 1260bbfda8aSnia * This hides all the icon managers in all the workspaces, and it doesn't 1270bbfda8aSnia * leave icons behind, so it's _not_ the same as just iconifying, and 1280bbfda8aSnia * thus not implemented by just calling Iconify(), but by doing the 1290bbfda8aSnia * hiding manually. 1300bbfda8aSnia */ 1310bbfda8aSniaDFHANDLER(hideiconmgr) 1320bbfda8aSnia{ 1330bbfda8aSnia HideIconManager(); 1340bbfda8aSnia} 1350bbfda8aSnia 1360bbfda8aSniavoid 1370bbfda8aSniaHideIconManager(void) 1380bbfda8aSnia{ 1390bbfda8aSnia IconMgr *i; 1400bbfda8aSnia WorkSpace *wl; 1410bbfda8aSnia 1420bbfda8aSnia if(Scr->NoIconManagers) { 1430bbfda8aSnia return; 1440bbfda8aSnia } 1450bbfda8aSnia 1460bbfda8aSnia for(wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { 1470bbfda8aSnia for(i = wl->iconmgr; i != NULL; i = i->next) { 1480bbfda8aSnia /* Hide the IM window */ 1490bbfda8aSnia SetMapStateProp(i->twm_win, WithdrawnState); 1500bbfda8aSnia XUnmapWindow(dpy, i->twm_win->frame); 1510bbfda8aSnia 1520bbfda8aSnia /* Hide its icon */ 1530bbfda8aSnia if(i->twm_win->icon && i->twm_win->icon->w) { 1540bbfda8aSnia XUnmapWindow(dpy, i->twm_win->icon->w); 1550bbfda8aSnia } 1560bbfda8aSnia 1570bbfda8aSnia /* Mark as pretend-iconified, even though the icon is hidden */ 1580bbfda8aSnia i->twm_win->mapped = false; 1590bbfda8aSnia i->twm_win->isicon = true; 1600bbfda8aSnia } 1610bbfda8aSnia } 1620bbfda8aSnia} 1630bbfda8aSnia 1640bbfda8aSnia 1650bbfda8aSnia/* 1660bbfda8aSnia * And sorting 1670bbfda8aSnia */ 1680bbfda8aSniaDFHANDLER(sorticonmgr) 1690bbfda8aSnia{ 1700bbfda8aSnia bool save_sort = Scr->SortIconMgr; 1710bbfda8aSnia 1720bbfda8aSnia Scr->SortIconMgr = true; 1730bbfda8aSnia 1740bbfda8aSnia if(context == C_ICONMGR) { 1750bbfda8aSnia SortIconManager(NULL); 1760bbfda8aSnia } 1770bbfda8aSnia else if(tmp_win->isiconmgr) { 1780bbfda8aSnia SortIconManager(tmp_win->iconmgrp); 1790bbfda8aSnia } 1800bbfda8aSnia else { 1810bbfda8aSnia XBell(dpy, 0); 1820bbfda8aSnia } 1830bbfda8aSnia 1840bbfda8aSnia Scr->SortIconMgr = save_sort; 1850bbfda8aSnia} 1860bbfda8aSnia 1870bbfda8aSnia 1880bbfda8aSnia 1890bbfda8aSnia/* 1900bbfda8aSnia * Now functions related to the workspace manager 1910bbfda8aSnia */ 1920bbfda8aSnia 1930bbfda8aSnia/* 1940bbfda8aSnia * Showing/hiding it 1950bbfda8aSnia */ 1960bbfda8aSniaDFHANDLER(showworkspacemgr) 1970bbfda8aSnia{ 1980bbfda8aSnia if(! Scr->workSpaceManagerActive) { 1990bbfda8aSnia return; 2000bbfda8aSnia } 2010bbfda8aSnia 2020bbfda8aSnia DeIconify(Scr->currentvs->wsw->twm_win); 2030bbfda8aSnia OtpRaise(Scr->currentvs->wsw->twm_win, WinWin); 2040bbfda8aSnia} 2050bbfda8aSnia 2060bbfda8aSniaDFHANDLER(hideworkspacemgr) 2070bbfda8aSnia{ 2080bbfda8aSnia if(! Scr->workSpaceManagerActive) { 2090bbfda8aSnia return; 2100bbfda8aSnia } 2110bbfda8aSnia 2120bbfda8aSnia Iconify(Scr->currentvs->wsw->twm_win, eventp->xbutton.x_root - 5, 2130bbfda8aSnia eventp->xbutton.y_root - 5); 2140bbfda8aSnia} 2150bbfda8aSnia 2160bbfda8aSniaDFHANDLER(toggleworkspacemgr) 2170bbfda8aSnia{ 2180bbfda8aSnia if(! Scr->workSpaceManagerActive) { 2190bbfda8aSnia return; 2200bbfda8aSnia } 2210bbfda8aSnia 2220bbfda8aSnia if(Scr->currentvs->wsw->twm_win->mapped) { 2230bbfda8aSnia Iconify(Scr->currentvs->wsw->twm_win, eventp->xbutton.x_root - 5, 2240bbfda8aSnia eventp->xbutton.y_root - 5); 2250bbfda8aSnia } 2260bbfda8aSnia else { 2270bbfda8aSnia DeIconify(Scr->currentvs->wsw->twm_win); 2280bbfda8aSnia OtpRaise(Scr->currentvs->wsw->twm_win, WinWin); 2290bbfda8aSnia } 2300bbfda8aSnia} 2310bbfda8aSnia 2320bbfda8aSnia 2330bbfda8aSnia/* 2340bbfda8aSnia * Flipping around map/button state 2350bbfda8aSnia */ 2360bbfda8aSniaDFHANDLER(togglestate) 2370bbfda8aSnia{ 2380bbfda8aSnia WMgrToggleState(Scr->currentvs); 2390bbfda8aSnia} 2400bbfda8aSnia 2410bbfda8aSniaDFHANDLER(setbuttonsstate) 2420bbfda8aSnia{ 2430bbfda8aSnia WMgrSetButtonsState(Scr->currentvs); 2440bbfda8aSnia} 2450bbfda8aSnia 2460bbfda8aSniaDFHANDLER(setmapstate) 2470bbfda8aSnia{ 2480bbfda8aSnia WMgrSetMapState(Scr->currentvs); 2490bbfda8aSnia} 250