1706f2543Smrg/* 2706f2543Smrg *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved. 3706f2543Smrg * 4706f2543Smrg *Permission is hereby granted, free of charge, to any person obtaining 5706f2543Smrg * a copy of this software and associated documentation files (the 6706f2543Smrg *"Software"), to deal in the Software without restriction, including 7706f2543Smrg *without limitation the rights to use, copy, modify, merge, publish, 8706f2543Smrg *distribute, sublicense, and/or sell copies of the Software, and to 9706f2543Smrg *permit persons to whom the Software is furnished to do so, subject to 10706f2543Smrg *the following conditions: 11706f2543Smrg * 12706f2543Smrg *The above copyright notice and this permission notice shall be 13706f2543Smrg *included in all copies or substantial portions of the Software. 14706f2543Smrg * 15706f2543Smrg *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16706f2543Smrg *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17706f2543Smrg *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18706f2543Smrg *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR 19706f2543Smrg *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 20706f2543Smrg *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21706f2543Smrg *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22706f2543Smrg * 23706f2543Smrg *Except as contained in this notice, the name of the XFree86 Project 24706f2543Smrg *shall not be used in advertising or otherwise to promote the sale, use 25706f2543Smrg *or other dealings in this Software without prior written authorization 26706f2543Smrg *from the XFree86 Project. 27706f2543Smrg * 28706f2543Smrg * Authors: Earle F. Philhower, III 29706f2543Smrg */ 30706f2543Smrg 31706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H 32706f2543Smrg#include <xwin-config.h> 33706f2543Smrg#endif 34706f2543Smrg#include <X11/Xatom.h> 35706f2543Smrg#include "propertyst.h" 36706f2543Smrg#include "windowstr.h" 37706f2543Smrg#include "winmultiwindowclass.h" 38706f2543Smrg#include "win.h" 39706f2543Smrg 40706f2543Smrg/* 41706f2543Smrg * Local function 42706f2543Smrg */ 43706f2543Smrg 44706f2543SmrgDEFINE_ATOM_HELPER(AtmWmWindowRole, "WM_WINDOW_ROLE") 45706f2543Smrg 46706f2543Smrg 47706f2543Smrgint 48706f2543SmrgwinMultiWindowGetClassHint (WindowPtr pWin, char **res_name, char **res_class) 49706f2543Smrg{ 50706f2543Smrg struct _Window *pwin; 51706f2543Smrg struct _Property *prop; 52706f2543Smrg int len_name, len_class; 53706f2543Smrg 54706f2543Smrg if (!pWin || !res_name || !res_class) 55706f2543Smrg { 56706f2543Smrg ErrorF ("winMultiWindowGetClassHint - pWin, res_name, or res_class was " 57706f2543Smrg "NULL\n"); 58706f2543Smrg return 0; 59706f2543Smrg } 60706f2543Smrg 61706f2543Smrg pwin = (struct _Window*) pWin; 62706f2543Smrg 63706f2543Smrg if (pwin->optional) 64706f2543Smrg prop = (struct _Property *) pwin->optional->userProps; 65706f2543Smrg else 66706f2543Smrg prop = NULL; 67706f2543Smrg 68706f2543Smrg *res_name = *res_class = NULL; 69706f2543Smrg 70706f2543Smrg while (prop) 71706f2543Smrg { 72706f2543Smrg if (prop->propertyName == XA_WM_CLASS 73706f2543Smrg && prop->type == XA_STRING 74706f2543Smrg && prop->format == 8 75706f2543Smrg && prop->data) 76706f2543Smrg { 77706f2543Smrg len_name = strlen ((char *) prop->data); 78706f2543Smrg 79706f2543Smrg (*res_name) = malloc (len_name + 1); 80706f2543Smrg 81706f2543Smrg if (!*res_name) 82706f2543Smrg { 83706f2543Smrg ErrorF ("winMultiWindowGetClassHint - *res_name was NULL\n"); 84706f2543Smrg return 0; 85706f2543Smrg } 86706f2543Smrg 87706f2543Smrg /* Add one to len_name to allow copying of trailing 0 */ 88706f2543Smrg strncpy ((*res_name), prop->data, len_name + 1); 89706f2543Smrg 90706f2543Smrg if (len_name == prop->size) 91706f2543Smrg len_name--; 92706f2543Smrg 93706f2543Smrg len_class = strlen (((char *)prop->data) + 1 + len_name); 94706f2543Smrg 95706f2543Smrg (*res_class) = malloc (len_class + 1); 96706f2543Smrg 97706f2543Smrg if (!*res_class) 98706f2543Smrg { 99706f2543Smrg ErrorF ("winMultiWindowGetClassHint - *res_class was NULL\n"); 100706f2543Smrg 101706f2543Smrg /* Free the previously allocated res_name */ 102706f2543Smrg free (*res_name); 103706f2543Smrg return 0; 104706f2543Smrg } 105706f2543Smrg 106706f2543Smrg strcpy ((*res_class), ((char *)prop->data) + 1 + len_name); 107706f2543Smrg 108706f2543Smrg return 1; 109706f2543Smrg } 110706f2543Smrg else 111706f2543Smrg prop = prop->next; 112706f2543Smrg } 113706f2543Smrg 114706f2543Smrg return 0; 115706f2543Smrg} 116706f2543Smrg 117706f2543Smrg 118706f2543Smrgint 119706f2543SmrgwinMultiWindowGetWMHints (WindowPtr pWin, WinXWMHints *hints) 120706f2543Smrg{ 121706f2543Smrg struct _Window *pwin; 122706f2543Smrg struct _Property *prop; 123706f2543Smrg 124706f2543Smrg if (!pWin || !hints) 125706f2543Smrg { 126706f2543Smrg ErrorF ("winMultiWindowGetWMHints - pWin or hints was NULL\n"); 127706f2543Smrg return 0; 128706f2543Smrg } 129706f2543Smrg 130706f2543Smrg pwin = (struct _Window*) pWin; 131706f2543Smrg 132706f2543Smrg if (pwin->optional) 133706f2543Smrg prop = (struct _Property *) pwin->optional->userProps; 134706f2543Smrg else 135706f2543Smrg prop = NULL; 136706f2543Smrg 137706f2543Smrg memset (hints, 0, sizeof (WinXWMHints)); 138706f2543Smrg 139706f2543Smrg while (prop) 140706f2543Smrg { 141706f2543Smrg if (prop->propertyName == XA_WM_HINTS 142706f2543Smrg && prop->data) 143706f2543Smrg { 144706f2543Smrg memcpy (hints, prop->data, sizeof (WinXWMHints)); 145706f2543Smrg return 1; 146706f2543Smrg } 147706f2543Smrg else 148706f2543Smrg prop = prop->next; 149706f2543Smrg } 150706f2543Smrg 151706f2543Smrg return 0; 152706f2543Smrg} 153706f2543Smrg 154706f2543Smrg 155706f2543Smrgint 156706f2543SmrgwinMultiWindowGetWindowRole (WindowPtr pWin, char **res_role) 157706f2543Smrg{ 158706f2543Smrg struct _Window *pwin; 159706f2543Smrg struct _Property *prop; 160706f2543Smrg int len_role; 161706f2543Smrg 162706f2543Smrg if (!pWin || !res_role) 163706f2543Smrg return 0; 164706f2543Smrg 165706f2543Smrg pwin = (struct _Window*) pWin; 166706f2543Smrg 167706f2543Smrg if (pwin->optional) 168706f2543Smrg prop = (struct _Property *) pwin->optional->userProps; 169706f2543Smrg else 170706f2543Smrg prop = NULL; 171706f2543Smrg 172706f2543Smrg *res_role = NULL; 173706f2543Smrg while (prop) 174706f2543Smrg { 175706f2543Smrg if (prop->propertyName == AtmWmWindowRole () 176706f2543Smrg && prop->type == XA_STRING 177706f2543Smrg && prop->format == 8 178706f2543Smrg && prop->data) 179706f2543Smrg { 180706f2543Smrg len_role= prop->size; 181706f2543Smrg 182706f2543Smrg (*res_role) = malloc (len_role + 1); 183706f2543Smrg 184706f2543Smrg if (!*res_role) 185706f2543Smrg { 186706f2543Smrg ErrorF ("winMultiWindowGetWindowRole - *res_role was NULL\n"); 187706f2543Smrg return 0; 188706f2543Smrg } 189706f2543Smrg 190706f2543Smrg strncpy ((*res_role), prop->data, len_role); 191706f2543Smrg (*res_role)[len_role] = 0; 192706f2543Smrg 193706f2543Smrg return 1; 194706f2543Smrg } 195706f2543Smrg else 196706f2543Smrg prop = prop->next; 197706f2543Smrg } 198706f2543Smrg 199706f2543Smrg return 0; 200706f2543Smrg} 201706f2543Smrg 202706f2543Smrg 203706f2543Smrgint 204706f2543SmrgwinMultiWindowGetWMNormalHints (WindowPtr pWin, WinXSizeHints *hints) 205706f2543Smrg{ 206706f2543Smrg struct _Window *pwin; 207706f2543Smrg struct _Property *prop; 208706f2543Smrg 209706f2543Smrg if (!pWin || !hints) 210706f2543Smrg { 211706f2543Smrg ErrorF ("winMultiWindowGetWMNormalHints - pWin or hints was NULL\n"); 212706f2543Smrg return 0; 213706f2543Smrg } 214706f2543Smrg 215706f2543Smrg pwin = (struct _Window*) pWin; 216706f2543Smrg 217706f2543Smrg if (pwin->optional) 218706f2543Smrg prop = (struct _Property *) pwin->optional->userProps; 219706f2543Smrg else 220706f2543Smrg prop = NULL; 221706f2543Smrg 222706f2543Smrg memset (hints, 0, sizeof (WinXSizeHints)); 223706f2543Smrg 224706f2543Smrg while (prop) 225706f2543Smrg { 226706f2543Smrg if (prop->propertyName == XA_WM_NORMAL_HINTS 227706f2543Smrg && prop->data) 228706f2543Smrg { 229706f2543Smrg memcpy (hints, prop->data, sizeof (WinXSizeHints)); 230706f2543Smrg return 1; 231706f2543Smrg } 232706f2543Smrg else 233706f2543Smrg prop = prop->next; 234706f2543Smrg } 235706f2543Smrg 236706f2543Smrg return 0; 237706f2543Smrg} 238706f2543Smrg 239706f2543Smrgint 240706f2543SmrgwinMultiWindowGetTransientFor (WindowPtr pWin, WindowPtr *ppDaddy) 241706f2543Smrg{ 242706f2543Smrg struct _Window *pwin; 243706f2543Smrg struct _Property *prop; 244706f2543Smrg 245706f2543Smrg if (!pWin) 246706f2543Smrg { 247706f2543Smrg ErrorF ("winMultiWindowGetTransientFor - pWin was NULL\n"); 248706f2543Smrg return 0; 249706f2543Smrg } 250706f2543Smrg 251706f2543Smrg pwin = (struct _Window*) pWin; 252706f2543Smrg 253706f2543Smrg if (pwin->optional) 254706f2543Smrg prop = (struct _Property *) pwin->optional->userProps; 255706f2543Smrg else 256706f2543Smrg prop = NULL; 257706f2543Smrg 258706f2543Smrg if (ppDaddy) 259706f2543Smrg *ppDaddy = NULL; 260706f2543Smrg 261706f2543Smrg while (prop) 262706f2543Smrg { 263706f2543Smrg if (prop->propertyName == XA_WM_TRANSIENT_FOR) 264706f2543Smrg { 265706f2543Smrg if (ppDaddy) 266706f2543Smrg memcpy (ppDaddy, prop->data, sizeof (WindowPtr)); 267706f2543Smrg return 1; 268706f2543Smrg } 269706f2543Smrg else 270706f2543Smrg prop = prop->next; 271706f2543Smrg } 272706f2543Smrg 273706f2543Smrg return 0; 274706f2543Smrg} 275706f2543Smrg 276706f2543Smrgint 277706f2543SmrgwinMultiWindowGetWMName (WindowPtr pWin, char **wmName) 278706f2543Smrg{ 279706f2543Smrg struct _Window *pwin; 280706f2543Smrg struct _Property *prop; 281706f2543Smrg int len_name; 282706f2543Smrg 283706f2543Smrg if (!pWin || !wmName) 284706f2543Smrg { 285706f2543Smrg ErrorF ("winMultiWindowGetClassHint - pWin, res_name, or res_class was " 286706f2543Smrg "NULL\n"); 287706f2543Smrg return 0; 288706f2543Smrg } 289706f2543Smrg 290706f2543Smrg pwin = (struct _Window*) pWin; 291706f2543Smrg 292706f2543Smrg if (pwin->optional) 293706f2543Smrg prop = (struct _Property *) pwin->optional->userProps; 294706f2543Smrg else 295706f2543Smrg prop = NULL; 296706f2543Smrg 297706f2543Smrg *wmName = NULL; 298706f2543Smrg 299706f2543Smrg while (prop) 300706f2543Smrg { 301706f2543Smrg if (prop->propertyName == XA_WM_NAME 302706f2543Smrg && prop->type == XA_STRING 303706f2543Smrg && prop->data) 304706f2543Smrg { 305706f2543Smrg len_name = prop->size; 306706f2543Smrg 307706f2543Smrg (*wmName) = malloc (len_name + 1); 308706f2543Smrg 309706f2543Smrg if (!*wmName) 310706f2543Smrg { 311706f2543Smrg ErrorF ("winMultiWindowGetWMName - *wmName was NULL\n"); 312706f2543Smrg return 0; 313706f2543Smrg } 314706f2543Smrg 315706f2543Smrg strncpy ((*wmName), prop->data, len_name); 316706f2543Smrg (*wmName)[len_name] = 0; 317706f2543Smrg 318706f2543Smrg return 1; 319706f2543Smrg } 320706f2543Smrg else 321706f2543Smrg prop = prop->next; 322706f2543Smrg } 323706f2543Smrg 324706f2543Smrg return 0; 325706f2543Smrg} 326