void ShowIconForMinimizedClient (WmWorkspaceData *pWS, ClientData *pCD) { WmScreenData *pSD = PSD_FOR_CLIENT(pCD); /* * Handle auto-placement for root icons (icons not in an icon * box). */ if (wmGD.iconAutoPlace && !P_ICON_BOX(pCD)) { if ((ICON_PLACE(pCD) == NO_ICON_PLACE) || ((pWS->IPData.placeList[ICON_PLACE(pCD)].pCD) && (pWS->IPData.placeList[ICON_PLACE(pCD)].pCD != pCD))) { /* * Icon place not defined or occupied by another client, * find a free place to put the icon. */ if ((ICON_PLACE(pCD) = GetNextIconPlace (&pWS->IPData)) == NO_ICON_PLACE) { ICON_PLACE(pCD) = CvtIconPositionToPlace (&pWS->IPData, pCD->clientX, pCD->clientY); } CvtIconPlaceToPosition (&pWS->IPData, ICON_PLACE(pCD), &ICON_X(pCD), &ICON_Y(pCD)); #ifndef WSM XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD), ICON_X(pCD), ICON_Y(pCD)); #endif /* WSM */ } pWS->IPData.placeList[ICON_PLACE(pCD)].pCD = pCD; } #ifdef WSM /* * If icon on root window and this workspace is active, the * make sure it's in the right place. */ if ((pWS == pSD->pActiveWS) && !P_ICON_BOX(pCD)) { XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD), ICON_X(pCD), ICON_Y(pCD)); } #endif /* WSM */ if (pCD->iconWindow) { XMapWindow (DISPLAY, pCD->iconWindow); } if ((pSD->useIconBox) && P_ICON_BOX(pCD)) { ShowClientIconState (pCD, MINIMIZED_STATE ); } else { XWindowChanges windowChanges; /* * Map the icon on the screen at the appropriate place in the * window stack. */ if (wmGD.lowerOnIconify) { if ((&pCD->iconEntry != pSD->lastClient) && (pSD->lastClient)) { if (pSD->lastClient->type == MINIMIZED_STATE) { windowChanges.sibling = ICON_FRAME_WIN(pSD->lastClient->pCD); } else { windowChanges.sibling = pSD->lastClient->pCD->clientFrameWin; } windowChanges.stack_mode = Below; XConfigureWindow (DISPLAY, ICON_FRAME_WIN(pCD), (CWSibling | CWStackMode), &windowChanges); MoveEntryInList (pWS, &pCD->iconEntry, False /*on bottom*/, NULL); } } else { windowChanges.sibling = pCD->clientFrameWin; windowChanges.stack_mode = Below; XConfigureWindow (DISPLAY, ICON_FRAME_WIN(pCD), (CWSibling | CWStackMode), &windowChanges); MoveEntryInList (pWS, &pCD->iconEntry, False /*below*/, &pCD->clientEntry); } #ifdef WSM if (pWS == pSD->pActiveWS) { XMapWindow (DISPLAY, ICON_FRAME_WIN(pCD)); } #else /* WSM */ XMapWindow (DISPLAY, ICON_FRAME_WIN(pCD)); #endif /* WSM */ } } /* END OF FUNCTION ShowIconForMinimizedClient */
int FindIconPlace (ClientData *pCD, IconPlacementData *pIPD, int x, int y) { int place; int i; int j; int diffX; int diffY; int altX; int altY; int amt; place = CvtIconPositionToPlace (pIPD, x, y); if (place < pIPD->totalPlaces) { if (pIPD->placeList[place].pCD == (ClientData *)NULL) { return (place); } } else { if (pIPD->iconPlacement & ICON_PLACE_LEFT_PRIMARY) { amt = pIPD->placementCols; /* add a new row */ } else { amt = pIPD->placementRows; /* add a new column */ } if (!ExtendIconList (P_ICON_BOX(pCD), amt)) { Warning (((char *)GETMESSAGE(34, 4, "Insufficient memory to create icon box data"))); return (NO_ICON_PLACE); } } /* * The place for the passed in position is in use, look at places for * alternative positions. */ for (i = 0; i < 2; i++) { switch (i) { case 0: { diffX = ICON_WIDTH(pCD) / 2; diffY = ICON_HEIGHT(pCD) / 2; break; } case 1: { diffX = pIPD->iPlaceW / 2; diffY = pIPD->iPlaceH / 2; break; } } for (j = 0; j < 4; j++) { switch (j) { case 0: { if (pIPD->iconPlacement & ICON_PLACE_LEFT_PRIMARY) { altX = x - diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_PRIMARY) { altX = x + diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_TOP_PRIMARY) { altX = x; altY = y - diffY; } else { altX = x; altY = y + diffY; } break; } case 1: { if (pIPD->iconPlacement & ICON_PLACE_LEFT_PRIMARY) { altX = x + diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_PRIMARY) { altX = x - diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_TOP_PRIMARY) { altX = x; altY = y + diffY; } else { altX = x; altY = y - diffY; } break; } case 2: { if (pIPD->iconPlacement & ICON_PLACE_LEFT_SECONDARY) { altX = x - diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_SECONDARY) { altX = x + diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_TOP_SECONDARY) { altX = x; altY = y + diffY; } else { altX = x; altY = y - diffY; } break; } case 3: { if (pIPD->iconPlacement & ICON_PLACE_LEFT_SECONDARY) { altX = x + diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_RIGHT_SECONDARY) { altX = x - diffX; altY = y; } else if (pIPD->iconPlacement & ICON_PLACE_TOP_SECONDARY) { altX = x; altY = y - diffY; } else { altX = x; altY = y + diffY; } break; } } if (P_ICON_BOX(pCD)) { GetClipDimensions(pCD, False); if (altX < clipX) { return (NO_ICON_PLACE); } if (altY < clipY) { return (NO_ICON_PLACE); } if (((int)altX) > ((int)clipX + (int)clipWidth - ((int)ICON_WIDTH(pCD)))) { return (NO_ICON_PLACE); } if (((int)altY) > ((int)clipY + (int)clipHeight - ((int)ICON_HEIGHT(pCD)))) { return (NO_ICON_PLACE); } } place = CvtIconPositionToPlace (pIPD, altX, altY); if ((pIPD->placeList[place].pCD) == NULL) { return (place); } } } /* * Couldn't find an unoccupied place in the proximity of the passed-in * position. */ return (NO_ICON_PLACE); } /* END OF FUNCTION FindIconPlace */