src/video/x11/SDL_x11shape.c
author Sam Lantinga <slouken@libsdl.org>
Sat, 12 Mar 2011 13:21:57 -0800
changeset 5481 22dfc3958dc3
parent 4851 5624fb0190b5
child 5535 96594ac5fd1a
permissions -rw-r--r--
Fixed so code will compile with SDL_config_minimal.h
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 2010 Eli Gottlieb
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 of the License, or (at your option) any later version.
     9 
    10     This library is distributed in the hope that it will be useful,
    11     but WITHOUT ANY WARRANTY; without even the implied warranty of
    12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Eli Gottlieb
    20     eligottlieb@gmail.com
    21 */
    22 #include "SDL_config.h"
    23 
    24 #if SDL_VIDEO_DRIVER_X11
    25 
    26 #include "SDL_assert.h"
    27 #include "SDL_x11video.h"
    28 #include "SDL_x11shape.h"
    29 #include "SDL_x11window.h"
    30 
    31 SDL_Window*
    32 X11_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) {
    33     return SDL_CreateWindow(title,x,y,w,h,flags);
    34 }
    35 
    36 SDL_WindowShaper*
    37 X11_CreateShaper(SDL_Window* window) {
    38     SDL_WindowShaper* result = NULL;
    39 
    40 #if SDL_VIDEO_DRIVER_X11_XSHAPE
    41     if (SDL_X11_HAVE_XSHAPE) {  /* Make sure X server supports it. */
    42         result = malloc(sizeof(SDL_WindowShaper));
    43         result->window = window;
    44         result->mode.mode = ShapeModeDefault;
    45         result->mode.parameters.binarizationCutoff = 1;
    46         result->userx = result->usery = 0;
    47         SDL_ShapeData* data = SDL_malloc(sizeof(SDL_ShapeData));
    48         result->driverdata = data;
    49         data->bitmapsize = 0;
    50         data->bitmap = NULL;
    51         window->shaper = result;
    52         int resized_properly = X11_ResizeWindowShape(window);
    53         SDL_assert(resized_properly == 0);
    54     }
    55 #endif
    56 
    57     return result;
    58 }
    59 
    60 int
    61 X11_ResizeWindowShape(SDL_Window* window) {
    62     SDL_ShapeData* data = window->shaper->driverdata;
    63     SDL_assert(data != NULL);
    64     
    65     unsigned int bitmapsize = window->w / 8;
    66     if(window->w % 8 > 0)
    67         bitmapsize += 1;
    68     bitmapsize *= window->h;
    69     if(data->bitmapsize != bitmapsize || data->bitmap == NULL) {
    70         data->bitmapsize = bitmapsize;
    71         if(data->bitmap != NULL)
    72             free(data->bitmap);
    73         data->bitmap = malloc(data->bitmapsize);
    74         if(data->bitmap == NULL) {
    75             SDL_SetError("Could not allocate memory for shaped-window bitmap.");
    76             return -1;
    77         }
    78     }
    79     memset(data->bitmap,0,data->bitmapsize);
    80     
    81     window->shaper->userx = window->x;
    82     window->shaper->usery = window->y;
    83     SDL_SetWindowPosition(window,-1000,-1000);
    84     
    85     return 0;
    86 }
    87     
    88 int
    89 X11_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) {
    90     if(shaper == NULL || shape == NULL || shaper->driverdata == NULL)
    91         return -1;
    92 
    93 #if SDL_VIDEO_DRIVER_X11_XSHAPE
    94     if(shape->format->Amask == 0 && SDL_SHAPEMODEALPHA(shape_mode->mode))
    95         return -2;
    96     if(shape->w != shaper->window->w || shape->h != shaper->window->h)
    97         return -3;
    98     SDL_ShapeData *data = shaper->driverdata;
    99     
   100     /* Assume that shaper->alphacutoff already has a value, because SDL_SetWindowShape() should have given it one. */
   101     SDL_CalculateShapeBitmap(shaper->mode,shape,data->bitmap,8);
   102         
   103     SDL_WindowData *windowdata = (SDL_WindowData*)(shaper->window->driverdata);
   104     Pixmap shapemask = XCreateBitmapFromData(windowdata->videodata->display,windowdata->xwindow,data->bitmap,shaper->window->w,shaper->window->h);
   105     
   106     XShapeCombineMask(windowdata->videodata->display,windowdata->xwindow, ShapeBounding, 0, 0,shapemask, ShapeSet);
   107     XSync(windowdata->videodata->display,False);
   108 
   109     XFreePixmap(windowdata->videodata->display,shapemask);
   110 #endif
   111 
   112     return 0;
   113 }
   114 
   115 #endif /* SDL_VIDEO_DRIVER_X11 */
   116