/* Copyright (C) 2001 Johan Rydberg. All Rights Reserved. This file is part of Crust. 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 of the License, 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 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "SXServerConnection.h" #include "SFLayer.h" #include "crust-client.h" #include #include "priv.h" /* Private functions. */ static SFLayerRef _SFLayerAllocate (void); CFTypeID _SFLayerTypeID; /* This is called when we lose all references to a layer instance. We destroy all resources. */ static void layer_died (void *instp) { SFLayerRef layer = instp; if (layer->layer_port) mach_port_deallocate (mach_task_self (), layer->layer_port); if (layer->parent_layer) SFLayerRelease (layer->parent_layer); } /* CoreFoundation runtime class for SFLayer. */ CFRuntimeClass _SFLayerRuntimeClass = { 0, /* version */ "SFLayer", /* Name of class. */ sizeof (struct SFLayer), /* Instance size. */ 0, /* Init function. */ layer_died /* Final function. */ }; static void initialize_layer_runtime (void) __attribute__ ((constructor)); /* Initialize runtime class for SFLayer. This has a "constructor" attribute so that is should be called at initialization time. */ static void initialize_layer_runtime (void) { _SFLayerTypeID = CFRuntimeRegisterClass (&_SFLayerRuntimeClass); } /* Internal function to allocate a new layer instance. */ static SFLayerRef _SFLayerAllocate (void) { return (SFLayerRef) CFRuntimeCreateInstance (_SFLayerTypeID); } /* Return size of LAYER. */ GFSize SFLayerSize (SFLayerRef layer) { return layer->position.size; } /* Create a new layer from PORT. Used when constructing a layer from a native toplevel layer. Layer is returned. */ static SFLayerRef construct_layer_from_port (mach_port_t port) { int x, y, width, height; SFLayerRef layer; error_t err; err = _layer_get_geometry (port, &x, &y, &width, &height); if (err) return 0; layer = (SFLayerRef) CFRuntimeCreateInstance (_SFLayerTypeID); if (! layer) return 0; layer->layer_port = port; layer->position = GFRectMake (x, y, width, height); return layer; } /* Insert SURFACE into LAYER at point P. */ void SFLayerInsertSurface (SFLayerRef layer, SFSurfaceRef surface, GFPoint p) { int err; err = _layer_insert_surface (layer->layer_port, surface->surface_port, (int) p.x, (int) p.y); if (err) CFLog ("*** SFLayerInsertSurface: Failed to insert surface\n"); surface->position.origin = p; } SFLayerRef SFLayerCreate (SFLayerRef parent, GFRect rect) { SFLayerRef layer = _SFLayerAllocate (); int err; if (!layer || !parent) return 0; err = _layer_create (parent->layer_port, (int) rect.origin.x, (int) rect.origin.y, (int) rect.size.width, (int) rect.size.height, 1, &layer->layer_port); if (err) return 0; layer->parent_layer = parent; layer->position = rect; return layer; } /* Returns a reference to toplevel layer for layer level LEVEL. This returns the REAL toplevel layer - i.e., not the one we fetches from the application manager. Note: Really, the only user of this function is the application function. ??? should this be a server extention function? */ SFLayerRef SFLayerGetRealToplevel (int level) { mach_port_t server_port, port; error_t err; server_port = SXGetServerConnection (); if (! server_port) return 0; err = _layer_get_toplevel (server_port, level, &port); if (err) return 0; return construct_layer_from_port (port); } /* Returns a reference to toplevel layer from layer level LEVEL. */ SFLayerRef SFLayerGetToplevel (int level) { /* ??? implement. */ return SFLayerGetRealToplevel (level); } /* Returns a reference to parent layer to LAYER. */ SFLayerRef SFLayerGetParent (SFLayerRef layer) { SFLayerRef parent = layer->parent_layer; SFLayerRetain (parent); return parent; } /* Retain a reference to LAYER. */ void SFLayerRetain (SFLayerRef layer) { CFRetain (layer); } /* Release a reference to LAYER. */ void SFLayerRelease (SFLayerRef layer) { CFRelease (layer); } void SFLayerMap (SFLayerRef layer) { _layer_map (layer->layer_port); } void SFLayerUnmap (SFLayerRef layer) { } void SFLayerMove (SFLayerRef layer, int x, int y) { _layer_move (layer->layer_port, x, y); } void SFLayerMoveRelative (SFLayerRef layer, int dx, int dy) { _layer_move (layer->layer_port, (int) layer->position.origin.x + dx, (int) layer->position.origin.y + dy); layer->position.origin.x += (float) dx; layer->position.origin.y += (float) dy; }