|
Packit |
98cdb6 |
/* GDK - The GIMP Drawing Kit
|
|
Packit |
98cdb6 |
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
98cdb6 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
98cdb6 |
* License as published by the Free Software Foundation; either
|
|
Packit |
98cdb6 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
98cdb6 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
98cdb6 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
98cdb6 |
* Lesser General Public License for more details.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
98cdb6 |
* License along with this library; if not, write to the
|
|
Packit |
98cdb6 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
98cdb6 |
* Boston, MA 02111-1307, USA.
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/*
|
|
Packit |
98cdb6 |
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
|
Packit |
98cdb6 |
* file for a list of people on the GTK+ Team.
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/*
|
|
Packit |
98cdb6 |
* GTK+ DirectFB backend
|
|
Packit |
98cdb6 |
* Copyright (C) 2001-2002 convergence integrated media GmbH
|
|
Packit |
98cdb6 |
* Copyright (C) 2002-2004 convergence GmbH
|
|
Packit |
98cdb6 |
* Written by Denis Oliver Kropp <dok@convergence.de> and
|
|
Packit |
98cdb6 |
* Sven Neumann <sven@convergence.de>
|
|
Packit |
98cdb6 |
*/
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include "config.h"
|
|
Packit |
98cdb6 |
#include "gdk.h" /* For gdk_rectangle_intersect */
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include "gdkdirectfb.h"
|
|
Packit |
98cdb6 |
#include "gdkprivate-directfb.h"
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#include "gdkinternals.h"
|
|
Packit |
98cdb6 |
#include "gdkalias.h"
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
void
|
|
Packit |
98cdb6 |
_gdk_directfb_window_get_offsets (GdkWindow *window,
|
|
Packit |
98cdb6 |
gint *x_offset,
|
|
Packit |
98cdb6 |
gint *y_offset)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
if (x_offset)
|
|
Packit |
98cdb6 |
*x_offset = 0;
|
|
Packit |
98cdb6 |
if (y_offset)
|
|
Packit |
98cdb6 |
*y_offset = 0;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gboolean
|
|
Packit |
98cdb6 |
_gdk_windowing_window_queue_antiexpose (GdkWindow *window,
|
|
Packit |
98cdb6 |
GdkRegion *area)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
return FALSE;
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/**
|
|
Packit |
98cdb6 |
* gdk_window_scroll:
|
|
Packit |
98cdb6 |
* @window: a #GdkWindow
|
|
Packit |
98cdb6 |
* @dx: Amount to scroll in the X direction
|
|
Packit |
98cdb6 |
* @dy: Amount to scroll in the Y direction
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* Scroll the contents of its window, both pixels and children, by
|
|
Packit |
98cdb6 |
* the given amount. Portions of the window that the scroll operation
|
|
Packit |
98cdb6 |
* brings in from offscreen areas are invalidated.
|
|
Packit |
98cdb6 |
**/
|
|
Packit |
98cdb6 |
void
|
|
Packit |
98cdb6 |
_gdk_directfb_window_scroll (GdkWindow *window,
|
|
Packit |
98cdb6 |
gint dx,
|
|
Packit |
98cdb6 |
gint dy)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GdkWindowObject *private;
|
|
Packit |
98cdb6 |
GdkDrawableImplDirectFB *impl;
|
|
Packit |
98cdb6 |
GdkRegion *invalidate_region = NULL;
|
|
Packit |
98cdb6 |
GList *list;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_return_if_fail (GDK_IS_WINDOW (window));
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (GDK_WINDOW_DESTROYED (window))
|
|
Packit |
98cdb6 |
return;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
private = GDK_WINDOW_OBJECT (window);
|
|
Packit |
98cdb6 |
impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (dx == 0 && dy == 0)
|
|
Packit |
98cdb6 |
return;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* Move the current invalid region */
|
|
Packit |
98cdb6 |
if (private->update_area)
|
|
Packit |
98cdb6 |
gdk_region_offset (private->update_area, dx, dy);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (GDK_WINDOW_IS_MAPPED (window))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GdkRectangle clip_rect = { 0, 0, impl->width, impl->height };
|
|
Packit |
98cdb6 |
GdkRectangle rect = { dx, dy, impl->width, impl->height };
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
invalidate_region = gdk_region_rectangle (&clip_rect);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (gdk_rectangle_intersect (&rect, &clip_rect, &rect) &&
|
|
Packit |
98cdb6 |
(!private->update_area ||
|
|
Packit |
98cdb6 |
!gdk_region_rect_in (private->update_area, &rect)))
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GdkRegion *region;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
region = gdk_region_rectangle (&rect);
|
|
Packit |
98cdb6 |
gdk_region_subtract (invalidate_region, region);
|
|
Packit |
98cdb6 |
gdk_region_destroy (region);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (impl->surface)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
DFBRegion update = { rect.x, rect.y,
|
|
Packit |
98cdb6 |
rect.x + rect.width - 1,
|
|
Packit |
98cdb6 |
rect.y + rect.height - 1 };
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
impl->surface->SetClip (impl->surface, &update);
|
|
Packit |
98cdb6 |
impl->surface->Blit (impl->surface, impl->surface, NULL, dx, dy);
|
|
Packit |
98cdb6 |
impl->surface->SetClip (impl->surface, NULL);
|
|
Packit |
98cdb6 |
impl->surface->Flip (impl->surface, &update, 0);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
for (list = private->children; list; list = list->next)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GdkWindowObject *obj = GDK_WINDOW_OBJECT (list->data);
|
|
Packit |
98cdb6 |
GdkDrawableImplDirectFB *obj_impl = GDK_DRAWABLE_IMPL_DIRECTFB (obj->impl);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
_gdk_directfb_move_resize_child (list->data,
|
|
Packit |
98cdb6 |
obj->x + dx,
|
|
Packit |
98cdb6 |
obj->y + dy,
|
|
Packit |
98cdb6 |
obj_impl->width,
|
|
Packit |
98cdb6 |
obj_impl->height);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (invalidate_region)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gdk_window_invalidate_region (window, invalidate_region, TRUE);
|
|
Packit |
98cdb6 |
gdk_region_destroy (invalidate_region);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/**
|
|
Packit |
98cdb6 |
* gdk_window_move_region:
|
|
Packit |
98cdb6 |
* @window: a #GdkWindow
|
|
Packit |
98cdb6 |
* @region: The #GdkRegion to move
|
|
Packit |
98cdb6 |
* @dx: Amount to move in the X direction
|
|
Packit |
98cdb6 |
* @dy: Amount to move in the Y direction
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* Move the part of @window indicated by @region by @dy pixels in the Y
|
|
Packit |
98cdb6 |
* direction and @dx pixels in the X direction. The portions of @region
|
|
Packit |
98cdb6 |
* that not covered by the new position of @region are invalidated.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* Child windows are not moved.
|
|
Packit |
98cdb6 |
*
|
|
Packit |
98cdb6 |
* Since: 2.8
|
|
Packit |
98cdb6 |
**/
|
|
Packit |
98cdb6 |
void
|
|
Packit |
98cdb6 |
_gdk_directfb_window_move_region (GdkWindow *window,
|
|
Packit |
98cdb6 |
const GdkRegion *region,
|
|
Packit |
98cdb6 |
gint dx,
|
|
Packit |
98cdb6 |
gint dy)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
GdkWindowObject *private;
|
|
Packit |
98cdb6 |
GdkDrawableImplDirectFB *impl;
|
|
Packit |
98cdb6 |
GdkRegion *window_clip;
|
|
Packit |
98cdb6 |
GdkRegion *src_region;
|
|
Packit |
98cdb6 |
GdkRegion *brought_in;
|
|
Packit |
98cdb6 |
GdkRegion *dest_region;
|
|
Packit |
98cdb6 |
GdkRegion *moving_invalid_region;
|
|
Packit |
98cdb6 |
GdkRectangle dest_extents;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
g_return_if_fail (GDK_IS_WINDOW (window));
|
|
Packit |
98cdb6 |
g_return_if_fail (region != NULL);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (GDK_WINDOW_DESTROYED (window))
|
|
Packit |
98cdb6 |
return;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
private = GDK_WINDOW_OBJECT (window);
|
|
Packit |
98cdb6 |
impl = GDK_DRAWABLE_IMPL_DIRECTFB (private->impl);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
if (dx == 0 && dy == 0)
|
|
Packit |
98cdb6 |
return;
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
GdkRectangle clip_rect = { 0, 0, impl->width, impl->height };
|
|
Packit |
98cdb6 |
window_clip = gdk_region_rectangle (&clip_rect);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* compute source regions */
|
|
Packit |
98cdb6 |
src_region = gdk_region_copy (region);
|
|
Packit |
98cdb6 |
brought_in = gdk_region_copy (region);
|
|
Packit |
98cdb6 |
gdk_region_intersect (src_region, window_clip);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gdk_region_subtract (brought_in, src_region);
|
|
Packit |
98cdb6 |
gdk_region_offset (brought_in, dx, dy);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* compute destination regions */
|
|
Packit |
98cdb6 |
dest_region = gdk_region_copy (src_region);
|
|
Packit |
98cdb6 |
gdk_region_offset (dest_region, dx, dy);
|
|
Packit |
98cdb6 |
gdk_region_intersect (dest_region, window_clip);
|
|
Packit |
98cdb6 |
gdk_region_get_clipbox (dest_region, &dest_extents);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
gdk_region_destroy (window_clip);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* calculating moving part of current invalid area */
|
|
Packit |
98cdb6 |
moving_invalid_region = NULL;
|
|
Packit |
98cdb6 |
if (private->update_area)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
moving_invalid_region = gdk_region_copy (private->update_area);
|
|
Packit |
98cdb6 |
gdk_region_intersect (moving_invalid_region, src_region);
|
|
Packit |
98cdb6 |
gdk_region_offset (moving_invalid_region, dx, dy);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* invalidate all of the src region */
|
|
Packit |
98cdb6 |
gdk_window_invalidate_region (window, src_region, FALSE);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* un-invalidate destination region */
|
|
Packit |
98cdb6 |
if (private->update_area)
|
|
Packit |
98cdb6 |
gdk_region_subtract (private->update_area, dest_region);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* invalidate moving parts of existing update area */
|
|
Packit |
98cdb6 |
if (moving_invalid_region)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
gdk_window_invalidate_region (window, moving_invalid_region, FALSE);
|
|
Packit |
98cdb6 |
gdk_region_destroy (moving_invalid_region);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* invalidate area brought in from off-screen */
|
|
Packit |
98cdb6 |
gdk_window_invalidate_region (window, brought_in, FALSE);
|
|
Packit |
98cdb6 |
gdk_region_destroy (brought_in);
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
/* Actually do the moving */
|
|
Packit |
98cdb6 |
if (impl->surface)
|
|
Packit |
98cdb6 |
{
|
|
Packit |
98cdb6 |
DFBRectangle source = { dest_extents.x - dx,
|
|
Packit |
98cdb6 |
dest_extents.y - dy,
|
|
Packit |
98cdb6 |
dest_extents.width,
|
|
Packit |
98cdb6 |
dest_extents.height};
|
|
Packit |
98cdb6 |
DFBRegion destination = { dest_extents.x,
|
|
Packit |
98cdb6 |
dest_extents.y,
|
|
Packit |
98cdb6 |
dest_extents.x + dest_extents.width - 1,
|
|
Packit |
98cdb6 |
dest_extents.y + dest_extents.height - 1};
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
impl->surface->SetClip (impl->surface, &destination);
|
|
Packit |
98cdb6 |
impl->surface->Blit (impl->surface, impl->surface, &source, dx, dy);
|
|
Packit |
98cdb6 |
impl->surface->SetClip (impl->surface, NULL);
|
|
Packit |
98cdb6 |
impl->surface->Flip (impl->surface, &destination, 0);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
gdk_region_destroy (src_region);
|
|
Packit |
98cdb6 |
gdk_region_destroy (dest_region);
|
|
Packit |
98cdb6 |
}
|
|
Packit |
98cdb6 |
|
|
Packit |
98cdb6 |
#define __GDK_GEOMETRY_X11_C__
|
|
Packit |
98cdb6 |
#include "gdkaliasdef.c"
|