jdk/src/java.desktop/unix/native/libawt_headless/awt/VDrawingArea.c
changeset 38127 2ab00cd4556e
parent 38125 1ad0239b6e4a
parent 38126 c3706b502779
child 38128 22391eb0c22d
equal deleted inserted replaced
38125:1ad0239b6e4a 38127:2ab00cd4556e
     1 /*
       
     2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 #ifndef HEADLESS
       
    27 
       
    28 #include <X11/IntrinsicP.h>
       
    29 #include "VDrawingAreaP.h"
       
    30 
       
    31 #endif /* !HEADLESS */
       
    32 
       
    33 #include <stdio.h>
       
    34 #include <stdlib.h>
       
    35 
       
    36 #ifdef __linux__
       
    37 /* XXX: Shouldn't be necessary. */
       
    38 #include "awt_p.h"
       
    39 #endif /* __linux__ */
       
    40 
       
    41 
       
    42 /******************************************************************
       
    43  *
       
    44  * Provides Canvas widget which allows the X11 visual to be
       
    45  * changed (the Motif DrawingArea restricts the visual to that
       
    46  * of the parent widget).
       
    47  *
       
    48  ******************************************************************/
       
    49 
       
    50 
       
    51 /******************************************************************
       
    52  *
       
    53  * VDrawingArea Widget Resources
       
    54  *
       
    55  ******************************************************************/
       
    56 
       
    57 #ifndef HEADLESS
       
    58 #define Offset(x)       (XtOffsetOf(VDrawingAreaRec, x))
       
    59 static XtResource resources[]=
       
    60 {
       
    61         { XtNvisual, XtCVisual, XtRVisual, sizeof(Visual*),
       
    62           Offset(vdrawing_area.visual), XtRImmediate, CopyFromParent}
       
    63 };
       
    64 
       
    65 
       
    66 static void Realize();
       
    67 static Boolean SetValues();
       
    68 static void Destroy ();
       
    69 
       
    70 static XmBaseClassExtRec baseClassExtRec = {
       
    71     NULL,
       
    72     NULLQUARK,
       
    73     XmBaseClassExtVersion,
       
    74     sizeof(XmBaseClassExtRec),
       
    75     NULL,                               /* InitializePrehook    */
       
    76     NULL,                               /* SetValuesPrehook     */
       
    77     NULL,                               /* InitializePosthook   */
       
    78     NULL,                               /* SetValuesPosthook    */
       
    79     NULL,                               /* secondaryObjectClass */
       
    80     NULL,                               /* secondaryCreate      */
       
    81     NULL,                               /* getSecRes data       */
       
    82     { 0 },                              /* fastSubclass flags   */
       
    83     NULL,                               /* getValuesPrehook     */
       
    84     NULL,                               /* getValuesPosthook    */
       
    85     NULL,                               /* classPartInitPrehook */
       
    86     NULL,                               /* classPartInitPosthook*/
       
    87     NULL,                               /* ext_resources        */
       
    88     NULL,                               /* compiled_ext_resources*/
       
    89     0,                                  /* num_ext_resources    */
       
    90     FALSE,                              /* use_sub_resources    */
       
    91     NULL,                               /* widgetNavigable      */
       
    92     NULL,                               /* focusChange          */
       
    93     NULL                                /* wrapper_data         */
       
    94 };
       
    95 
       
    96 VDrawingAreaClassRec vDrawingAreaClassRec = {
       
    97 {
       
    98     /* Core class part */
       
    99 
       
   100     /* superclass         */    (WidgetClass)&xmDrawingAreaClassRec,
       
   101     /* class_name         */    "VDrawingArea",
       
   102     /* widget_size        */    sizeof(VDrawingAreaRec),
       
   103     /* class_initialize   */    NULL,
       
   104     /* class_part_initialize*/  NULL,
       
   105     /* class_inited       */    FALSE,
       
   106     /* initialize         */    NULL,
       
   107     /* initialize_hook    */    NULL,
       
   108     /* realize            */    Realize,
       
   109     /* actions            */    NULL,
       
   110     /* num_actions        */    0,
       
   111     /* resources          */    resources,
       
   112     /* num_resources      */    XtNumber(resources),
       
   113     /* xrm_class          */    NULLQUARK,
       
   114     /* compress_motion    */    FALSE,
       
   115     /* compress_exposure  */    FALSE,
       
   116     /* compress_enterleave*/    FALSE,
       
   117     /* visible_interest   */    FALSE,
       
   118     /* destroy            */    Destroy,
       
   119     /* resize             */    XtInheritResize,
       
   120     /* expose             */    XtInheritExpose,
       
   121     /* set_values         */    SetValues,
       
   122     /* set_values_hook    */    NULL,
       
   123     /* set_values_almost  */    XtInheritSetValuesAlmost,
       
   124     /* get_values_hook    */    NULL,
       
   125     /* accept_focus       */    NULL,
       
   126     /* version            */    XtVersion,
       
   127     /* callback_offsets   */    NULL,
       
   128     /* tm_table           */    NULL,
       
   129     /* query_geometry       */  NULL,
       
   130     /* display_accelerator  */  NULL,
       
   131     /* extension            */  NULL
       
   132   },
       
   133 
       
   134    {            /* composite_class fields */
       
   135       XtInheritGeometryManager,                 /* geometry_manager   */
       
   136       XtInheritChangeManaged,                   /* change_managed     */
       
   137       XtInheritInsertChild,                     /* insert_child       */
       
   138       XtInheritDeleteChild,                     /* delete_child       */
       
   139       NULL,                                     /* extension          */
       
   140    },
       
   141 
       
   142    {            /* constraint_class fields */
       
   143       NULL,                                     /* resource list        */
       
   144       0,                                        /* num resources        */
       
   145       0,                                        /* constraint size      */
       
   146       NULL,                                     /* init proc            */
       
   147       NULL,                                     /* destroy proc         */
       
   148       NULL,                                     /* set values proc      */
       
   149       NULL,                                     /* extension            */
       
   150    },
       
   151 
       
   152    {            /* manager_class fields */
       
   153       XtInheritTranslations,                    /* translations           */
       
   154       NULL,                                     /* syn_resources          */
       
   155       0,                                        /* num_get_resources      */
       
   156       NULL,                                     /* syn_cont_resources     */
       
   157       0,                                        /* num_get_cont_resources */
       
   158       XmInheritParentProcess,                   /* parent_process         */
       
   159       NULL,                                     /* extension           */
       
   160    },
       
   161 
       
   162    {            /* drawingArea class */
       
   163            /* extension */      NULL
       
   164    },
       
   165 
       
   166    /* VDrawingArea class part */
       
   167    {
       
   168         /* extension    */      NULL
       
   169    }
       
   170 };
       
   171 
       
   172 WidgetClass vDrawingAreaClass = (WidgetClass)&vDrawingAreaClassRec;
       
   173 
       
   174 static Boolean
       
   175 SetValues(cw, rw, nw, args, num_args)
       
   176     Widget cw;
       
   177     Widget rw;
       
   178     Widget nw;
       
   179     ArgList args;
       
   180     Cardinal *num_args;
       
   181 {
       
   182     VDrawingAreaWidget current = (VDrawingAreaWidget)cw;
       
   183     VDrawingAreaWidget new_w = (VDrawingAreaWidget)nw;
       
   184 
       
   185     if (new_w->vdrawing_area.visual != current->vdrawing_area.visual) {
       
   186         new_w->vdrawing_area.visual = current->vdrawing_area.visual;
       
   187 #ifdef DEBUG
       
   188         fprintf(stdout, "VDrawingArea.SetValues: can't change visual from: visualID=%ld to visualID=%ld\n",
       
   189                      current->vdrawing_area.visual->visualid,
       
   190                      new_w->vdrawing_area.visual->visualid);
       
   191 #endif
       
   192 
       
   193     }
       
   194 
       
   195     return (False);
       
   196 }
       
   197 
       
   198 int
       
   199 FindWindowInList (Window parentWindow, Window *colormap_windows, int count)
       
   200 {
       
   201     int i;
       
   202 
       
   203     for (i = 0; i < count; i++)
       
   204         if (colormap_windows [i] == parentWindow)
       
   205            return i;
       
   206     return -1;
       
   207 }
       
   208 
       
   209 static void
       
   210 Realize(w, value_mask, attributes)
       
   211     Widget               w;
       
   212     XtValueMask          *value_mask;
       
   213     XSetWindowAttributes *attributes;
       
   214 {
       
   215     Widget parent;
       
   216     Status status;
       
   217     Window *colormap_windows;
       
   218     Window *new_colormap_windows;
       
   219     int count;
       
   220     int i;
       
   221     VDrawingAreaWidget vd = (VDrawingAreaWidget)w;
       
   222 
       
   223 #ifdef DEBUG
       
   224     fprintf(stdout, "VDrawingArea.Realize: visualID=%ld, depth=%d\n",
       
   225                         vd->vdrawing_area.visual->visualid, w->core.depth);
       
   226 #endif
       
   227 
       
   228     /* 4328588:
       
   229      * Since we have our own Realize() function, we don't execute the one for
       
   230      * our super-super class, XmManager, and miss the code which checks that
       
   231      * height and width != 0.  I've added that here.  -bchristi
       
   232      */
       
   233     if (!XtWidth(w)) XtWidth(w) = 1 ;
       
   234     if (!XtHeight(w)) XtHeight(w) = 1 ;
       
   235 
       
   236     w->core.window = XCreateWindow (XtDisplay (w), XtWindow (w->core.parent),
       
   237                         w->core.x, w->core.y, w->core.width, w->core.height,
       
   238                         0, w->core.depth, InputOutput,
       
   239                         vd->vdrawing_area.visual,
       
   240                         *value_mask, attributes );
       
   241 
       
   242     /* Need to add this window to the list of Colormap windows */
       
   243     parent = XtParent (w);
       
   244     while ((parent != NULL) && (!(XtIsShell (parent))))
       
   245         parent = XtParent (parent);
       
   246     if (parent == NULL) {
       
   247         fprintf (stderr, "NO TopLevel widget?!\n");
       
   248         return;
       
   249     }
       
   250 
       
   251     status = XGetWMColormapWindows (XtDisplay (w), XtWindow (parent),
       
   252                                     &colormap_windows, &count);
       
   253 
       
   254     /* If status is zero, add this window and shell to the list
       
   255        of colormap Windows */
       
   256     if (status == 0) {
       
   257         new_colormap_windows = (Window *) calloc (2, sizeof (Window));
       
   258         new_colormap_windows [0] = XtWindow (w);
       
   259         new_colormap_windows [1] = XtWindow (parent);
       
   260         XSetWMColormapWindows (XtDisplay (w), XtWindow (parent),
       
   261                                new_colormap_windows, 2);
       
   262         free (new_colormap_windows);
       
   263     } else {
       
   264         /* Check if parent is already in the list */
       
   265         int parent_entry = -1;
       
   266 
       
   267         if (count > 0)
       
   268             parent_entry = FindWindowInList (XtWindow (parent),
       
   269                                         colormap_windows, count);
       
   270         if (parent_entry == -1) {  /*  Parent not in list  */
       
   271             new_colormap_windows = (Window *) calloc (count + 2,
       
   272                                                 sizeof (Window));
       
   273             new_colormap_windows [0] = XtWindow (w);
       
   274             new_colormap_windows [1] = XtWindow (parent);
       
   275             for (i = 0; i < count; i++)
       
   276                 new_colormap_windows [i + 2] = colormap_windows [i];
       
   277             XSetWMColormapWindows (XtDisplay (w), XtWindow (parent),
       
   278                                    new_colormap_windows, count + 2);
       
   279 
       
   280         } else {        /* parent already in list, just add new window */
       
   281             new_colormap_windows = (Window *) calloc (count + 1,
       
   282                                                 sizeof (Window));
       
   283             new_colormap_windows [0] = XtWindow (w);
       
   284             for (i = 0; i < count; i++)
       
   285                 new_colormap_windows [i + 1] = colormap_windows [i];
       
   286             XSetWMColormapWindows (XtDisplay (w), XtWindow (parent),
       
   287                                    new_colormap_windows, count + 1);
       
   288         }
       
   289         free (new_colormap_windows);
       
   290         XFree (colormap_windows);
       
   291     }
       
   292 
       
   293 
       
   294 }
       
   295 
       
   296 static void
       
   297 Destroy(Widget widget)
       
   298 {
       
   299     Status status;
       
   300     Widget parent;
       
   301     Window *colormap_windows;
       
   302     Window *new_colormap_windows;
       
   303     int count;
       
   304     int listEntry;
       
   305     int i;
       
   306     int j;
       
   307 
       
   308     /* Need to get this window's parent shell first */
       
   309     parent = XtParent (widget);
       
   310     while ((parent != NULL) && (!(XtIsShell (parent))))
       
   311         parent = XtParent (parent);
       
   312     if (parent == NULL) {
       
   313         fprintf (stderr, "NO TopLevel widget?!\n");
       
   314         return;
       
   315     }
       
   316 
       
   317     status = XGetWMColormapWindows (XtDisplay (widget), XtWindow (parent),
       
   318                                     &colormap_windows, &count);
       
   319 
       
   320     /* If status is zero, then there were no colormap windows for
       
   321        the parent ?? */
       
   322 
       
   323     if (status == 0)
       
   324         return;
       
   325 
       
   326     /* Remove this window from the list of colormap windows */
       
   327     listEntry = FindWindowInList (XtWindow (widget), colormap_windows,
       
   328                                   count);
       
   329 
       
   330     new_colormap_windows = (Window *) calloc (count - 1, sizeof (Window));
       
   331     j = 0;
       
   332     for (i = 0; i < count; i++) {
       
   333         if (i == listEntry)
       
   334            continue;
       
   335         new_colormap_windows [j] = colormap_windows [i];
       
   336         j++;
       
   337     }
       
   338     XSetWMColormapWindows (XtDisplay (widget), XtWindow (parent),
       
   339                            new_colormap_windows, count - 1);
       
   340     free (new_colormap_windows);
       
   341     XFree (colormap_windows);
       
   342 
       
   343 }
       
   344 #endif /* !HEADLESS */