1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /*
- * (c) Copyright 1987,1988,1989,1990,1992,1993,1994 HEWLETT-PACKARD COMPANY
- * (c) Copyright 1993, 1994 International Business Machines Corp.
- * (c) Copyright 1993, 1994 Sun Microsystems, Inc.
- * (c) Copyright 1993, 1994 Novell, Inc.
- * ALL RIGHTS RESERVED
- */
- /*
- * Included Files:
- */
- #include "WmGlobal.h"
- #include "WmHelp.h"
- #include "WmResNames.h"
- #include "WmIPlace.h"
- #include "WmInitWs.h"
- #include <X11/Xutil.h>
- #include "WmICCC.h"
- #include <Xm/Xm.h>
- #include <Xm/AtomMgr.h>
- #include <Dt/DtP.h>
- #include <Dt/WsmM.h>
- #include <stdio.h>
- #include "WmPanelP.h"
- #include "WmIPC.h" /* must be after DtP.h */
- #include "WmPresence.h"
- /* local macros */
- #ifndef MIN
- #define MIN(a,b) ((a)<=(b)?(a):(b))
- #endif
- #ifndef MAX
- #define MAX(a,b) ((a)>=(b)?(a):(b))
- #endif
- /* internally defined functions */
- #include "WmWrkspace.h"
- /******** Static Function Declarations ********/
- static void InsureUniqueWorkspaceHints(
- ClientData *pCD) ;
- /******** End Static Function Declarations ********/
- /* FindDtSessionMatch () put in WmResParse.h */
- /* external functions */
- #include "WmBackdrop.h"
- #include "WmError.h"
- #include "WmFunction.h"
- #include "WmIDecor.h"
- #include "WmIconBox.h"
- #include "WmMenu.h"
- #include "WmProperty.h"
- #include "WmResParse.h"
- #include "WmWinInfo.h"
- #include "WmWinList.h"
- #include "WmWinState.h"
- #include "WmXSMP.h"
- /*
- * Global Variables:
- */
- /* a dynamically allocated list of workspaces used
- * by F_AddToAllWorkspaces
- */
- static int numResIDs = 0;
- static WorkspaceID *pResIDs = NULL;
- /*************************************<->*************************************
- *
- * ChangeToWorkspace (pNewWS)
- *
- *
- * Description:
- * -----------
- * This function changes to a new workspace.
- *
- * Inputs:
- * ------
- * pNewWS = pointer to workspace data
- *
- *
- *************************************<->***********************************/
- void
- ChangeToWorkspace(
- WmWorkspaceData *pNewWS )
- {
- ClientData *pCD;
- int i;
- WmScreenData *pSD = pNewWS->pSD;
- ClientData *pWsPCD;
- Context wsContext = F_CONTEXT_NONE;
- if (pNewWS == pSD->pActiveWS)
- return; /* already there */
- pSD->pLastWS = pSD->pActiveWS;
- /*
- * Go through client list of old workspace and hide windows
- * that shouldn't appear in new workspace.
- */
- if (pSD->presence.shellW &&
- pSD->presence.onScreen &&
- pSD->presence.contextForClient == F_CONTEXT_ICON)
- {
- pWsPCD = pSD->presence.pCDforClient;
- wsContext = pSD->presence.contextForClient;
- HidePresenceBox (pSD, False);
- }
- for (i = 0; i < pSD->pActiveWS->numClients; i++)
- {
- pCD = pSD->pActiveWS->ppClients[i];
- if (!ClientInWorkspace (pNewWS, pCD))
- {
- SetClientWsIndex(pCD);
- SetClientState (pCD, pCD->clientState | UNSEEN_STATE,
- CurrentTime);
- }
- }
- /*
- * Hide active icon text label
- */
- if ((pSD->iconDecoration & ICON_ACTIVE_LABEL_PART) &&
- wmGD.activeIconTextDisplayed)
- {
- HideActiveIconText(pSD);
- }
-
- /*
- * Unmap old icon box
- */
- if (pSD->useIconBox)
- {
- UnmapIconBoxes (pSD->pLastWS);
- }
-
- /*
- * Set new active workspace
- */
- pSD->pActiveWS = pNewWS;
- ChangeBackdrop (pNewWS);
- /*
- * Go through client list of new workspace and show windows
- * that should appear.
- */
- for (i = 0; i < pNewWS->numClients; i++)
- {
- pCD = pNewWS->ppClients[i];
- SetClientWsIndex(pCD);
- if (pCD->clientState & UNSEEN_STATE)
- {
- SetClientState (pCD,
- (pCD->clientState & ~UNSEEN_STATE), CurrentTime);
- }
- if ((pCD->clientState == MINIMIZED_STATE) &&
- ((!pCD->pSD->useIconBox) ||
- (!P_ICON_BOX(pCD))))
- {
- XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD),
- ICON_X(pCD), ICON_Y(pCD));
- }
- if (pCD->iconWindow)
- {
- unsigned int xOffset, yOffset;
- /*
- * Adjust for icons in the box
- */
- if (pNewWS->pIconBox)
- {
- xOffset = IB_MARGIN_WIDTH;
- yOffset = IB_MARGIN_HEIGHT;
- }
- else
- {
- xOffset = 0;
- yOffset = 0;
- }
- /*
- * reparent icon window to frame in this workspace
- */
- if ((ICON_DECORATION(pCD) & ICON_IMAGE_PART) &&
- (pCD->iconWindow))
- {
- ReparentIconWindow (pCD, xOffset, yOffset);
- }
- }
- }
- if ( (wsContext == F_CONTEXT_ICON &&
- ClientInWorkspace (ACTIVE_WS, pWsPCD)) ||
-
- (pSD->presence.shellW &&
- ! pSD->presence.userDismissed &&
- ClientInWorkspace (ACTIVE_WS, pSD->presence.pCDforClient) &&
- pSD->presence.contextForClient == F_CONTEXT_ICON))
- {
- ShowPresenceBox(pSD->presence.pCDforClient, F_CONTEXT_ICON);
- }
- SetCurrentWorkspaceProperty (pSD);
- /* send workspace change broadcast message */
- dtSendWorkspaceModifyNotification(pSD, (Atom) pNewWS->id,
- DtWSM_REASON_CURRENT);
- } /* END OF FUNCTION ChangeToWorkspace */
- /******************************<->*************************************
- *
- * ChangeWorkspaceTitle (pWS, pchTitle)
- *
- * Description:
- * -----------
- * Set the title for a workspace.
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- * pchTitle = new title to assign to this workspace
- *
- * Outputs:
- * -------
- * none
- *
- * Comments:
- * --------
- *
- ******************************<->***********************************/
- void
- ChangeWorkspaceTitle(
- WmWorkspaceData *pWS,
- char * pchTitle)
- {
- XmString xmstr;
- /*
- * Convert string to XmString
- */
- xmstr = XmStringCreateLocalized (pchTitle);
- /*
- * Validate title ?
- */
- /*
- * Replace title in workspace data
- */
- XmStringFree (pWS->title);
- pWS->title = xmstr;
- /*
- * Save changes to resource database
- */
- SaveWorkspaceResources (pWS, (WM_RES_WORKSPACE_TITLE));
- /*
- * Replace old workspace in info property
- */
- SetWorkspaceInfoProperty (pWS);
- XFlush (DISPLAY);
- /*
- * Inform the world of the new workspace title
- */
- dtSendWorkspaceModifyNotification(pWS->pSD, pWS->id, DtWSM_REASON_TITLE);
- } /* END OF FUNCTION ChangeWorkspaceTitle */
- /*************************************<->*************************************
- *
- * UpdateWorkspacePresenceProperty (pCD)
- *
- *
- * Description:
- * -----------
- * This function updates the _DT_WORKSPACE_PRESENCE property for a
- * client window
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- *
- *************************************<->***********************************/
- void
- UpdateWorkspacePresenceProperty(
- ClientData *pCD )
- {
- static Atom *pPresence = NULL;
- static unsigned long cPresence = 0;
- unsigned long i;
- if (wmGD.useStandardBehavior)
- {
- /*
- * Don't change any workspace properties in standard behavior
- * mode.
- */
- return;
- }
- if (!pPresence)
- {
- /* allocate initial list */
- if (!(pPresence = (Atom *)
- XtMalloc (pCD->pSD->numWorkspaces * sizeof(Atom))))
- {
- Warning (((char *)GETMESSAGE(76, 1, "Insufficient memory for workspace presence property")));
- }
- else
- {
- cPresence = pCD->pSD->numWorkspaces;
- }
- }
- if (cPresence < pCD->numInhabited)
- {
- /* allocate bigger list */
- if (!(pPresence = (Atom *)
- XtRealloc ((char *)pPresence, pCD->numInhabited * sizeof(Atom))))
- {
- Warning (((char *)GETMESSAGE(76, 2, "Insufficient memory for workspace presence property")));
- }
- else
- {
- cPresence = pCD->numInhabited;
- }
- }
- for (i = 0; (i < pCD->numInhabited) && (i < cPresence) ; i++)
- {
- pPresence[i] = pCD->pWsList[i].wsID;
- }
- SetWorkspacePresence (pCD->client, pPresence,
- MIN(pCD->numInhabited, cPresence));
- } /* END OF FUNCTION UpdateWorkspacePresenceProperty */
- /*************************************<->*************************************
- *
- * AddPersistentWindow (pWS)
- *
- *
- * Description:
- * -----------
- * This function adds windows that want to be in all workspaces to
- * the workspace passed in.
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- *
- * Outputs:
- * --------
- *
- *************************************<->***********************************/
- void
- AddPersistentWindows(
- WmWorkspaceData *pWS)
- {
- WmScreenData *pSD = pWS->pSD;
- int i;
- ClientListEntry *pCLE;
- /*
- * For all the windows managed for this screen, see if they
- * want to be in all workspaces and add them to this workspace.
- */
- pCLE = pSD->clientList;
- while (1)
- {
- /*
- * Process all the non-icon client list entries
- */
- if ((pCLE->type == NORMAL_STATE) &&
- (pCLE->pCD->putInAll))
- {
- AddClientToWorkspaces( pCLE->pCD, &(pWS->id), 1 );
- }
-
- /*
- * Test for exit condition and advance client list pointer
- */
- if (pCLE == pSD->lastClient)
- break;
- else
- pCLE = pCLE->nextSibling;
- }
- } /* END OF FUNCTION AddPersistentWindows */
- /*************************************<->*************************************
- *
- * CreateWorkspace (pSD, pchTitle)
- *
- *
- * Description:
- * -----------
- * This function creates a new workspace.
- *
- * Inputs:
- * ------
- * pSD = pointer to screen data
- * pchTitle = user-visible title for the workspace (may be NULL)
- *
- * Outputs:
- * --------
- * Returns pointer to workspace data if successful.
- *
- *************************************<->***********************************/
- WmWorkspaceData *
- CreateWorkspace(
- WmScreenData *pSD,
- unsigned char *pchTitle )
- {
- WmWorkspaceData *pWS = NULL;
- String string;
- int iActiveWS;
- /*
- * Allocate more workspace datas if we have no spares
- */
- if (pSD->numWsDataAllocated <= pSD->numWorkspaces)
- {
- iActiveWS = (pSD->pActiveWS - pSD->pWS) / sizeof (WmWorkspaceData);
- pSD->numWsDataAllocated += WS_ALLOC_AMOUNT;
- pSD->pWS = (WmWorkspaceData *) XtRealloc ((char *)pSD->pWS,
- pSD->numWsDataAllocated * sizeof(WmWorkspaceData));
- pSD->pActiveWS = &(pSD->pWS[iActiveWS]);
- }
- /*
- * Give this workspace a name
- */
- pWS = &pSD->pWS[pSD->numWorkspaces];
- string = (String) GenerateWorkspaceName (pSD, pSD->numWorkspaces);
- pWS->name = XtNewString (string);
- /*
- * Initialize the workspace data structure
- */
- InitWmWorkspace (pWS, pSD);
- if (pchTitle)
- {
- if (pWS->title)
- XmStringFree (pWS->title);
- pWS->title = XmStringCreateLocalized ((char *)pchTitle);
- }
- /*
- * bump workspace count
- */
- pSD->numWorkspaces++;
- /*
- * update the properties that announce workspace info
- */
- SetWorkspaceInfoProperty (pWS);
- SetWorkspaceListProperty (pSD);
- SaveWorkspaceResources(pWS, (WM_RES_WORKSPACE_LIST |
- WM_RES_WORKSPACE_COUNT |
- WM_RES_WORKSPACE_TITLE));
- dtSendWorkspaceModifyNotification(pSD, pWS->id, DtWSM_REASON_ADD);
- /*
- * Insure there's an iconbox for this workspace
- */
- if (pSD->useIconBox)
- {
- AddIconBoxForWorkspace (pWS);
- }
- /*
- * Add windows to this workspaces that want to be in "all"
- * workspaces.
- */
- AddPersistentWindows (pWS);
- /*
- * Update workspace presence dialog data
- */
- UpdatePresenceWorkspaces(pSD);
- return (pWS);
- } /* END OF FUNCTION CreateWorkspace */
- /*************************************<->*************************************
- *
- * DeleteWorkspace (pWS)
- *
- *
- * Description:
- * -----------
- * This function deletes a workspace.
- *
- * Inputs:
- * ------
- * pWS = pointer to screen data
- *
- * Outputs:
- * --------
- * Returns pointer to workspace data if successful.
- *
- *************************************<->***********************************/
- void
- DeleteWorkspace(
- WmWorkspaceData *pWS )
- {
- WmWorkspaceData *pWSdest; /* destination WS */
- int i, iNextWs;
- ClientData *pCD;
- WmScreenData *pSD = pWS->pSD;
- Atom aOldId;
- if (pSD->numWorkspaces > 1)
- {
- /*
- * Find index for "next" workspace
- */
- for (iNextWs = 0; iNextWs < pSD->numWorkspaces; iNextWs++)
- {
- if (pSD->pWS[iNextWs].id == pWS->id)
- {
- iNextWs++;
- break;
- }
- }
- /* check bounds and wrap */
- if (iNextWs >= pSD->numWorkspaces)
- iNextWs = 0;
- /*
- * Determine default destination for clients that exist
- * only in the workspace being deleted.
- */
- if (pWS == ACTIVE_WS)
- {
- pWSdest = &(pSD->pWS[iNextWs]);
- }
- else
- {
- /*
- * Use the "current" workspace as the default destination
- */
- pWSdest = ACTIVE_WS;
- }
- /*
- * Move all clients out of this workspace
- */
- while (pWS->numClients > 0)
- {
- /* repeatedly remove the first one until all are gone */
- pCD = pWS->ppClients[0];
- if (pCD->numInhabited == 1)
- {
- if (!(pCD->clientFlags & (ICON_BOX)))
- {
- AddClientToWorkspaces (pCD, &(pWSdest->id), 1);
- }
- }
- RemoveClientFromWorkspaces (pCD, &(pWS->id), 1);
- }
- /*
- * If we're deleting the current workspace,
- * then change to another workspace.
- */
- if (pWS == ACTIVE_WS)
- {
- ChangeToWorkspace (pWSdest);
- }
- /*
- * Save the workspace ID for the notification message.
- */
- aOldId = pWS->id;
- /*
- * Destroy the icon box for the workspace if one was used
- */
- if (pSD->useIconBox)
- {
- DestroyIconBox (pWS);
- }
- /*
- * Delete the property containing information on this workspace
- */
- DeleteWorkspaceInfoProperty (pWS);
- /*
- * Delete the workspace data structures
- */
- if (pWS->backdrop.imagePixmap)
- {
- if (!XmDestroyPixmap (XtScreen(pWS->workspaceTopLevelW),
- pWS->backdrop.imagePixmap))
- {
- /* not in Xm pixmap cache */
- }
- }
- /* free pWS->backdrop.image */
- if ((pWS->backdrop.flags & BACKDROP_IMAGE_ALLOCED) &&
- (pWS->backdrop.image))
- {
- free (pWS->backdrop.image);
- }
- /*
- * Free up icon placement data
- */
- if (wmGD.iconAutoPlace)
- {
- if (pWS->IPData.placeList != NULL)
- XtFree ((char *) pWS->IPData.placeList);
- if (pWS->IPData.placementRowY != NULL)
- XtFree ((char *) pWS->IPData.placementRowY);
- if (pWS->IPData.placementColX != NULL)
- XtFree ((char *) pWS->IPData.placementColX);
- }
- XtFree ((char *) pWS->name);
- XmStringFree (pWS->title);
- XtFree ((char *) pWS->ppClients);
- if (pWS->iconBoxGeometry) XtFree ((char *) pWS->iconBoxGeometry);
- XtDestroyWidget (pWS->workspaceTopLevelW);
- /*
- * Compress the list of workspaces if we're not deleting
- * the last one. (Do piece-wise to avoid overlapping copy
- * problems).
- */
- if (iNextWs > 0)
- {
- WmWorkspaceData *pWSdest;
- WmWorkspaceData *pWSsrc;
- int j;
- pWSdest = pWS;
- pWSsrc = &(pSD->pWS[iNextWs]);
- for (j=iNextWs; j < pSD->numWorkspaces; j++)
- {
- memcpy (pWSdest, pWSsrc, sizeof(WmWorkspaceData));
- if (pSD->pActiveWS == pWSsrc)
- {
- pSD->pActiveWS = pWSdest;
- }
- pWSdest++;
- pWSsrc++;
- }
- }
- /*
- * We now have one less workspace.
- */
- pSD->numWorkspaces--;
- /*
- * Update the properties that announce workspace info.
- */
- SetWorkspaceListProperty (pSD);
- SaveWorkspaceResources(pWSdest,
- (WM_RES_WORKSPACE_LIST | WM_RES_WORKSPACE_COUNT));
- dtSendWorkspaceModifyNotification(pSD, aOldId, DtWSM_REASON_DELETE);
- /*
- * Update workspace presence dialog data
- */
- UpdatePresenceWorkspaces(pSD);
- }
- } /* END OF FUNCTION DeleteWorkspace */
- /*************************************<->*************************************
- *
- * ProcessDtWmHints (pCD)
- *
- *
- * Description:
- * -----------
- * Process the _DT_WM_HINTS property on the window (if any).
- *
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- *
- * Outputs:
- * -------
- * pCD = may be changed.
- *
- *************************************<->***********************************/
- void
- ProcessDtWmHints (ClientData *pCD)
- {
- DtWmHints *pHints;
- Atom property;
- long saveFunctions;
- /*
- * Retrieve the _DT_WM_HINTS property if it exists.
- */
- property = XmInternAtom(DISPLAY, _XA_DT_WM_HINTS, False);
- if (
- (HasProperty (pCD, property))
- && (_DtWsmGetDtWmHints (DISPLAY, pCD->client, &pHints) == Success))
- {
- pCD->clientFlags |= GOT_DT_WM_HINTS;
- if (pHints->flags & DtWM_HINTS_FUNCTIONS)
- {
- if (pHints->functions & DtWM_FUNCTION_ALL)
- {
- /* client indicating inapplicable functions */
- pCD->dtwmFunctions &= ~(pHints->functions);
- }
- else
- {
- /* client indicating applicable functions */
- pCD->dtwmFunctions &= pHints->functions;
- }
- }
- if (pHints->flags & DtWM_HINTS_BEHAVIORS)
- {
- /* set applicable behaviors */
- pCD->dtwmBehaviors = pHints->behaviors;
- if (pCD->dtwmBehaviors & DtWM_BEHAVIOR_SUB_RESTORED)
- {
- /*
- * if this is a restored subpanel, remove the
- * DtWM_BEHAVIOR_SUB_RESTORED bit so the next
- * time through the subpanel will behave as an
- * existing subpanel
- */
- pHints->behaviors &= ~DtWM_BEHAVIOR_SUB_RESTORED;
- _DtWsmSetDtWmHints (DISPLAY, pCD->client, pHints);
- }
- }
- XFree ((char*)pHints);
- }
- if (pCD->dtwmBehaviors & DtWM_BEHAVIOR_PANEL)
- {
- /* put it in all workspaces */
- saveFunctions = pCD->dtwmFunctions;
- pCD->dtwmFunctions |= DtWM_FUNCTION_OCCUPY_WS;
- F_AddToAllWorkspaces (NULL, pCD, NULL);
- pCD->dtwmFunctions = saveFunctions;
- pCD->clientFlags |= FRONT_PANEL_BOX ;
- }
- } /* END OF ProcessDtWmHints */
- /*************************************<->*************************************
- *
- * GetClientWorkspaceInfo (pCD, manageFlags);
- *
- *
- * Description:
- * -----------
- * This function sets up the portion of client data that has to
- * do with workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data (only partly initialized!!)
- * manageFlags = tells us, in particular, if we're restarting.
- *
- * Outputs:
- * --------
- * pCD = updated client data
- *
- *************************************<->***********************************/
- Boolean
- GetClientWorkspaceInfo(
- ClientData *pCD,
- long manageFlags )
- {
- Atom *pIDs;
- int i;
- unsigned int numIDs = 0;
- Boolean bAll;
- /*
- * Allocate initial workspace ID list
- * fill with NULL IDs
- */
- if ((pCD->pWsList = (WsClientData *)
- XtMalloc(pCD->pSD->numWorkspaces * sizeof(WsClientData))) == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 4, "Insufficient memory for client data")));
- return (False);
- }
- pCD->currentWsc = 0;
- pCD->pWorkspaceHints = NULL;
- pCD->sizeWsList = pCD->pSD->numWorkspaces;
- pCD->numInhabited = 0; /* no valid ones yet */
- for (i = 0; i < pCD->pSD->numWorkspaces; i++)
- {
- pCD->pWsList[i].wsID = None;
- pCD->pWsList[i].iconPlace = NO_ICON_PLACE;
- pCD->pWsList[i].iconX = 0;
- pCD->pWsList[i].iconY = 0;
- pCD->pWsList[i].iconFrameWin = None;
- pCD->pWsList[i].pIconBox = NULL;
- }
- pCD->putInAll = bAll = False;
- /*
- * Determine initial workspace set.
- *
- * If this is a secondary window, use the hints from the
- * transient tree leader.
- *
- * Else if we're restarting, then use our own workspace presence.
- *
- * Else if a command line option is specified, use that.
- *
- * Else, if workspace hints are on the window, then use them.
- *
- * If none of the above work out, the window will be put into
- * the current workspace.
- */
- if (pCD->client &&
- ((pCD->transientLeader && GetLeaderPresence(pCD, &pIDs, &numIDs)) ||
- ((manageFlags & MANAGEW_WM_RESTART) &&
- GetMyOwnPresence (pCD, &pIDs, &numIDs)) ||
- (WorkspaceIsInCommand (DISPLAY, pCD, &pIDs, &numIDs)) ||
- (
- HasProperty (pCD, wmGD.xa_DT_WORKSPACE_HINTS)
- && (GetWorkspaceHints (DISPLAY, pCD->client, &pIDs, &numIDs, &bAll) ==
- Success))) &&
- numIDs)
- {
- /*
- * Got some workspace hints!
- */
- pCD->putInAll = bAll;
- ProcessWorkspaceHintList (pCD, pIDs, numIDs);
- }
- if (pCD->numInhabited == 0)
- {
- /*
- * If not in any workspaces, then put the client into
- * the current one.
- */
- PutClientIntoWorkspace (pCD->pSD->pActiveWS, pCD);
- }
- return (True);
- } /* END OF FUNCTION GetClientWorkspaceInfo */
- /*************************************<->*************************************
- *
- * WorkspaceIsInCommand (dpy, pCD, ppIDs, pNumIDs)
- *
- *
- * Description:
- * -----------
- * Determine if workspace specification is in command line for client
- *
- *
- * Inputs:
- * ------
- * dpy - pointer to display structure
- * pCD - ptr to client data
- * ppIDs - pointer for returning list of IDs
- * pNumIDs - number of IDs being returned
- *
- * Outputs:
- * -------
- * ppIDs - returned list of IDs
- * pNumIDs - number of IDs being returned
- *
- * Return - True if workspace option found, false otherwise
- *
- *
- * Comments:
- * --------
- * Malloc's memory that must be freed
- *
- *************************************<->***********************************/
- Boolean
- WorkspaceIsInCommand(
- Display *dpy,
- ClientData *pCD,
- WorkspaceID **ppIDs,
- unsigned int *pNumIDs )
- {
- int wmcArgc;
- char **wmcArgv = NULL;
- Boolean rval = False;
- unsigned char *pch = NULL;
- XTextProperty clientMachineProp;
- if (FindClientDBMatch(pCD, (char **)&pch))
- {
- if (pch)
- {
- if (ConvertNamesToIDs (pCD->pSD, pch, ppIDs, pNumIDs))
- {
- rval = True;
- }
- XtFree((char *)pch);
- }
- }
- else if (HasProperty (pCD, XA_WM_COMMAND) &&
- XGetCommand (dpy, pCD->client, &wmcArgv, &wmcArgc) &&
- (wmcArgv != NULL))
- {
- if (pCD->pSD->remainingSessionItems)
- {
- if(!(XGetWMClientMachine(dpy, pCD->client, &clientMachineProp)))
- {
- clientMachineProp.value = NULL;
- }
- if (FindDtSessionMatch(wmcArgc, wmcArgv, pCD, pCD->pSD,
- (char **)&pch,
- (char *)clientMachineProp.value))
- {
- /*
- * If we found a match to a client description
- * in the DtSessionHints, use the information from
- * the Hints instead of the command line
- */
- if (pch)
- {
- if (ConvertNamesToIDs (pCD->pSD, pch, ppIDs, pNumIDs))
- {
- rval = True;
- }
- /*
- * free malloced memory containing workspace list
- */
- XtFree ((char *)pch);
- }
-
- }
- if (clientMachineProp.value)
- {
- XFree ((char*)clientMachineProp.value);
- }
- }
- if (!rval && FindWsNameInCommand (wmcArgc, wmcArgv, &pch))
- {
- if (ConvertNamesToIDs (pCD->pSD, pch, ppIDs, pNumIDs))
- {
- rval = True;
- }
- }
- if (wmcArgv != NULL)
- {
- XFreeStringList (wmcArgv);
- }
- }
- return (rval);
- } /* END OF FUNCTION WorkspaceIsInCommand */
- /*************************************<->*************************************
- *
- * ConvertNamesToIDs (pSD, pch, ppAtoms, pNumAtoms)
- *
- *
- * Description:
- * -----------
- * Takes a string containing a list of names separated by white space
- * and converts it to a list of workspace IDs.
- *
- * Inputs:
- * ------
- * pSD - pointer to screen data
- * pchIn - pointer to original string
- * ppAtoms - pointer to an atom pointer (for returning list pointer)
- * pNumAtoms - pointer to the number of atoms being returned.
- *
- * Outputs:
- * -------
- * *ppAtoms - points to a list of atoms returned.
- * *pNumAtoms - the number of atoms being returned.
- *
- * Return - True if some Atoms are being returned
- *
- * Comments:
- * --------
- * Processes local copy of string so that pch is not modified.
- *
- * The list of atoms returned has been dynamically allocated.
- * Please XtFree() it when you're done.
- *
- *************************************<->***********************************/
- Boolean
- ConvertNamesToIDs(
- WmScreenData *pSD,
- unsigned char *pchIn,
- WorkspaceID **ppAtoms,
- unsigned int *pNumAtoms )
- {
- unsigned char *pchLocal, *pch, *pchName;
- int num = 0;
- int numLocalIDs;
- WorkspaceID *pLocalIDs;
- if ((pLocalIDs = (WorkspaceID *) XtMalloc (WS_ALLOC_AMOUNT *
- sizeof(WorkspaceID))) == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 5, "Insufficient Memory (ConvertNamesToIDs)")));
- ExitWM (WM_ERROR_EXIT_VALUE);
- }
- numLocalIDs = WS_ALLOC_AMOUNT;
- if (pchIn && (pchLocal = (unsigned char *) XtMalloc(1+strlen((char *)pchIn))))
- {
- strcpy ((char *)pchLocal, (char *)pchIn);
- pch = pchLocal;
- while ((pchName = GetSmartString (&pch)))
- {
- int iwsx;
- XmString xms;
- /*
- * Check workspace for workspace titles; map to
- * workspace names.
- */
- xms = XmStringCreateLocalized ((char *)pchName);
- for (iwsx = 0; iwsx < pSD->numWorkspaces; iwsx++)
- {
- if (XmStringCompare (xms, pSD->pWS[iwsx].title))
- {
- break;
- }
- }
- XmStringFree (xms);
- if (iwsx < pSD->numWorkspaces)
- {
- /*
- * Found a workspace title we've got,
- * use id for workspace name
- */
- pLocalIDs[num] = pSD->pWS[iwsx].id;
- num++;
- }
- else
- {
- /*
- * Try for match on workspace name
- */
- pLocalIDs[num] = (WorkspaceID)
- XInternAtom (DISPLAY, (char *)pchName, False);
- num++;
- }
- if (num >= numLocalIDs)
- {
- /* list too small */
- numLocalIDs += WS_ALLOC_AMOUNT;
- if ((pLocalIDs = (WorkspaceID *) XtRealloc ((char *)pLocalIDs,
- numLocalIDs * sizeof(WorkspaceID))) == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 6, "Insufficient Memory (ConvertNamesToIDs)")));
- ExitWM (WM_ERROR_EXIT_VALUE);
- }
- }
- }
- XtFree ((char *)pchLocal);
- }
- *ppAtoms = pLocalIDs;
- *pNumAtoms = num;
- return (num != 0);
-
- } /* END OF FUNCTION ConvertNamesToIDs */
- /*************************************<->*************************************
- *
- * CheckForPutInAllRequest (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * Tests for the presence of the "all" atom in the atom list
- * and sets the "putInAll" flag on the client.
- *
- * Inputs:
- * ------
- * pCD - pointer to client data
- * pIDs - pointer to ID list
- * numIDs - number of IDs in list
- *
- * Outputs:
- * -------
- * pCD - putInAll member may be set
- *
- *************************************<->***********************************/
- void
- CheckForPutInAllRequest(
- ClientData *pCD,
- Atom *pIDs,
- unsigned int numIDs )
- {
- unsigned int i;
- for (i = 0; (i < numIDs) && !(pCD->putInAll); i++)
- {
- if (pIDs[i] == wmGD.xa_ALL_WORKSPACES)
- {
- pCD->putInAll = True;
- break;
- }
- }
-
- } /* END OF FUNCTION CheckForPutInAllRequest */
- /*************************************<->*************************************
- *
- * FindWsNameInCommand (argc, argv, ppch)
- *
- *
- * Description:
- * -----------
- * Finds and returns the workspace name option in the command line
- * (if any)
- *
- * Inputs:
- * ------
- * argc - argument count
- * argv - argument list
- * ppch - string pointer to return
- *
- *
- * Outputs:
- * -------
- * *ppch - points to ws name (if found)
- *
- * Return - True if wsname found
- *
- *
- * Comments:
- * --------
- *************************************<->***********************************/
- Boolean
- FindWsNameInCommand(
- int argc,
- char *argv[],
- unsigned char **ppch )
- {
- #define XRM_OPT "-xrm"
- #define WSLIST "*workspaceList:"
- #define WSLIST_LEN 14
- int i = 1;
- Boolean rval = False;
- unsigned char *pch, *pchTmp, *pch0;
- unsigned char *pchRes, *pchValue;
-
- if (argc > 0)
- {
- while (--argc && !rval)
- {
- if (!strcmp(argv[i], XRM_OPT) && (argc > 1))
- {
- /*
- * found "-xrm", now look at resource spec
- */
- pch0 = (unsigned char *) strdup (argv[i+1]);
- if (!pch0)
- {
- Warning (((char *)GETMESSAGE(76, 7, "Insufficient memory")));
- ExitWM (WM_ERROR_EXIT_VALUE);
- }
- pch = pch0;
- /* strip off quotes ,
- * separate two halve of resource spec
- */
- pchRes = GetSmartString (&pch);
- pchValue = pch;
- if ((*pchRes) && (*pch))
- {
- /* Erase colon at end of resource name */
- pch = (unsigned char *) strrchr((char *)pchRes, ':');
- if (pch)
- {
- *pch = '\0';
- }
- /* find beginning of last component of resource
- * spec
- */
- pch = (unsigned char *) strrchr ((char *)pchRes, '*');
- pchTmp = (unsigned char *) strrchr ((char *)pchRes, '.');
- if (pchTmp > pch)
- {
- pch = pchTmp;
- }
- if (pch && *pch && *(pch+1))
- {
- pch += 1;
- }
- /* compare resource with our resource */
- if ( (!strcmp ((char *)pch, WmNworkspaceList)) ||
- (!strcmp ((char *)pch, WmCWorkspaceList)))
- {
- /* match, compute return position in
- passed in string */
- *ppch = (unsigned char *)
- (argv[i+1] + (pchValue - pch0));
- rval = True;
- XtFree ((char *)pch0);
- pch0 = NULL;
- }
- }
- i++; /* skip next arg */
- argc--;
- if (pch0)
- {
- XtFree ((char *)pch0);
- }
- }
- i++;
- }
- }
- return (rval);
- } /* END OF FUNCTION FindWsNameInCommand */
- /*************************************<->*************************************
- *
- * PutClientIntoWorkspace (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * This function updates the data for the client and workspace to
- * reflect the presence of the client in the workspace.
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- * pCD = pointer to client data
- *
- * Outputs:
- * --------
- *
- *************************************<->***********************************/
- void
- PutClientIntoWorkspace(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- int i = pCD->numInhabited;
- int iAdded, j, k;
- /* insure the client's got enough workspace data */
- if (pCD->sizeWsList < pCD->pSD->numWorkspaces)
- {
- iAdded = pCD->pSD->numWorkspaces - pCD->sizeWsList;
- pCD->sizeWsList = pCD->pSD->numWorkspaces;
- pCD->pWsList = (WsClientData *)
- XtRealloc((char *)pCD->pWsList,
- (pCD->pSD->numWorkspaces * sizeof(WsClientData)));
- /* intialized new data */
- j = pCD->sizeWsList - 1;
- for (j=1; j <= iAdded; j++)
- {
- k = pCD->sizeWsList - j;
- pCD->pWsList[k].iconPlace = NO_ICON_PLACE;
- pCD->pWsList[k].iconX = 0;
- pCD->pWsList[k].iconY = 0;
- pCD->pWsList[k].iconFrameWin = (Window) 0;
- pCD->pWsList[k].pIconBox = NULL;
- }
- }
- /* update the client's list of workspace data */
- pCD->pWsList[i].wsID = pWS->id;
- pCD->numInhabited++;
- if (!(pCD->clientFlags & WM_INITIALIZATION))
- {
- /*
- * Make sure there's an icon
- * (Don't do this during initialization, the pCD not
- * ready for icon making yet).
- */
- InsureIconForWorkspace (pWS, pCD);
- }
- /* update the workspace list of clients */
- AddClientToWsList (pWS, pCD);
- } /* END OF FUNCTION PutClientIntoWorkspace */
- /*************************************<->*************************************
- *
- * TakeClientOutOfWorkspace (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * This function updates the data for the client and the workspace
- * to reflect the removal of the client from the workspace.
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- * pCD = pointer to client data
- *
- * Outputs:
- * --------
- *
- *************************************<->***********************************/
- void
- TakeClientOutOfWorkspace(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- int ixA;
- Boolean Copying = False;
- WsClientData *pWsc;
- if (pWS && pCD && ClientInWorkspace(pWS, pCD))
- {
- /*
- * Clean up icon
- */
- if (!pCD->transientLeader)
- {
- pWsc = GetWsClientData (pWS, pCD);
- if ((pCD->pSD->useIconBox) &&
- (pWsc->pIconBox) &&
- (pCD->clientFunctions & MWM_FUNC_MINIMIZE))
- {
- DeleteIconFromBox (pWS->pIconBox, pCD);
- }
- else if (wmGD.iconAutoPlace)
- {
- /*
- * Free up root icon spot
- */
- if ((pWsc->iconPlace != NO_ICON_PLACE) &&
- (pWS->IPData.placeList[pWsc->iconPlace].pCD == pCD))
- {
- pWS->IPData.placeList[pWsc->iconPlace].pCD = NULL;
- pWsc->iconPlace = NO_ICON_PLACE;
- }
- }
- }
- /*
- * Remove the selected workspace and copy the remaining ones
- * up. (Do piece-wise to avoid overlapping copy.)
- */
- for (ixA = 0; ixA < pCD->numInhabited; ixA++)
- {
- if (Copying)
- {
- memcpy (&pCD->pWsList[ixA-1], &pCD->pWsList[ixA],
- sizeof(WsClientData));
- }
- else if (pCD->pWsList[ixA].wsID == pWS->id)
- {
- /*
- * This is the one we're removing, start copying here.
- */
- Copying = True;
- }
- }
- /*
- * Decrement the number of workspaces inhabited.
- */
- pCD->numInhabited--;
- /* update the workspaces list of clients */
- RemoveClientFromWsList (pWS, pCD);
- }
- #ifdef DEBUG
- else
- {
- Warning("TakeClientOutOfWorkspace: null workspace passed in.");
- }
- #endif /* DEBUG */
- } /* END OF FUNCTION TakeClientOutOfWorkspace */
- /*************************************<->*************************************
- *
- * GetWorkspaceData (pSD, wsID)
- *
- *
- * Description:
- * -----------
- * This function finds the data that is associated with a workspace ID.
- *
- * Inputs:
- * ------
- * pSD = pointer to screen data
- * wsID = workspace ID
- *
- * Outputs:
- * --------
- * Function returns a pointer to the workspace data if successful,
- * or NULL if unsuccessful.
- *
- *************************************<->***********************************/
- WmWorkspaceData *
- GetWorkspaceData(
- WmScreenData *pSD,
- WorkspaceID wsID )
- {
- WmWorkspaceData *pWS = NULL;
- int i;
- for (i=0; i < pSD->numWorkspaces; i++)
- {
- if (pSD->pWS[i].id == wsID)
- {
- pWS = &pSD->pWS[i];
- break;
- }
- }
- #ifdef DEBUG
- if (!pWS)
- {
- /* failed to find one */
- Warning ("Failed to find workspace data");
- }
- #endif
- return (pWS);
- } /* END OF FUNCTION GetWorkspaceData */
- /*************************************<->*************************************
- *
- * GenerateWorkspaceName (pSD, wsnum)
- *
- *
- * Description:
- * -----------
- * This function generates and returns a workspace string name from
- * a small number passed in.
- *
- * Inputs:
- * ------
- * pSD = pointer to screen data
- * wsNum = number for workspace
- *
- *
- * Outputs:
- * -------
- * returns pointer to statically allocated data. You must copy it
- * to your local buffer.
- *
- * Comments:
- * ---------
- * Name is of the form ws<n> where <n> is a number.
- *
- *************************************<->***********************************/
- unsigned char *
- GenerateWorkspaceName(
- WmScreenData *pSD,
- int wsnum )
- {
- static unsigned char nameReturned[13];
- int i, j;
- /*
- * Nice n-squared algorithm...
- * (This should be OK for small number of workspaces)
- */
- for (i=0; i <= pSD->numWorkspaces; i++)
- {
- /* generate a name */
- sprintf ((char *)nameReturned, "ws%d", i);
- if (!DuplicateWorkspaceName (pSD, nameReturned, wsnum))
- break;
- }
- return (nameReturned);
- } /* END OF FUNCTION GenerateWorkspaceName */
- /*************************************<->*************************************
- *
- * InWindowList (w, wl, num)
- *
- *
- * Description:
- * -----------
- * This function determines if a window is in a list of windows
- *
- * Inputs:
- * ------
- * w = window of interest
- * wl = list of windows
- * num = number of windows in wl
- *
- *
- * Outputs:
- * -------
- * The function returns "True" if "w" appears in "wl"
- *
- *************************************<->***********************************/
- Boolean
- InWindowList(
- Window w,
- Window wl[],
- int num )
- {
- int i;
- Boolean rval = False;
- for (i = 0; (i < num) && !rval; i++)
- {
- if (w == wl[i])
- {
- rval = True;
- }
- }
- return (rval);
- } /* END OF FUNCTION InWindowList */
- /*************************************<->*************************************
- *
- * ClientInWorkspace (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * This function determines if a client is in a workspace
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- * The function returns "True" if client pCD is in workspace pWS
- *
- *************************************<->***********************************/
- Boolean
- ClientInWorkspace(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- int i;
- Boolean rval = False;
- for (i = 0; (i < pCD->numInhabited) && !rval; i++)
- {
- if (pWS->id == pCD->pWsList[i].wsID)
- {
- rval = True;
- }
- }
- return (rval);
- } /* END OF FUNCTION ClientInWorkspace */
- /*************************************<->*************************************
- *
- * GetWsClientData (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * This function returns a pointer to the client's specific data for
- * this workspace
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- * The function returns a pointer to the client's data for this
- * workspace. If the client isn't in the workspace, an error is
- * printed and the first datum in the workspace list is returned.
- *
- *************************************<->***********************************/
- WsClientData *
- GetWsClientData(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- int i;
- WsClientData *pWsc = NULL;
- for (i = 0; (i < pCD->numInhabited) && !pWsc; i++)
- {
- if (pWS->id == pCD->pWsList[i].wsID)
- {
- pWsc = &pCD->pWsList[i];
- }
- }
- if (!pWsc)
- {
- pWsc = &pCD->pWsList[0];
- }
- return (pWsc);
- } /* END OF FUNCTION GetWsClientData */
- /*************************************<->*************************************
- *
- * SetClientWsIndex (pCD)
- *
- *
- * Description:
- * -----------
- * This function sets the index into the client's array of workspace
- * specific data. This index points to the data to be used for the
- * currently active workspace.
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- * The function returns an index as described above. If the client is
- * not in the currently active workspace, then the index returned is 0.
- *
- *************************************<->***********************************/
- void
- SetClientWsIndex(
- ClientData *pCD )
- {
- int i;
- WmWorkspaceData *pWS = pCD->pSD->pActiveWS;
- for (i = 0; (i < pCD->numInhabited); i++)
- {
- if (pWS->id == pCD->pWsList[i].wsID)
- {
- break;
- }
- }
- if (i >= pCD->numInhabited)
- {
- i = 0;
- }
- pCD->currentWsc = i;
- } /* END OF FUNCTION SetClientWsIndex */
- /*************************************<->*************************************
- *
- * ProcessWmWorkspaceHints (pCD)
- *
- *
- * Description:
- * -----------
- * This function processes a change to the _DT_WORKSPACE_HINTS property
- * on a window that we manage.
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- * Returns False if we ran out of memory or no hints.
- * Returns True on success.
- *
- *************************************<->***********************************/
- Boolean
- ProcessWorkspaceHints(
- ClientData *pCD )
- {
- Atom *pIDs;
- int i, j;
- unsigned int numIDs;
- WmScreenData *pSD = PSD_FOR_CLIENT(pCD);
- Boolean rval = False;
- Boolean InBoth;
- Boolean bAll;
- int numOld;
- WorkspaceID *pDiff = NULL;
- int numDiff;
- numOld = pCD->numInhabited;
- ReserveIdListSpace (numOld);
- for (i = 0; i < numOld; i++)
- {
- pResIDs[i] = pCD->pWsList[i].wsID;
- }
- if ((pCD->client) &&
- (GetWorkspaceHints (DISPLAY, pCD->client,
- &pIDs, &numIDs, &bAll) == Success) &&
- (bAll || (numIDs && (pDiff = (WorkspaceID *)
- XtMalloc (sizeof(WorkspaceID) * MAX(numIDs, numOld))))))
- {
- /*
- * Process request to put window in all workspaces
- */
- pCD->putInAll = bAll;
- CheckForPutInAllRequest (pCD, pIDs, numIDs);
- if (!pCD->putInAll)
- {
- /*
- * Compute the ids to be removed.
- */
- numDiff = 0;
- for (i=0; i < numOld; i++)
- {
- InBoth = False;
- for (j=0; j < numIDs; j++)
- {
- if (pIDs[j] == pResIDs[i])
- {
- InBoth = True;
- break;
- }
- }
- if (!InBoth)
- {
- pDiff[numDiff++] = pResIDs[i];
- }
- }
- /*
- * Remove the client from the set of workspaces
- */
- if (numDiff)
- {
- RemoveClientFromWorkspaces (pCD, pDiff, numDiff);
- }
- }
- /*
- * Process request to put window in all workspaces
- */
- if (pCD->putInAll)
- {
- for (i=0; i<pCD->pSD->numWorkspaces; i++)
- {
- if (!ClientInWorkspace(&pCD->pSD->pWS[i], pCD))
- {
- AddClientToWorkspaces (pCD, &pCD->pSD->pWS[i].id, 1);
- }
- }
- }
- else
- {
- /*
- * Compute the ids to be added.
- */
- numDiff = 0;
- for (i=0; i < numIDs; i++)
- {
- InBoth = False;
- for (j=0; j < numOld; j++)
- {
- if (pResIDs[j] == pIDs[i])
- {
- InBoth = True;
- break;
- }
- }
- if (!InBoth)
- {
- pDiff[numDiff++] = pIDs[i];
- }
- }
- /*
- * Add the client to the set of workspaces
- */
- if (numDiff)
- {
- AddClientToWorkspaces (pCD, pDiff, numDiff);
- }
- }
- /*
- * If the client is not in any workspaces, then
- * put it in the current one
- *
- * !!! Is this right? !!!
- */
- if (pCD->numInhabited == 0)
- {
- AddClientToWorkspaces (pCD, &pSD->pActiveWS->id, 1);
- }
- /*
- * Free up the old list of hints
- */
- if (pCD->pWorkspaceHints)
- {
- XFree ((char *)pCD->pWorkspaceHints);
- }
- if (pDiff)
- {
- XtFree ((char *)pDiff);
- }
- /*
- * Save the new hints
- */
- pCD->pWorkspaceHints = pIDs;
- pCD->numWorkspaceHints = numIDs;
- /*
- * Update the presence property
- */
- UpdateWorkspacePresenceProperty (pCD);
- rval = True;
- }
- return (rval);
- } /* END OF FUNCTION ProcessWorkspaceHints */
- /*************************************<->*************************************
- *
- * InsureUniqueWorkspaceHints (pCD)
- *
- *
- * Description:
- * -----------
- * This function processes the workspace hints and removes duplicates.
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- * May modify *pWorkspaceHints and numWorkspaceHints
- *
- *************************************<->***********************************/
- static void
- InsureUniqueWorkspaceHints(
- ClientData *pCD )
- {
- int next, trail, i;
- WorkspaceID *pID;
- Boolean duplicate;
- if (pCD->numWorkspaceHints < 2) return;
- pID = pCD->pWorkspaceHints;
- trail = 0;
- next = 1;
- while (next < pCD->numWorkspaceHints)
- {
- duplicate = False;
- for (i = 0; i < next; i++)
- {
- if (pID [next] == pID [i])
- {
- /* duplicate found! */
- duplicate = True;
- break;
- }
- }
- if (duplicate)
- {
- /* skip duplicates */
- next++;
- }
- else
- {
- /* not a duplicate */
- trail++;
- if (next > trail)
- {
- /*
- * We need to copy up over an old duplicate
- */
- pID [trail] = pID [next];
- }
- }
- next++;
- }
- pCD->numWorkspaceHints = trail+1;
- } /* END OF FUNCTION InsureUniqueWorkspaceHints */
- /*************************************<->*************************************
- *
- * ProcessWorkspaceHintList (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function processes a list of workspace hints for a client.
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of IDs in the list
- *
- * Outputs:
- * -------
- *
- *************************************<->***********************************/
- void
- ProcessWorkspaceHintList(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- int i;
- WmWorkspaceData *pWS;
- if (numIDs > 0)
- {
- /*
- * Keep these hints; make sure there are no duplicate
- * workspace requests.
- */
- pCD->pWorkspaceHints = pIDs;
- pCD->numWorkspaceHints = numIDs;
- InsureUniqueWorkspaceHints (pCD);
- numIDs = pCD->numWorkspaceHints;
- if (pCD->pWorkspaceHints)
- {
- /*
- * Process request to put window in all workspaces
- */
- CheckForPutInAllRequest (pCD, pIDs, numIDs);
- if (pCD->putInAll)
- {
- for (i=0; i<pCD->pSD->numWorkspaces; i++)
- {
- PutClientIntoWorkspace (&pCD->pSD->pWS[i], pCD);
- }
- }
- else
- {
- for (i=0; i<numIDs; i++)
- {
- /*
- * Put the client into requested workspaces that
- * exist.
- */
- if ((pWS = GetWorkspaceData (pCD->pSD,
- pCD->pWorkspaceHints[i])))
- {
- PutClientIntoWorkspace (pWS, pCD);
- }
- }
- }
- }
- }
- } /* END OF FUNCTION ProcessWorkspaceHintList */
- /*************************************<->*************************************
- *
- * RemoveSingleClientFromWorkspaces (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function removes a single client from a list of workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Outputs:
- * -------
- *
- *************************************<->***********************************/
- void
- RemoveSingleClientFromWorkspaces(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- int i;
- WmWorkspaceData *pWS;
- for (i=0; i < numIDs; i++)
- {
- /*
- * Remove the client from the specified workspaces
- */
- if ((pWS = GetWorkspaceData (pCD->pSD, pIDs[i])) &&
- (ClientInWorkspace (pWS, pCD)))
- {
- /*
- * If this workspace is active, then make the
- * window unseen. We only need to call
- * SetClientState on the main window, the
- * transients will get taken care of in there.
- */
- if ((pWS == pCD->pSD->pActiveWS) &&
- (pCD->transientLeader == NULL) &&
- !(pCD->clientState & UNSEEN_STATE))
- {
- SetClientState (pCD,
- (pCD->clientState | UNSEEN_STATE), CurrentTime);
- }
- TakeClientOutOfWorkspace (pWS, pCD);
- /*
- * Update the presence property
- */
- UpdateWorkspacePresenceProperty (pCD);
- }
- }
- } /* END OF FUNCTION RemoveSingleClientFromWorkspaces */
- /*************************************<->*************************************
- *
- * RemoveSubtreeFromWorkspaces (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function removes a transient subtree from a list of workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Outputs:
- * -------
- *
- *************************************<->***********************************/
- void
- RemoveSubtreeFromWorkspaces(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- ClientData *pNext;
- pNext = pCD->transientChildren;
- while (pNext)
- {
- /* process all children first */
- if (pNext->transientChildren)
- {
- RemoveSubtreeFromWorkspaces (pNext, pIDs, numIDs);
- }
- else
- {
- RemoveSingleClientFromWorkspaces (pNext, pIDs, numIDs);
- }
- pNext = pNext->transientSiblings;
- }
- /* process the primary window */
- RemoveSingleClientFromWorkspaces (pCD, pIDs, numIDs);
- } /* END OF FUNCTION RemoveSubtreeFromWorkspaces */
- /******************************<->*************************************
- *
- * pIDs = GetListOfOccupiedWorkspaces (pCD, numIDs)
- *
- *
- * Description:
- * -----------
- * This function creates a list of occupied workspaces of a particular
- * client, EXCLUDING the current workspace.
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Comment
- * -------
- * memory for pIDs is allocated with XtMalloc and should be
- * freed with XtFree.
- *
- *
- ******************************<->***********************************/
- WorkspaceID *
- GetListOfOccupiedWorkspaces(
- ClientData *pCD,
- int *numIDs )
- {
- int i;
- WorkspaceID *pLocalIDs = NULL;
- WorkspaceID activeWsID = pCD->pSD->pActiveWS->id;
- *numIDs = 0;
- if ((pLocalIDs = (WorkspaceID *) XtMalloc (pCD->numInhabited *
- sizeof(WorkspaceID))) == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 7, "Insufficient memory")));
- return (NULL);
- }
- for (i = 0; i < pCD->numInhabited; i++)
- {
- if (activeWsID != pCD->pWsList[i].wsID)
- {
- pLocalIDs[(*numIDs)++] = pCD->pWsList[i].wsID;
- }
- }
- return(pLocalIDs);
- } /* END OF FUNCTION GetListOfOccupiedWorkspaces */
- /******************************<->*************************************
- *
- * HonorAbsentMapBehavior(pCD)
- *
- *
- * Description:
- * -----------
- * This function adds a client to the current workspace and
- * if (pCD->absentMapBehavior == AMAP_BEHAVIOR_MOVE)
- * removes the client from the other workspaces
- *
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- *
- * Outputs:
- * -------
- *
- ******************************<->***********************************/
- void
- HonorAbsentMapBehavior(
- ClientData *pCD)
- {
- int inWorkspace = 0;
- if (pCD->absentMapBehavior == AMAP_BEHAVIOR_MOVE)
- {
- int wsCnt;
- /*
- * Remove from other workspaces
- */
- for (wsCnt = 0; wsCnt < pCD->numInhabited; wsCnt = inWorkspace)
- {
- if (pCD->pWsList[wsCnt].wsID != pCD->pSD->pActiveWS->id)
- {
- RemoveClientFromWorkspaces (pCD,
- &pCD->pWsList[wsCnt].wsID, 1);
- }
- else inWorkspace++;
- }
- }
- if (inWorkspace == 0)
- AddClientToWorkspaces (pCD, &ACTIVE_WS->id, 1);
- } /* END OF FUNCTION HonorAbsentMapBehavior */
- /******************************<->*************************************
- *
- * RemoveClientFromWorkspaces (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function removes a client from a list of workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Outputs:
- * -------
- *
- ******************************<->***********************************/
- void
- RemoveClientFromWorkspaces(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- ClientData *pcdLeader;
- pcdLeader = (pCD->transientLeader) ? FindTransientTreeLeader (pCD) : pCD;
- RemoveSubtreeFromWorkspaces (pcdLeader, pIDs, numIDs);
- } /* END OF FUNCTION RemoveClientFromWorkspaces */
- /*************************************<->*************************************
- *
- * AddSingleClientToWorkspaces (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function adds a single client to a list of workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Outputs:
- * -------
- *
- *************************************<->***********************************/
- void
- AddSingleClientToWorkspaces(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- int i;
- WmWorkspaceData *pWS;
- for (i=0; i < numIDs; i++)
- {
- /*
- * Add the client to the specified workspaces if
- * it is not already there.
- */
- if ((pWS = GetWorkspaceData (pCD->pSD, pIDs[i])) &&
- (!ClientInWorkspace (pWS, pCD)))
- {
- PutClientIntoWorkspace (pWS, pCD);
- if ((pWS == PSD_FOR_CLIENT(pCD)->pActiveWS) &&
- (pCD->transientLeader == NULL) &&
- (pCD->clientState & UNSEEN_STATE))
- {
- SetClientState (pCD,
- (pCD->clientState & ~UNSEEN_STATE), CurrentTime);
- }
- /*
- * Update the presence property (only on transient leader)
- */
- UpdateWorkspacePresenceProperty (pCD);
- }
- }
- } /* END OF FUNCTION AddSingleClientToWorkspace */
- /*************************************<->*************************************
- *
- * AddSubtreeToWorkspaces (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function adds a client subtree to a list of workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data (head of subtree)
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Outputs:
- * -------
- *
- *************************************<->***********************************/
- void
- AddSubtreeToWorkspaces(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- ClientData *pNext;
- pNext = pCD->transientChildren;
- while (pNext)
- {
- /* process all children first */
- if (pNext->transientChildren)
- {
- AddSubtreeToWorkspaces (pNext, pIDs, numIDs);
- }
- else
- {
- AddSingleClientToWorkspaces (pNext, pIDs, numIDs);
- }
- pNext = pNext->transientSiblings;
- }
- /* process the primary window */
- AddSingleClientToWorkspaces (pCD, pIDs, numIDs);
- } /* END OF FUNCTION AddSubtreeToWorkspaces */
- /*************************************<->*************************************
- *
- * AddClientToWorkspaces (pCD, pIDs, numIDs)
- *
- *
- * Description:
- * -----------
- * This function adds a transient tree to a list of workspaces
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pIDs = pointer to a list of workspace IDs
- * numIDs = number of workspace IDs
- *
- * Outputs:
- * -------
- *
- *************************************<->***********************************/
- void
- AddClientToWorkspaces(
- ClientData *pCD,
- WorkspaceID *pIDs,
- unsigned int numIDs )
- {
- ClientData *pcdLeader;
- pcdLeader = (pCD->transientLeader) ? FindTransientTreeLeader (pCD) : pCD;
- AddSubtreeToWorkspaces (pcdLeader, pIDs, numIDs);
- } /* END OF FUNCTION AddClientToWorkspaces */
- /*************************************<->*************************************
- *
- * AddClientToWsList (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * This function adds a client to a list of clients in a workspace
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pWS = pointer to workspace data
- *
- * Outputs:
- * -------
- * none
- *
- *************************************<->***********************************/
- void
- AddClientToWsList(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- if (pWS->numClients >= pWS->sizeClientList)
- {
- if (pWS->sizeClientList == 0)
- {
- pWS->ppClients = (ClientData **)
- XtMalloc (WINDOW_ALLOC_AMOUNT * sizeof(ClientData *));
- }
- else
- {
- pWS->ppClients = (ClientData **)
- XtRealloc ((char *)pWS->ppClients,
- (pWS->sizeClientList + WINDOW_ALLOC_AMOUNT) *
- sizeof(ClientData *));
- }
- if (!pWS->ppClients)
- {
- Warning (((char *)GETMESSAGE(76, 9, "Insufficient memory to add window to workspace")));
- ExitWM(WM_ERROR_EXIT_VALUE);
- }
- pWS->sizeClientList += WINDOW_ALLOC_AMOUNT;
- }
- if (pWS->numClients < pWS->sizeClientList)
- {
- pWS->ppClients[pWS->numClients] = pCD;
- pWS->numClients++;
- }
- } /* END OF FUNCTION AddClientToWsList */
- /*************************************<->*************************************
- *
- * RemoveClientFromWsList (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * This function removes a client from a list of clients in a workspace
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * pWS = pointer to workspace data
- *
- * Outputs:
- * -------
- * none
- *
- *************************************<->***********************************/
- void
- RemoveClientFromWsList(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- int src, dest;
- for (dest = 0; dest < pWS->numClients; dest++)
- {
- if (pWS->ppClients[dest] == pCD)
- {
- break;
- }
- }
- for (src = dest+1; src < pWS->numClients; src++, dest++)
- {
- pWS->ppClients[dest] = pWS->ppClients[src];
- }
- pWS->numClients--;
- } /* END OF FUNCTION RemoveClientFromWsList */
- /*************************************<->*************************************
- *
- * Boolean
- * F_CreateWorkspace (args, pCD, event)
- *
- * Description:
- * -----------
- *
- * Inputs:
- * ------
- * args = ...
- * pCD = ...
- * event = ...
- *
- * Outputs:
- * -------
- * Return = ...
- *
- * Comments:
- * --------
- *
- *************************************<->***********************************/
- Boolean
- F_CreateWorkspace(
- String args,
- ClientData *pCD,
- XEvent *event )
- {
- WmScreenData *pSD = ACTIVE_PSD;
- if (pSD->numWorkspaces >= MAX_WORKSPACE_COUNT)
- {
- char buffer[MAXWMPATH];
- /*
- * At the maximum number of allowed workspaces.
- */
- sprintf (buffer,
- ((char *)GETMESSAGE(76, 14, "Maximum number of workspaces is %d. New workspace was not created.")), MAX_WORKSPACE_COUNT);
- Warning (buffer);
- }
- else
- {
- CreateWorkspace (ACTIVE_PSD, (unsigned char *)args);
- }
- return (TRUE);
- } /* END OF FUNCTION F_CreateWorkspace */
- /*************************************<->*************************************
- *
- * Boolean
- * F_DeleteWorkspace (args, pCD, event)
- *
- * Description:
- * -----------
- *
- * Inputs:
- * ------
- * args = ...
- * pCD = ...
- * event = ...
- *
- * Outputs:
- * -------
- * Return = ...
- *
- * Comments:
- * --------
- *
- *************************************<->***********************************/
- Boolean
- F_DeleteWorkspace(
- String args,
- ClientData *pCD,
- XEvent *event )
- {
- WmScreenData *pSD = ACTIVE_PSD;
- WmWorkspaceData *pWS = NULL;
- int i;
- if (args == NULL)
- {
- pWS= ACTIVE_WS;
- }
- else
- {
- for (i=0; i<pSD->numWorkspaces; i++)
- {
- if (!strcmp(pSD->pWS[i].name, args))
- {
- pWS = &(pSD->pWS[i]);
- break;
- }
- }
- }
- if (pWS)
- DeleteWorkspace (pWS);
- return (TRUE);
- } /* END OF FUNCTION F_DeleteWorkspace */
- /*************************************<->*************************************
- *
- * Boolean
- * F_GotoWorkspace (args, pCD, event)
- *
- * Description:
- * -----------
- *
- * Inputs:
- * ------
- * args = ...
- * pCD = ...
- * event = ...
- *
- * Outputs:
- * -------
- * Return = ...
- *
- * Comments:
- * --------
- *
- *************************************<->***********************************/
- Boolean
- F_GotoWorkspace(
- String args,
- ClientData *pCD,
- XEvent *event )
- {
- WorkspaceID wsID;
- WmWorkspaceData *pWS;
- wsID = XInternAtom (DISPLAY, args, False);
- pWS = GetWorkspaceData (ACTIVE_PSD, wsID);
- if (pWS)
- {
- ChangeToWorkspace (pWS);
- }
- return (TRUE);
- } /* END OF FUNCTION F_GotoWorkspace */
- /*************************************<->*************************************
- *
- * Boolean
- * F_AddToAllWorkspaces (args, pCD, event)
- *
- *
- * Description:
- * -----------
- * Puts a client into all workspaces
- *
- *
- * Inputs:
- * ------
- * args = ...
- * pCD = pointer to client data
- * event = ...
- *
- *
- * Outputs:
- * -------
- * Return = True
- *
- *
- * Comments:
- * --------
- * The list of Ids returned has been privately allocated. Copy
- * if you want to save or do anything with it.
- *
- *************************************<->***********************************/
- Boolean
- F_AddToAllWorkspaces(
- String args,
- ClientData *pCD,
- XEvent *event )
- {
- WmScreenData *pSD;
- int i;
- if (pCD && (pCD->dtwmFunctions & DtWM_FUNCTION_OCCUPY_WS))
- {
- pSD = pCD->pSD;
- ReserveIdListSpace (pSD->numWorkspaces);
- for (i = 0; i < pSD->numWorkspaces; i++)
- {
- pResIDs[i] = pSD->pWS[i].id;
- }
- AddClientToWorkspaces (pCD, pResIDs, pSD->numWorkspaces);
- pCD->putInAll = True;
- }
- return (True);
- } /* END OF FUNCTION F_AddToAllWorkspaces */
- /*************************************<->*************************************
- *
- * Boolean
- * F_Remove (args, pCD, event)
- *
- *
- * Description:
- * -----------
- * Removes a client from the current workspace
- *
- *
- * Inputs:
- * ------
- * args = ...
- * pCD = pointer to client data
- * event = ...
- *
- *
- * Outputs:
- * -------
- * Return = True
- *
- *
- * Comments:
- * --------
- *
- *************************************<->***********************************/
- Boolean
- F_Remove(
- String args,
- ClientData *pCD,
- XEvent *event )
- {
- Boolean rval = False;
- /*
- * Only remove if in more than one workspace.
- */
- if ((pCD && (pCD->dtwmFunctions & DtWM_FUNCTION_OCCUPY_WS)) &&
- (pCD->numInhabited > 1))
- {
- if (ClientInWorkspace (ACTIVE_WS, pCD))
- {
- RemoveClientFromWorkspaces (pCD, &ACTIVE_WS->id, 1);
- pCD->putInAll = False;
- }
- }
- return (rval);
- } /* END OF FUNCTION F_Remove */
- /*************************************<->*************************************
- *
- * GetCurrentWorkspaceIndex (pSD)
- *
- *
- * Description:
- * -----------
- * Returns an index into the screens array of workspace structures
- * for the current workspace.
- *
- *
- * Inputs:
- * ------
- *
- *
- * Outputs:
- * -------
- *
- *
- * Comments:
- * --------
- *************************************<->***********************************/
- int
- GetCurrentWorkspaceIndex(
- WmScreenData *pSD )
- {
- int i;
- for (i = 0 ; i < pSD->numWorkspaces; i++)
- {
- if (pSD->pWS[i].id == pSD->pActiveWS->id)
- break;
- }
- if (i >= pSD->numWorkspaces)
- {
- /* failed to find workspace!!! How did that happen??? */
- i = 0;
- #ifdef DEBUG
- Warning ("Failed to find workspace index");
- #endif /* DEBUG */
- }
- return(i);
- } /* END OF FUNCTION GetCurrentWorkspaceIndex */
- /*************************************<->*************************************
- *
- * void
- * InsureIconForWorkspace (pWS, pCD)
- *
- *
- * Description:
- * -----------
- * Makes sure an icon exists for the workspace
- *
- *
- * Inputs:
- * ------
- *
- *
- * Outputs:
- * -------
- *
- * Comments:
- * --------
- *
- *************************************<->***********************************/
- void
- InsureIconForWorkspace(
- WmWorkspaceData *pWS,
- ClientData *pCD )
- {
- WsClientData *pWsc;
- if (pCD->clientFunctions & MWM_FUNC_MINIMIZE)
- {
- pWsc = GetWsClientData (pWS, pCD);
- if ((pCD->pSD->useIconBox) &&
- (!(pCD->clientFlags & (CLIENT_WM_CLIENTS | FRONT_PANEL_BOX))))
- {
- /*
- * Create a new widget for the icon box
- */
- if (MakeIcon (pWS, pCD))
- {
- XSaveContext (DISPLAY, pWsc->iconFrameWin,
- wmGD.windowContextType, (caddr_t)pCD);
- if (pCD->iconWindow && pWsc->iconFrameWin)
- {
- XGrabButton (DISPLAY, AnyButton, AnyModifier,
- pWsc->iconFrameWin, True,
- ButtonPressMask|ButtonReleaseMask|
- ButtonMotionMask,
- GrabModeAsync, GrabModeAsync, None,
- wmGD.workspaceCursor);
- }
- ShowClientIconState (pCD, (pCD->clientState & ~UNSEEN_STATE));
- }
- }
- else
- {
- /*
- * Reuse existing icon in new workspaces. Suggest
- * icon position in current WS as position of icon
- * in new WS.
- */
- pWsc->iconFrameWin = pCD->pWsList[0].iconFrameWin;
- pWsc->iconX = ICON_X(pCD);
- pWsc->iconY = ICON_Y(pCD);
- if ((pCD->clientState & ~UNSEEN_STATE) != MINIMIZED_STATE)
- {
- pWsc->iconPlace = NO_ICON_PLACE;
- }
- else if (!wmGD.iconAutoPlace)
- {
- if (wmGD.positionIsFrame)
- {
- pWsc->iconX -= pCD->clientOffset.x;
- pWsc->iconY -= pCD->clientOffset.y;
- }
- PlaceIconOnScreen (pCD, &pWsc->iconX, &pWsc->iconY);
- }
- else /* icon auto placement */
- {
- pWsc->iconPlace =
- CvtIconPositionToPlace (&pWS->IPData,
- pWsc->iconX, pWsc->iconY);
- if (pWS->IPData.placeList[pWsc->iconPlace].pCD)
- {
- /* The spot is already occupied! Find a
- spot nearby. */
- pWsc->iconPlace =
- FindIconPlace (pCD, &pWS->IPData, pWsc->iconX,
- pWsc->iconY);
- if (pWsc->iconPlace == NO_ICON_PLACE)
- {
- /* Can't find a spot close by. Use the
- next available slot */
- pWsc->iconPlace = GetNextIconPlace (&pWS->IPData);
- if (pWsc->iconPlace == NO_ICON_PLACE)
- {
- pWsc->iconPlace =
- CvtIconPositionToPlace (&pWS->IPData,
- pCD->clientX,
- pCD->clientY);
- }
- }
- }
- CvtIconPlaceToPosition (&pWS->IPData, pWsc->iconPlace,
- &pWsc->iconX, &pWsc->iconY);
-
- if (!(pWS->IPData.placeList[pWsc->iconPlace].pCD))
- {
- pWS->IPData.placeList[pWsc->iconPlace].pCD = pCD;
- }
- }
- }
- }
- } /* END OF FUNCTION InsureIconForWorkspace */
- /*************************************<->*************************************
- *
- * Boolean
- * GetLeaderPresence (pCD, pIDs, pnumIDs)
- *
- *
- * Description:
- * -----------
- * Gets the workspace presence of the transient tree leader for a
- * client.
- *
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * ppIDs = pointer to pointer to list of workspace ids
- * pnumIDs = pointer to number of workspace ids
- *
- *
- * Outputs:
- * -------
- * *ppIDS = list of workspace IDs
- * *pnumIDs = number of workspace IDs in list
- *
- * Return = true on success
- *
- *
- * Comments:
- * --------
- * ID list is dynamically allocated, please XtFree() it when you're
- * done.
- *
- *************************************<->***********************************/
- Boolean
- GetLeaderPresence(
- ClientData *pCD,
- WorkspaceID **ppIDs,
- unsigned int *pnumIDs )
- {
- ClientData *pcdLeader;
- int i;
- Boolean rval = False;
- WorkspaceID *pLocalIDs;
- if ((pLocalIDs = (WorkspaceID *) XtMalloc (pCD->pSD->numWorkspaces *
- sizeof(WorkspaceID))) == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 10, "Insufficient Memory (GetLeaderPresence)")));
- ExitWM (WM_ERROR_EXIT_VALUE);
- }
- /*
- * Make up list of workspaces for primary window
- */
- if (pCD->transientLeader)
- {
- pcdLeader = FindTransientTreeLeader (pCD);
- for (i = 0; i < pcdLeader->numInhabited; i++)
- {
- pLocalIDs[i] = pcdLeader->pWsList[i].wsID;
- }
- *ppIDs = pLocalIDs;
- *pnumIDs = pcdLeader->numInhabited;
- rval = True;
- }
- return (rval);
- } /* END OF FUNCTION GetLeaderPresence */
- /*************************************<->*************************************
- *
- * Boolean
- * GetMyOwnPresence (pCD, pIDs, pnumIDs)
- *
- *
- * Description:
- * -----------
- * Returns the current workspace presence for the client
- *
- *
- * Inputs:
- * ------
- * pCD = pointer to client data
- * ppIDs = pointer to pointer to list of workspace ids
- * pnumIDs = pointer to number of workspace ids
- *
- *
- * Outputs:
- * -------
- * *ppIDS = list of workspace IDs
- * *pnumIDs = number of workspace IDs in list
- *
- * Return = true on success
- *
- *
- * Comments:
- * --------
- * ID list is dynamically allocated (by DtWsmGetWorkspacesOccupied).
- * Please XtFree() it when you're done.
- *
- *************************************<->***********************************/
- Boolean
- GetMyOwnPresence(
- ClientData *pCD,
- WorkspaceID **ppIDs,
- unsigned int *pnumIDs )
- {
- Boolean rval = False;
- unsigned long nIDs = (unsigned long)*pnumIDs;
- /*
- * Get the workspace presence property
- */
- if (
- HasProperty (pCD, wmGD.xa_DT_WORKSPACE_PRESENCE)
- && (DtWsmGetWorkspacesOccupied (DISPLAY, pCD->client, ppIDs,
- &nIDs) == Success))
- {
- if (nIDs)
- {
- rval = True;
- }
- }
- *pnumIDs = (unsigned int)nIDs;
- return (rval);
- } /* END OF FUNCTION GetMyOwnPresence */
- /*************************************<->*************************************
- *
- * void
- * ReserveIdListSpace (numIDs)
- *
- *
- * Description:
- * -----------
- * Insures that there is enough room in our privately allocated
- * list of workspace IDs
- *
- *
- * Inputs:
- * ------
- * numIDs = number of workspace ids
- *
- * Outputs:
- * -------
- *
- * Comments:
- * --------
- *************************************<->***********************************/
- void
- ReserveIdListSpace(
- int numIDs )
- {
- if (numResIDs == 0)
- {
- pResIDs = (WorkspaceID *)
- XtMalloc (numIDs * sizeof (WorkspaceID));
- if (pResIDs)
- {
- numResIDs = numIDs;
- }
- }
- else if (numResIDs < numIDs)
- {
- pResIDs = (WorkspaceID *) XtRealloc ((char *)pResIDs,
- numIDs * sizeof (WorkspaceID));
- numResIDs = (pResIDs)? numIDs : 0;
- }
- if (pResIDs == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 11, "Insufficient memory")));
- ExitWM (WM_ERROR_EXIT_VALUE);
- }
- } /* END OF FUNCTION ReserveIdListSpace */
- /******************************<->*************************************
- *
- * SaveResources (pSD)
- *
- * Description:
- * -----------
- * Saves dtwm resources to restore session
- *
- * Inputs:
- * ------
- * pSD = pointer to screen data
- *
- * Outputs:
- * -------
- * None
- *
- * Comments:
- * ---------
- *
- *************************************<->***********************************/
- void
- SaveResources( WmScreenData *pSD)
- {
- int wsCnt;
- WmPanelistObject pPanelist;
- if(pSD)
- {
- if (pSD->pActiveWS)
- {
- SaveWorkspaceResources(pSD->pActiveWS,
- (WM_RES_INITIAL_WORKSPACE |
- WM_RES_WORKSPACE_COUNT));
- }
- pPanelist = (WmPanelistObject) pSD->wPanelist;
- if (pPanelist && O_Shell(pPanelist))
- {
- /* This is the front panel for the screen */
- SaveWorkspaceResources(pSD->pActiveWS,
- WM_RES_FP_POSITION);
- /* Call the fronto panel function to save its resources */
-
- WmFrontPanelSessionSaveData();
- }
- for (wsCnt = 0; wsCnt < pSD->numWorkspaces; wsCnt++)
- {
- if(pSD->useIconBox)
- {
- SaveWorkspaceResources(&pSD->pWS[wsCnt],
- WM_RES_ICONBOX_GEOMETRY);
- }
- } /* for wsCnt */
- SaveHelpResources(pSD);
- } /* if pSD */
- } /* END OF FUNCTION SaveResources */
- /******************************<->*************************************
- *
- * SaveWorkspaceResource (pWS, flags)
- *
- * Description:
- * -----------
- * Modifies the RESOURCE_MANAGER property to add update versions
- * of the requested resources.
- *
- * Inputs:
- * ------
- * pWS = pointer to workspace data
- *
- * Outputs:
- * -------
- * None
- *
- * Comments:
- * ---------
- *
- *************************************<->***********************************/
- void
- SaveWorkspaceResources(
- WmWorkspaceData *pWS,
- unsigned long flags)
- {
- char *buffer = NULL;
- int bufferLength = 0;
- char *res_class;
- char *data;
- int cum_len;
- char screenName[1024];
- char tmpScreenName[10];
- Position clientX;
- Position clientY;
- Dimension clientWidth;
- Dimension clientHeight;
- int xoff, yoff;
- WmPanelistObject pPanelist = (WmPanelistObject) pWS->pSD->wPanelist;
- ClientData *pCD_Panel ;
- char tmpBuffer[MAXWMPATH+1];
- int iLen;
- /* allocate initial data space */
- if ((data = (char *) XtMalloc (MAXWMPATH+1)) == NULL)
- {
- Warning (((char *)
- GETMESSAGE(76,12,"Insufficient memory to save resources")));
- Do_Quit_Mwm (False);
- }
- cum_len = 1;
- *data = '\0';
- if (bufferLength == 0)
- {
- buffer = (char *) XtMalloc (MAXWMPATH+1);
- bufferLength = MAXWMPATH;
- }
- *buffer = '\0';
- /* Get our current resource class */
- if (MwmBehavior)
- {
- res_class = WM_RESOURCE_CLASS;
- }
- else
- {
- res_class = DT_WM_RESOURCE_CLASS;
- }
- strcpy(screenName, "*");
- strcat(screenName,XtName (pWS->pSD->screenTopLevelW));
- /* construct and write out the resources specification */
- if (flags & WM_RES_BACKDROP_IMAGE)
- {
- iLen = (strlen (res_class) + strlen (screenName) +
- strlen (pWS->name) + strlen (WmNbackdrop) +
- strlen (WmNimage) + strlen (pWS->backdrop.image) + 20);
-
- if (iLen > bufferLength)
- {
- bufferLength += iLen;
- buffer = (char *)
- XtRealloc (buffer, bufferLength * sizeof(char));
- }
- sprintf (buffer, "%s%s*%s*%s*%s: %s\n", res_class,
- screenName, pWS->name,
- WmNbackdrop, WmNimage, pWS->backdrop.image);
- AddStringToResourceData (buffer, &data, &cum_len);
- }
- if (flags & WM_RES_WORKSPACE_TITLE)
- {
- String asciiName;
- asciiName = WmXmStringToString (pWS->title);
- iLen = strlen (res_class) + strlen (screenName) +
- strlen (pWS->name) + strlen (WmNtitle) +
- strlen (asciiName) + 16;
- if (iLen > bufferLength)
- {
- bufferLength += iLen;
- buffer = (char *)
- XtRealloc (buffer, bufferLength * sizeof(char));
- }
- sprintf (buffer, "%s%s*%s*%s: %s\n", res_class,
- screenName, pWS->name,
- WmNtitle, asciiName);
- AddStringToResourceData (buffer, &data, &cum_len);
- XtFree (asciiName);
- }
- if ((flags & WM_RES_INITIAL_WORKSPACE) &&
- (!wmGD.useStandardBehavior))
- {
- iLen = strlen (res_class) + strlen (screenName) +
- strlen (WmNinitialWorkspace) + strlen (pWS->name) + 14;
- if (iLen > bufferLength)
- {
- bufferLength += iLen;
- buffer = (char *)
- XtRealloc (buffer, bufferLength * sizeof(char));
- }
- sprintf (buffer, "%s%s*%s: %s\n", res_class,
- screenName,
- WmNinitialWorkspace, pWS->name);
- AddStringToResourceData (buffer, &data, &cum_len);
- }
- if ((flags & WM_RES_WORKSPACE_LIST) &&
- (!wmGD.useStandardBehavior))
- {
- WmWorkspaceData *pWSi;
- char *pchQname;
- int i;
- pWSi = pWS->pSD->pWS;
- pchQname = (char *) _DtWmParseMakeQuotedString (
- (unsigned char *)pWSi->name);
- strcpy ((char *)wmGD.tmpBuffer, pchQname);
- XtFree (pchQname);
- pWSi++;
- for (i=1; i<pWS->pSD->numWorkspaces; i++, pWSi++)
- {
- strcat ((char *)wmGD.tmpBuffer, " ");
- pchQname = (char *) _DtWmParseMakeQuotedString (
- (unsigned char *)pWSi->name);
- strcat ((char *)wmGD.tmpBuffer, pchQname);
- XtFree (pchQname);
- }
- sprintf (buffer, "%s%s*%s: %s\n", res_class,
- screenName,
- WmNworkspaceList, wmGD.tmpBuffer);
- AddStringToResourceData (buffer, &data, &cum_len);
- }
- if ((flags & WM_RES_WORKSPACE_COUNT) &&
- (!wmGD.useStandardBehavior))
- {
- char pchNumWs[20];
- sprintf (pchNumWs, "%d", pWS->pSD->numWorkspaces);
- iLen = strlen (res_class) + strlen (screenName) +
- strlen (WmNworkspaceCount) + strlen (pchNumWs) + 14;
- if (iLen > bufferLength)
- {
- bufferLength += iLen;
- buffer = (char *)
- XtRealloc (buffer, bufferLength * sizeof(char));
- }
- sprintf (buffer, "%s%s*%s: %s\n", res_class,
- screenName,
- WmNworkspaceCount, pchNumWs);
- AddStringToResourceData (buffer, &data, &cum_len);
- }
- if ((flags & WM_RES_FP_POSITION) &&
- (O_Shell(pPanelist)) &&
- (!wmGD.useStandardBehavior) &&
- (!XFindContext (DISPLAY, XtWindow(O_Shell(pPanelist)),
- wmGD.windowContextType,
- (XtPointer)&pCD_Panel)))
- {
- Position midX, midY, tmpX, tmpY;
- Dimension screenWidth, screenHeight;
- clientX = pCD_Panel->clientX;
- clientY = pCD_Panel->clientY;
- /*
- * Determine quadrant that the front panel midpoint is
- * in and save front panel with appropriate gravity.
- */
- /* find panel midpoint */
- midX = clientX+(pCD_Panel->clientWidth >> 1);
- midY = clientY+(pCD_Panel->clientHeight >> 1);
- /* get screen dimensions */
- screenWidth = XDisplayWidth (DISPLAY, pCD_Panel->pSD->screen);
- screenHeight = XDisplayHeight (DISPLAY, pCD_Panel->pSD->screen);
- /*
- * Determine midpoint quadrant and set up client geometry
- * relative to that corner. Adjust if positionIsFrame
- * is being used.
- */
- if (midX <= (Position) screenWidth/2)
- {
- if(wmGD.positionIsFrame)
- {
- clientX -= pCD_Panel->frameInfo.upperBorderWidth;
- }
- /* West */
- if (midY <= (Position) screenHeight/2)
- {
- /* NorthWest */
- if(wmGD.positionIsFrame)
- {
- clientY -= (pCD_Panel->frameInfo.upperBorderWidth +
- pCD_Panel->frameInfo.titleBarHeight);
- }
- sprintf (tmpBuffer, "+%d+%d", clientX, clientY);
- }
- else
- {
- /* SouthWest */
- clientY = screenHeight - clientY - pCD_Panel->clientHeight;
- if(wmGD.positionIsFrame)
- {
- clientY -= pCD_Panel->frameInfo.lowerBorderWidth;
- }
- sprintf (tmpBuffer, "+%d-%d", clientX, clientY);
- }
- }
- else
- {
- clientX = screenWidth - clientX - pCD_Panel->clientWidth;
- if (wmGD.positionIsFrame)
- {
- clientX -= pCD_Panel->frameInfo.lowerBorderWidth;
- }
- /* East */
- if (midY <= (Position) screenHeight/2)
- {
- /* NorthEast */
- if(wmGD.positionIsFrame)
- {
- clientY -= (pCD_Panel->frameInfo.upperBorderWidth +
- pCD_Panel->frameInfo.titleBarHeight);
- }
- sprintf (tmpBuffer, "-%d+%d", clientX, clientY);
- }
- else
- {
- /* SouthEast */
- clientY = screenHeight - clientY - pCD_Panel->clientHeight;
- if(wmGD.positionIsFrame)
- {
- clientY -= pCD_Panel->frameInfo.lowerBorderWidth;
- }
- sprintf (tmpBuffer, "-%d-%d", clientX, clientY);
- }
- }
- iLen = strlen (res_class) + strlen (screenName) +
- strlen (XtName(O_Shell(pPanelist))) +
- strlen (WmNgeometry) + strlen (tmpBuffer) + 18;
- if (iLen > bufferLength)
- {
- bufferLength += iLen;
- buffer = (char *)
- XtRealloc (buffer, bufferLength * sizeof(char));
- }
- sprintf (buffer, "%s%s*%s*%s: %s\n", res_class,
- screenName,
- XtName (O_Shell(pPanelist)),
- WmNgeometry, tmpBuffer);
- AddStringToResourceData (buffer, &data, &cum_len);
- }
- if ((flags & WM_RES_ICONBOX_GEOMETRY) &&
- (!wmGD.useStandardBehavior))
- {
- /* update iconbox geometry string */
- if (pWS->iconBoxGeometry)
- {
- XtFree((char *) (pWS->iconBoxGeometry));
- pWS->iconBoxGeometry = NULL;
- }
- clientWidth = (pWS->pIconBox->pCD_iconBox->clientWidth -
- pWS->pIconBox->pCD_iconBox->baseWidth) /
- pWS->pIconBox->pCD_iconBox->widthInc;
- clientHeight = (pWS->pIconBox->pCD_iconBox->clientHeight -
- pWS->pIconBox->pCD_iconBox->baseHeight) /
- pWS->pIconBox->pCD_iconBox->heightInc ;
- if(wmGD.positionIsFrame)
- {
- CalculateGravityOffset (pWS->pIconBox->pCD_iconBox, &xoff, &yoff);
- clientX = pWS->pIconBox->pCD_iconBox->clientX - xoff;
- clientY = pWS->pIconBox->pCD_iconBox->clientY - yoff;
- }
- else
- {
- clientX = pWS->pIconBox->pCD_iconBox->clientX;
- clientY = pWS->pIconBox->pCD_iconBox->clientY;
- }
- sprintf (buffer, "%dx%d+%d+%d", clientWidth, clientHeight,
- clientX, clientY);
- pWS->iconBoxGeometry = strdup( buffer);
- iLen = strlen (res_class) + strlen (screenName) +
- strlen (pWS->name) + strlen (WmNiconBoxGeometry) +
- strlen (pWS->iconBoxGeometry) + 18;
- if (iLen > bufferLength)
- {
- bufferLength += iLen;
- buffer = (char *)
- XtRealloc (buffer, bufferLength * sizeof(char));
- }
- sprintf (buffer, "%s%s*%s*%s: %s\n", res_class,
- screenName, pWS->name,
- WmNiconBoxGeometry, pWS->iconBoxGeometry);
- AddStringToResourceData (buffer, &data, &cum_len);
- }
- if (data)
- {
- /*
- * Merge in the resource(s)
- */
- _DtAddToResource (DISPLAY, data);
- XtFree(data);
- }
- XtFree(buffer);
- } /* END OF FUNCTION SaveWorkspaceResources */
- /******************************<->*************************************
- *
- * AddStringToResourceData (string, pdata, plen)
- *
- * Description:
- * -----------
- * Adds a string to a growing buffer of strings.
- *
- * Inputs:
- * ------
- * string - string to add
- * pdata - pointer to data pointer
- * plen - number of bytes used in *pdata already
- *
- * Outputs:
- * -------
- * *pdata - data pointer (may be changed by XtRealloc)
- * *plen - number of bytes used in *pdata (old value plus length
- * of string
- *
- * Comments:
- * ---------
- *
- *************************************<->***********************************/
- void
- AddStringToResourceData(
- char *string,
- char **pdata,
- int *plen )
- {
- if ((*pdata = (char *) XtRealloc(*pdata, *plen+strlen(string)+1)) == NULL)
- {
- Warning (((char *)GETMESSAGE(76, 13, "Insufficient memory to save resources.")));
- Do_Quit_Mwm (False);
- }
- strcat (*pdata, string);
- *plen += strlen(string);
- } /* END OF FUNCTION AddStringToResourceData */
- /*************************************<->*************************************
- *
- * DuplicateWorkspaceName (pSD, name, num)
- *
- *
- * Description:
- * -----------
- * This function searches the first "num" workspace names to see if the
- * passed "name" duplicates any workspace name defined so far.
- *
- *
- * Inputs:
- * ------
- * pSD = pointer to screen data
- * name = potential string name for workspace
- * num = number of workspaces to check against
- *
- * Outputs:
- * -------
- * Return = True if a dupicate was found
- *
- * Comments:
- * --------
- *
- *************************************<->***********************************/
- Boolean
- DuplicateWorkspaceName (WmScreenData *pSD, unsigned char *name, int num)
- {
- int i;
- Boolean duplicate = False;
- if (pSD && pSD->pWS)
- {
- for (i = 0; (i < num) && !duplicate; i++)
- {
- if (!strcmp (pSD->pWS[i].name, (char *)name))
- {
- duplicate = True;
- }
- }
- }
- return (duplicate);
- }
- #ifdef DEBUG
- int PrintWorkspaceList (pSD)
- WmScreenData *pSD;
- {
- int i, j, k;
- WmWorkspaceData *pWS;
- ClientData *pCD;
- ClientData *pClients[500];
- int numSaved = 0;
- Boolean Saved;
- fprintf (stderr, "Screen: %d\n", pSD->screen);
- for (i =0; i < pSD->numWorkspaces; i++)
- {
- pWS = &pSD->pWS[i];
- fprintf (stderr, "\nWorkspace %s contains: \n", pWS->name);
- for (j = 0; j < pWS->numClients; j++)
- {
- pCD = pWS->ppClients[j];
- fprintf (stderr, "\t%s\n", pCD->clientName);
- Saved = False;
- for (k = 0; k < numSaved; k++)
- {
- if (pCD == pClients[k])
- {
- Saved = True;
- break;
- }
- }
- if (!Saved)
- {
- pClients[numSaved++] = pCD;
- }
- }
- }
- for (i = 0; i < numSaved; i++)
- {
- pCD = pClients[i];
- fprintf (stderr, "\nClient %s is in: \n", pCD->clientName);
- for (j = 0; j < pCD->numInhabited; j++)
- {
- pWS = GetWorkspaceData (pCD->pSD, pCD->pWsList[j].wsID);
- fprintf (stderr, "\t%s\n", pWS->name);
- }
- }
- } /* END OF FUNCTION PrintWorkspaceList */
- #endif /* DEBUG */
|