Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  *
      3  * Author:  Chris D. Peterson, MIT X Consortium
      4  */
      5 
      6 /************************************************************
      7 
      8 Copyright (c) 1993, Oracle and/or its affiliates.
      9 
     10 Permission is hereby granted, free of charge, to any person obtaining a
     11 copy of this software and associated documentation files (the "Software"),
     12 to deal in the Software without restriction, including without limitation
     13 the rights to use, copy, modify, merge, publish, distribute, sublicense,
     14 and/or sell copies of the Software, and to permit persons to whom the
     15 Software is furnished to do so, subject to the following conditions:
     16 
     17 The above copyright notice and this permission notice (including the next
     18 paragraph) shall be included in all copies or substantial portions of the
     19 Software.
     20 
     21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     22 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     23 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     24 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     25 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     26 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     27 DEALINGS IN THE SOFTWARE.
     28 
     29 ********************************************************/
     30 
     31 /*
     32 
     33 Copyright 1989, 1994, 1998  The Open Group
     34 
     35 Permission to use, copy, modify, distribute, and sell this software and its
     36 documentation for any purpose is hereby granted without fee, provided that
     37 the above copyright notice appear in all copies and that both that
     38 copyright notice and this permission notice appear in supporting
     39 documentation.
     40 
     41 The above copyright notice and this permission notice shall be included in
     42 all copies or substantial portions of the Software.
     43 
     44 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     45 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     46 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     47 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     48 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     49 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     50 
     51 Except as contained in this notice, the name of The Open Group shall not be
     52 used in advertising or otherwise to promote the sale, use or other dealings
     53 in this Software without prior written authorization from The Open Group.
     54 
     55 */
     56 
     57 #ifdef HAVE_CONFIG_H
     58 #include <config.h>
     59 #endif
     60 #include "IntrinsicI.h"
     61 #include <X11/Xatom.h>
     62 
     63 /*      Function Name: XtSetWMColormapWindows
     64  *
     65  *      Description: Sets the value of the WM_COLORMAP_WINDOWS
     66  *                   property on a widget's window.
     67  *
     68  *      Arguments:  widget - specifies the widget on whose window the
     69  *                         - WM_COLORMAP_WINDOWS property will be stored.
     70  *
     71  *                  list - Specifies a list of widgets whose windows are to be
     72  *                         listed in the WM_COLORMAP_WINDOWS property.
     73  *                  count - Specifies the number of widgets in list.
     74  *
     75  *      Returns: none.
     76  */
     77 
     78 void
     79 XtSetWMColormapWindows(Widget widget, Widget *list, Cardinal count)
     80 {
     81     Window *data;
     82     Widget *checked, *top, *temp, hookobj;
     83     Cardinal i, j, checked_count;
     84     Boolean match;
     85     Atom xa_wm_colormap_windows;
     86 
     87     WIDGET_TO_APPCON(widget);
     88 
     89     LOCK_APP(app);
     90     if (!XtIsRealized(widget) || (count == 0)) {
     91         UNLOCK_APP(app);
     92         return;
     93     }
     94 
     95     top = checked = XtMallocArray(count, (Cardinal) sizeof(Widget));
     96 
     97 /*
     98  * The specification calls for only adding the windows that have unique
     99  * colormaps to the property to this function, so we will make a pass through
    100  * the widget list removing all the widgets with non-unique colormaps.
    101  *
    102  * We will also remove any unrealized widgets from the list at this time.
    103  */
    104 
    105     for (checked_count = 0, i = 0; i < count; i++) {
    106         if (!XtIsRealized(list[i]))
    107             continue;
    108 
    109         *checked = list[i];
    110         match = FALSE;
    111 
    112 /*
    113  * Don't check first element for matching colormap since there is nothing
    114  * to check it against.
    115  */
    116 
    117         if (checked != top)
    118             for (j = 0, temp = top; j < checked_count; j++, temp++)
    119                 if ((*temp)->core.colormap == (*checked)->core.colormap) {
    120                     match = TRUE;
    121                     break;
    122                 }
    123 
    124 /*
    125  * If no colormap was found to match then add this widget to the linked list.
    126  */
    127 
    128         if (!match) {
    129             checked++;
    130             checked_count++;
    131         }
    132     }
    133 
    134 /*
    135  * Now that we have the list of widgets we need to convert it to a list of
    136  * windows and set the property.
    137  */
    138 
    139     data = XtMallocArray(checked_count, (Cardinal) sizeof(Window));
    140 
    141     for (i = 0; i < checked_count; i++)
    142         data[i] = XtWindow(top[i]);
    143 
    144     xa_wm_colormap_windows = XInternAtom(XtDisplay(widget),
    145                                          "WM_COLORMAP_WINDOWS", FALSE);
    146 
    147     XChangeProperty(XtDisplay(widget), XtWindow(widget),
    148                     xa_wm_colormap_windows, XA_WINDOW, 32,
    149                     PropModeReplace, (unsigned char *) data, (int) i);
    150 
    151     hookobj = XtHooksOfDisplay(XtDisplay(widget));
    152     if (XtHasCallbacks(hookobj, XtNchangeHook) == XtCallbackHasSome) {
    153         XtChangeHookDataRec call_data;
    154 
    155         call_data.type = XtHsetWMColormapWindows;
    156         call_data.widget = widget;
    157         call_data.event_data = (XtPointer) list;
    158         call_data.num_event_data = count;
    159         XtCallCallbackList(hookobj,
    160                            ((HookObject) hookobj)->hooks.changehook_callbacks,
    161                            (XtPointer) &call_data);
    162     }
    163 
    164     XtFree((char *) data);
    165     XtFree((char *) top);
    166     UNLOCK_APP(app);
    167 }
    168