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