dtwm: Change to ANSI function definitions
[oweals/cde.git] / cde / programs / dtwm / WmMultiHead.c
1 /*
2  * Copyright (c) 2016 Matthew R. Trower
3  *
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:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
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
20  * IN THE SOFTWARE.
21  */
22
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 /*
27  * Included Files:
28  */
29 #include <DtXinerama.h>
30
31 #include "WmMultiHead.h"
32
33 /*
34  * Global Variables
35  */
36 DtXineramaInfo_t *DtXI = NULL;/* Xinerama data is static for life of X server */
37
38 \f
39 /*************************************<->*************************************
40  *
41  *  GetHeadInfo (pcd)
42  *
43  *
44  *  Description:
45  *  -----------
46  *  Search for the head containing target client.
47  *
48  *
49  *  Inputs:
50  *  ------
51  *
52  *
53  *  Outputs:
54  *  -------
55  *  Return = head metrics on success, NULL on failure.
56  *           menuWidget, and menuButtons members.
57  *
58  *
59  *  Comments:
60  *  --------
61  *
62  *  Can fail if:
63  *
64  *  - MultiHead(eg. Xinerama) is not active
65  *  - Client does not fall within any existing head
66  *  - malloc error
67  *  - pcd is NULL
68  *
69  *************************************<->***********************************/
70 WmHeadInfo_t *GetHeadInfo(const ClientData *pcd) {
71     WmHeadInfo_t *WmHI = NULL;
72
73     if (!DtXI)
74         DtXI = _DtXineramaInit(DISPLAY);
75
76     if (!pcd || !DtXI)
77         return NULL;
78
79     if (!(WmHI = (WmHeadInfo_t *)malloc(sizeof(WmHeadInfo_t)))) {
80 #ifdef DEBUG
81         fprintf(stderr, "(dtwm) _GetScreenInfo: malloc failed\n");
82 #endif
83
84         free(DtXI);
85         return NULL;
86     }
87
88     /*
89      * TODO
90      *
91      * DtXineramaInfo_t uses unsigned ints
92      * XineramaScreenInfo uses shorts(?)
93      * ClientData uses ints
94      * FrameToClient and friends use a mixture (!)
95      *
96      * Explicit casting would shut the compiler up, but wouldn't change the
97      * fundamental fact that we can't agree on coordinate types.
98      */
99     int idx = 0;
100     while (_DtXineramaGetScreen(DtXI, idx++,
101             &WmHI->width, &WmHI->height, &WmHI->x_org, &WmHI->y_org)) {
102
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)
107
108             return WmHI;
109     }
110
111     free(WmHI);
112
113     /* No valid screen */
114     return NULL;
115 }