Skip to content
Snippets Groups Projects
mywindow.c 8.57 KiB
Newer Older
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation; either version 2, or (at your option)
        any later version.
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
Olivier Fourdan's avatar
Olivier Fourdan committed
        Foundation, Inc., Inc., 51 Franklin Street, Fifth Floor, Boston,
        MA 02110-1301, USA.
Olivier Fourdan's avatar
Olivier Fourdan committed

        xfwm4    - (c) 2002-2008 Olivier Fourdan
Olivier Fourdan's avatar
Olivier Fourdan committed
 */

#ifdef HAVE_CONFIG_H
Olivier Fourdan's avatar
Olivier Fourdan committed
#include "config.h"
Olivier Fourdan's avatar
Olivier Fourdan committed
#endif

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <glib.h>
#include <stdlib.h>
#include <stdio.h>
#include <glib.h>
#include <libxfce4util/libxfce4util.h>
#include "mypixmap.h"
Olivier Fourdan's avatar
Olivier Fourdan committed
#include "mywindow.h"
Olivier Fourdan's avatar
Olivier Fourdan committed
#include "screen.h"

static void
xfwmWindowSetVisual (xfwmWindow * win, Visual *visual, gint depth)
{
Olivier Fourdan's avatar
Olivier Fourdan committed
    g_return_if_fail (win->screen_info != NULL);
    if (visual)
    {
        win->visual = visual;
    }
    else
    {
Olivier Fourdan's avatar
Olivier Fourdan committed
        win->visual = win->screen_info->visual;
    if (depth)
    {
        win->depth = depth;
    }
    else
    {
Olivier Fourdan's avatar
Olivier Fourdan committed
        win->depth = win->screen_info->depth;
xfwmWindowInit (xfwmWindow * win)
Olivier Fourdan's avatar
Olivier Fourdan committed
    g_return_if_fail (win != NULL);
    win->window = None;
    win->map = FALSE;
Olivier Fourdan's avatar
Olivier Fourdan committed
    win->screen_info = NULL;
    win->depth = 0;
    win->width = 1;
    win->height = 1;
Olivier Fourdan's avatar
Olivier Fourdan committed

xfwmWindowCreate (ScreenInfo * screen_info, Visual *visual, gint depth, Window parent,
                  xfwmWindow * win, long eventmask, Cursor cursor)
Olivier Fourdan's avatar
Olivier Fourdan committed
{
    XSetWindowAttributes attributes;
    unsigned long valuemask;

    TRACE ("entering xfwmWindowCreate");
Olivier Fourdan's avatar
Olivier Fourdan committed

Olivier Fourdan's avatar
Olivier Fourdan committed
    g_return_if_fail (screen_info != NULL);
    attributes.event_mask = eventmask;
    valuemask = 0L;
    if (eventmask != NoEventMask)
    {
        valuemask |= CWEventMask;
    }

    win->window = XCreateWindow (myScreenGetXDisplay (screen_info),
                                 parent, 0, 0, 1, 1, 0, 0,
                                 InputOutput, CopyFromParent,
                                 valuemask, &attributes);

    TRACE ("Created XID 0x%lx", win->window);
    if (cursor != None)
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XDefineCursor (myScreenGetXDisplay (screen_info),
Olivier Fourdan's avatar
Olivier Fourdan committed
                       win->window, cursor);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    win->map = FALSE;
Olivier Fourdan's avatar
Olivier Fourdan committed
    win->screen_info = screen_info;
Olivier Fourdan's avatar
Olivier Fourdan committed
    win->x = 0;
    win->y = 0;
    win->width = 1;
    win->height = 1;
    xfwmWindowSetVisual (win, visual, depth);
#ifdef HAVE_RENDER
    win->pict_format = XRenderFindVisualFormat (myScreenGetXDisplay (screen_info), win->visual);
#endif
xfwmWindowDelete (xfwmWindow * win)
Olivier Fourdan's avatar
Olivier Fourdan committed
{
    TRACE ("entering xfwmWindowDelete");
Olivier Fourdan's avatar
Olivier Fourdan committed

Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XDestroyWindow (myScreenGetXDisplay (win->screen_info),
Olivier Fourdan's avatar
Olivier Fourdan committed
                        win->window);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    win->map = FALSE;
}

xfwmWindowShow (xfwmWindow * win, int x, int y, int width, int height,
Olivier Fourdan's avatar
Olivier Fourdan committed
{
    TRACE ("entering xfwmWindowShow");
Olivier Fourdan's avatar
Olivier Fourdan committed

Olivier Fourdan's avatar
Olivier Fourdan committed
    {
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    if ((width < 1) || (height < 1))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        xfwmWindowHide (win);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XMapWindow (myScreenGetXDisplay (win->screen_info),
Olivier Fourdan's avatar
Olivier Fourdan committed
                    win->window);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    TRACE ("Showing XID 0x%lx", win->window);
    if (((x != win->x) || (y != win->y)) && ((width != win->width)
            || (height != win->height)))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XMoveResizeWindow (myScreenGetXDisplay (win->screen_info),
                           win->window, x, y,
Olivier Fourdan's avatar
Olivier Fourdan committed
                           (unsigned int) width,
                           (unsigned int) height);
        win->width = width;
        win->height = height;
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    else if ((x != win->x) || (y != win->y))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XMoveWindow (myScreenGetXDisplay (win->screen_info),
                     win->window,
Olivier Fourdan's avatar
Olivier Fourdan committed
                     x, y);
            XClearWindow (myScreenGetXDisplay (win->screen_info),
Olivier Fourdan's avatar
Olivier Fourdan committed
                          win->window);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    else if ((width != win->width) || (height != win->height))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XResizeWindow (myScreenGetXDisplay (win->screen_info),
                       win->window,
Olivier Fourdan's avatar
Olivier Fourdan committed
                       (unsigned int) width,
                       (unsigned int) height);
        win->width = width;
        win->height = height;
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        XClearWindow (myScreenGetXDisplay (win->screen_info),
Olivier Fourdan's avatar
Olivier Fourdan committed
                      win->window);
xfwmWindowHide (xfwmWindow * win)
Olivier Fourdan's avatar
Olivier Fourdan committed
{
    TRACE ("entering xfwmWindowHide");
Olivier Fourdan's avatar
Olivier Fourdan committed

Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        g_assert (win->window);
Olivier Fourdan's avatar
Olivier Fourdan committed
        XUnmapWindow (myScreenGetXDisplay (win->screen_info), win->window);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
}
xfwmWindowVisible (xfwmWindow *win)
{
    g_return_val_if_fail (win, FALSE);
Olivier Fourdan's avatar
Olivier Fourdan committed
}
xfwmWindowDeleted (xfwmWindow *win)
    return (win->window == None);
Olivier Fourdan's avatar
Olivier Fourdan committed
}
void
xfwmWindowTemp (ScreenInfo *screen_info, Visual *visual,
Olivier Fourdan's avatar
Olivier Fourdan committed
                gint depth, Window parent,
                xfwmWindow * win,
                int x, int y, int width, int height,
{
    XSetWindowAttributes attributes;

    attributes.event_mask = eventmask;
    attributes.override_redirect = TRUE;
    win->window = XCreateWindow (myScreenGetXDisplay (screen_info),
                                 parent, x, y, width, height, 0, 0,
Olivier Fourdan's avatar
Olivier Fourdan committed
                                 InputOnly, CopyFromParent,
                                 CWEventMask | CWOverrideRedirect,
Olivier Fourdan's avatar
Olivier Fourdan committed
                                 &attributes);
    if (bottom)
    {
        XLowerWindow (myScreenGetXDisplay (screen_info), win->window);
    }
    else
    {
        XRaiseWindow (myScreenGetXDisplay (screen_info), win->window);
    }
    XMapWindow (myScreenGetXDisplay (screen_info), win->window);
Olivier Fourdan's avatar
Olivier Fourdan committed
    XFlush (myScreenGetXDisplay (screen_info));
Olivier Fourdan's avatar
Olivier Fourdan committed
    win->screen_info = screen_info;
    win->width = width;
    win->height = height;
    xfwmWindowSetVisual (win, visual, depth);
static gboolean
xfwmWindowCopyComposite (xfwmWindow * win, xfwmPixmap * pix)
    if (myDisplayHaveRender (win->screen_info->display_info))
        Pixmap temp;

Olivier Fourdan's avatar
Olivier Fourdan committed
            TRACE ("xfwmWindowCopyComposite: Pixmap picture does not exist");
            return FALSE;
        }

        if (!win->pict_format)
            TRACE ("xfwmWindowCopyComposite: Window picture format is unknown");
        temp = XCreatePixmap (myScreenGetXDisplay (win->screen_info),
                              win->window,
Olivier Fourdan's avatar
Olivier Fourdan committed
                              pix->width, pix->height, win->depth);
        pict = XRenderCreatePicture (myScreenGetXDisplay (win->screen_info),
                                     temp, win->pict_format, 0, NULL);
        if (!pict)
        {
            XFreePixmap (myScreenGetXDisplay (win->screen_info), temp);
            return FALSE;
        }

        XRenderComposite (myScreenGetXDisplay (win->screen_info), PictOpSrc, pix->pict, None, pict, 0, 0, 0, 0, 0, 0, pix->width, pix->height);
        XRenderFreePicture (myScreenGetXDisplay (win->screen_info), pict);
Olivier Fourdan's avatar
Olivier Fourdan committed
        XSetWindowBackgroundPixmap (myScreenGetXDisplay (win->screen_info), win->window, temp);
Olivier Fourdan's avatar
Olivier Fourdan committed
        XFreePixmap (myScreenGetXDisplay (win->screen_info), temp);
    return FALSE;
}

void
xfwmWindowSetBG (xfwmWindow * win, xfwmPixmap * pix)
{
Olivier Fourdan's avatar
Olivier Fourdan committed
    gboolean done;

    if ((win->width < 1) || (win->height < 1) || (pix->width < 1) || (pix->height < 1))
    {
        return;
    }

Olivier Fourdan's avatar
Olivier Fourdan committed
    done = FALSE;
    if ((win->visual != win->screen_info->visual) ||
        (win->depth  != win->screen_info->depth))
    {
Olivier Fourdan's avatar
Olivier Fourdan committed
        /* Try to use Render */
        done = xfwmWindowCopyComposite (win, pix);
Olivier Fourdan's avatar
Olivier Fourdan committed

    if (!done)
    {
        /* Use the good old way */
        XSetWindowBackgroundPixmap (myScreenGetXDisplay (win->screen_info), win->window, pix->pixmap);
    }