xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

winmultiwindowclass.c (7948B)


      1 /*
      2  *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
      3  *
      4  *Permission is hereby granted, free of charge, to any person obtaining
      5  * a copy of this software and associated documentation files (the
      6  *"Software"), to deal in the Software without restriction, including
      7  *without limitation the rights to use, copy, modify, merge, publish,
      8  *distribute, sublicense, and/or sell copies of the Software, and to
      9  *permit persons to whom the Software is furnished to do so, subject to
     10  *the following conditions:
     11  *
     12  *The above copyright notice and this permission notice shall be
     13  *included in all copies or substantial portions of the Software.
     14  *
     15  *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     16  *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17  *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     18  *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
     19  *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
     20  *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
     21  *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     22  *
     23  *Except as contained in this notice, the name of the XFree86 Project
     24  *shall not be used in advertising or otherwise to promote the sale, use
     25  *or other dealings in this Software without prior written authorization
     26  *from the XFree86 Project.
     27  *
     28  * Authors:     Earle F. Philhower, III
     29  */
     30 
     31 #ifdef HAVE_XWIN_CONFIG_H
     32 #include <xwin-config.h>
     33 #endif
     34 #include <X11/Xatom.h>
     35 #include "propertyst.h"
     36 #include "windowstr.h"
     37 #include "winmultiwindowclass.h"
     38 #include "win.h"
     39 
     40 /*
     41  * Local function
     42  */
     43 
     44 DEFINE_ATOM_HELPER(AtmWmWindowRole, "WM_WINDOW_ROLE")
     45 
     46 int
     47 winMultiWindowGetClassHint(WindowPtr pWin, char **res_name, char **res_class)
     48 {
     49     struct _Window *pwin;
     50     struct _Property *prop;
     51     int len_name, len_class;
     52 
     53     if (!pWin || !res_name || !res_class) {
     54         ErrorF("winMultiWindowGetClassHint - pWin, res_name, or res_class was "
     55                "NULL\n");
     56         return 0;
     57     }
     58 
     59     pwin = (struct _Window *) pWin;
     60 
     61     if (pwin->optional)
     62         prop = (struct _Property *) pwin->optional->userProps;
     63     else
     64         prop = NULL;
     65 
     66     *res_name = *res_class = NULL;
     67 
     68     while (prop) {
     69         if (prop->propertyName == XA_WM_CLASS
     70             && prop->type == XA_STRING && prop->format == 8 && prop->data) {
     71             /*
     72               WM_CLASS property should consist of 2 null terminated strings, but we
     73               must handle the cases when one or both is absent or not null terminated
     74             */
     75             len_name = strlen((char *) prop->data);
     76             if (len_name > prop->size) len_name = prop->size;
     77 
     78             (*res_name) = malloc(len_name + 1);
     79 
     80             if (!*res_name) {
     81                 ErrorF("winMultiWindowGetClassHint - *res_name was NULL\n");
     82                 return 0;
     83             }
     84 
     85             /* Copy name and ensure null terminated */
     86             strncpy((*res_name), prop->data, len_name);
     87             (*res_name)[len_name] = '\0';
     88 
     89             /* Compute length of class name, it could be that it is absent or not null terminated */
     90             len_class = (len_name >= prop->size) ? 0 : (strlen(((char *) prop->data) + 1 + len_name));
     91             if (len_class > prop->size - 1 - len_name) len_class = prop->size - 1 - len_name;
     92 
     93             (*res_class) = malloc(len_class + 1);
     94 
     95             if (!*res_class) {
     96                 ErrorF("winMultiWindowGetClassHint - *res_class was NULL\n");
     97 
     98                 /* Free the previously allocated res_name */
     99                 free(*res_name);
    100                 return 0;
    101             }
    102 
    103             /* Copy class name and ensure null terminated */
    104             strncpy((*res_class), ((char *) prop->data) + 1 + len_name, len_class);
    105             (*res_class)[len_class] = '\0';
    106 
    107             return 1;
    108         }
    109         else
    110             prop = prop->next;
    111     }
    112 
    113     return 0;
    114 }
    115 
    116 int
    117 winMultiWindowGetWMHints(WindowPtr pWin, WinXWMHints * hints)
    118 {
    119     struct _Window *pwin;
    120     struct _Property *prop;
    121 
    122     if (!pWin || !hints) {
    123         ErrorF("winMultiWindowGetWMHints - pWin or hints was NULL\n");
    124         return 0;
    125     }
    126 
    127     pwin = (struct _Window *) pWin;
    128 
    129     if (pwin->optional)
    130         prop = (struct _Property *) pwin->optional->userProps;
    131     else
    132         prop = NULL;
    133 
    134     memset(hints, 0, sizeof(WinXWMHints));
    135 
    136     while (prop) {
    137         if (prop->propertyName == XA_WM_HINTS && prop->data) {
    138             memcpy(hints, prop->data, sizeof(WinXWMHints));
    139             return 1;
    140         }
    141         else
    142             prop = prop->next;
    143     }
    144 
    145     return 0;
    146 }
    147 
    148 int
    149 winMultiWindowGetWindowRole(WindowPtr pWin, char **res_role)
    150 {
    151     struct _Window *pwin;
    152     struct _Property *prop;
    153     int len_role;
    154 
    155     if (!pWin || !res_role)
    156         return 0;
    157 
    158     pwin = (struct _Window *) pWin;
    159 
    160     if (pwin->optional)
    161         prop = (struct _Property *) pwin->optional->userProps;
    162     else
    163         prop = NULL;
    164 
    165     *res_role = NULL;
    166     while (prop) {
    167         if (prop->propertyName == AtmWmWindowRole()
    168             && prop->type == XA_STRING && prop->format == 8 && prop->data) {
    169             len_role = prop->size;
    170 
    171             (*res_role) = malloc(len_role + 1);
    172 
    173             if (!*res_role) {
    174                 ErrorF("winMultiWindowGetWindowRole - *res_role was NULL\n");
    175                 return 0;
    176             }
    177 
    178             strncpy((*res_role), prop->data, len_role);
    179             (*res_role)[len_role] = 0;
    180 
    181             return 1;
    182         }
    183         else
    184             prop = prop->next;
    185     }
    186 
    187     return 0;
    188 }
    189 
    190 int
    191 winMultiWindowGetWMNormalHints(WindowPtr pWin, WinXSizeHints * hints)
    192 {
    193     struct _Window *pwin;
    194     struct _Property *prop;
    195 
    196     if (!pWin || !hints) {
    197         ErrorF("winMultiWindowGetWMNormalHints - pWin or hints was NULL\n");
    198         return 0;
    199     }
    200 
    201     pwin = (struct _Window *) pWin;
    202 
    203     if (pwin->optional)
    204         prop = (struct _Property *) pwin->optional->userProps;
    205     else
    206         prop = NULL;
    207 
    208     memset(hints, 0, sizeof(WinXSizeHints));
    209 
    210     while (prop) {
    211         if (prop->propertyName == XA_WM_NORMAL_HINTS && prop->data) {
    212             memcpy(hints, prop->data, sizeof(WinXSizeHints));
    213             return 1;
    214         }
    215         else
    216             prop = prop->next;
    217     }
    218 
    219     return 0;
    220 }
    221 
    222 int
    223 winMultiWindowGetTransientFor(WindowPtr pWin, Window *pDaddyId)
    224 {
    225     struct _Window *pwin;
    226     struct _Property *prop;
    227 
    228     if (!pWin) {
    229         ErrorF("winMultiWindowGetTransientFor - pWin was NULL\n");
    230         return 0;
    231     }
    232 
    233     pwin = (struct _Window *) pWin;
    234 
    235     if (pwin->optional)
    236         prop = (struct _Property *) pwin->optional->userProps;
    237     else
    238         prop = NULL;
    239 
    240     if (pDaddyId)
    241         *pDaddyId = 0;
    242 
    243     while (prop) {
    244         if (prop->propertyName == XA_WM_TRANSIENT_FOR) {
    245             if (pDaddyId)
    246                 memcpy(pDaddyId, prop->data, sizeof(Window));
    247             return 1;
    248         }
    249         else
    250             prop = prop->next;
    251     }
    252 
    253     return 0;
    254 }
    255 
    256 int
    257 winMultiWindowGetWMName(WindowPtr pWin, char **wmName)
    258 {
    259     struct _Window *pwin;
    260     struct _Property *prop;
    261     int len_name;
    262 
    263     if (!pWin || !wmName) {
    264         ErrorF("winMultiWindowGetClassHint - pWin, res_name, or res_class was "
    265                "NULL\n");
    266         return 0;
    267     }
    268 
    269     pwin = (struct _Window *) pWin;
    270 
    271     if (pwin->optional)
    272         prop = (struct _Property *) pwin->optional->userProps;
    273     else
    274         prop = NULL;
    275 
    276     *wmName = NULL;
    277 
    278     while (prop) {
    279         if (prop->propertyName == XA_WM_NAME
    280             && prop->type == XA_STRING && prop->data) {
    281             len_name = prop->size;
    282 
    283             (*wmName) = malloc(len_name + 1);
    284 
    285             if (!*wmName) {
    286                 ErrorF("winMultiWindowGetWMName - *wmName was NULL\n");
    287                 return 0;
    288             }
    289 
    290             strncpy((*wmName), prop->data, len_name);
    291             (*wmName)[len_name] = 0;
    292 
    293             return 1;
    294         }
    295         else
    296             prop = prop->next;
    297     }
    298 
    299     return 0;
    300 }