2 * Copyright (c) 2016 Matthew R. Trower
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to
6 * deal in the Software without restriction, including without limitation the
7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 * sell copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29 #include <DtXinerama.h>
31 #include "WmMultiHead.h"
36 DtXineramaInfo_t *DtXI = NULL;/* Xinerama data is static for life of X server */
39 /*************************************<->*************************************
46 * Search for the head containing target client.
55 * Return = head metrics on success, NULL on failure.
56 * menuWidget, and menuButtons members.
64 * - MultiHead(eg. Xinerama) is not active
65 * - Client does not fall within any existing head
69 *************************************<->***********************************/
70 WmHeadInfo_t *GetHeadInfo(const ClientData *pcd) {
71 WmHeadInfo_t *WmHI = NULL;
74 DtXI = _DtXineramaInit(DISPLAY);
79 if (!(WmHI = (WmHeadInfo_t *)malloc(sizeof(WmHeadInfo_t)))) {
81 fprintf(stderr, "(dtwm) _GetScreenInfo: malloc failed\n");
91 * DtXineramaInfo_t uses unsigned ints
92 * XineramaScreenInfo uses shorts(?)
93 * ClientData uses ints
94 * FrameToClient and friends use a mixture (!)
96 * Explicit casting would shut the compiler up, but wouldn't change the
97 * fundamental fact that we can't agree on coordinate types.
100 while (_DtXineramaGetScreen(DtXI, idx++,
101 &WmHI->width, &WmHI->height, &WmHI->x_org, &WmHI->y_org)) {
103 if (pcd->clientX >= WmHI->x_org &&
104 pcd->clientY >= WmHI->y_org &&
105 pcd->clientX <= WmHI->x_org + WmHI->width &&
106 pcd->clientY <= WmHI->y_org + WmHI->height)
113 /* No valid screen */