/* gtkDPScontext.c * Copyright (C) 1997, 1998, 1999 GYVE Development Team * * Author: Terumoto 'tel' HAYAKAWA * Created: * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include "gtkDPScontext.h" static GtkDataClass *parent_class; enum { ENTER_CONTEXT, LEAVE_CONTEXT, LAST_SIGNAL }; static gint dps_context_signals[LAST_SIGNAL] = { 0 }; typedef void (*GtkDPSContextSignal) (GtkObject *object, gpointer raw_ctxt, gpointer data); static void gtk_dps_context_marshal_signal (GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args); static void gtk_dps_context_class_init (GtkDPSContextClass *klass); static void gtk_dps_context_init (GtkDPSContext *gtk_dps_context); static void gtk_real_dps_context_enter_context (GtkDPSContext *gtk_dps_context, DPSContext raw_ctxt); static void gtk_real_dps_context_leave_context (GtkDPSContext *gtk_dps_context, DPSContext raw_ctxt); static void gtk_dps_context_destroy (GtkObject * object); guint gtk_dps_context_get_type () { static guint gtk_dps_context_type = 0; if (!gtk_dps_context_type) { static const GtkTypeInfo gtk_dps_context_info = { "GtkDPSContext", sizeof (GtkDPSContext), sizeof (GtkDPSContextClass), (GtkClassInitFunc) gtk_dps_context_class_init, (GtkObjectInitFunc) gtk_dps_context_init, (GtkArgSetFunc) NULL, (GtkArgGetFunc) NULL, }; gtk_dps_context_type = gtk_type_unique (gtk_data_get_type (), >k_dps_context_info); } return gtk_dps_context_type; } static void gtk_dps_context_class_init (GtkDPSContextClass *klass) { GtkObjectClass *object_class; object_class = (GtkObjectClass*) klass; parent_class = gtk_type_class (gtk_data_get_type ()); dps_context_signals[ENTER_CONTEXT] = gtk_signal_new ("enter_context", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (GtkDPSContextClass, enter_context), gtk_dps_context_marshal_signal, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); dps_context_signals[LEAVE_CONTEXT] = gtk_signal_new ("leave_context", GTK_RUN_FIRST, object_class->type, GTK_SIGNAL_OFFSET (GtkDPSContextClass, leave_context), gtk_dps_context_marshal_signal, GTK_TYPE_NONE, 1, GTK_TYPE_POINTER); gtk_object_class_add_signals (object_class, dps_context_signals, LAST_SIGNAL); klass->enter_context = gtk_real_dps_context_enter_context; klass->leave_context = gtk_real_dps_context_leave_context; object_class->destroy = gtk_dps_context_destroy; } static void gtk_dps_context_init (GtkDPSContext *gtk_dps_context) { gtk_dps_context->gdk_dps_context = NULL; gtk_dps_context->entered = FALSE; } static void gtk_dps_context_marshal_signal (GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args) { GtkDPSContextSignal rfunc; DPSContext raw_ctxt = GTK_VALUE_POINTER (args[0]); rfunc = (GtkDPSContextSignal) func; (* rfunc) (object, raw_ctxt, func_data); } GtkObject* gtk_dps_context_new (GdkDrawable *drawable) { GtkDPSContext *gtk_dps_context; GtkObject * result; gtk_dps_context = gtk_type_new (gtk_dps_context_get_type ()); gtk_dps_context->gdk_dps_context = gdk_dps_context_new(drawable); result = GTK_OBJECT (gtk_dps_context); g_return_val_if_fail(gtk_dps_context->gdk_dps_context, result); return result; } GtkObject* gtk_dps_context_get_shared (void) { return gtk_dps_context_new(NULL); } void gtk_dps_context_set_drawable(GtkDPSContext * ctxt, GdkDrawable * drawable) { g_return_if_fail (ctxt); g_return_if_fail(drawable); g_return_if_fail(GTK_IS_DPS_CONTEXT(ctxt)); gdk_dps_context_set_drawable(ctxt->gdk_dps_context, drawable); gtk_dps_context_flush(ctxt); } GdkDrawable * gtk_dps_context_get_drawable(GtkDPSContext * ctxt) { g_return_val_if_fail (ctxt, NULL); g_return_val_if_fail(GTK_IS_DPS_CONTEXT(ctxt), NULL); return gdk_dps_context_get_drawable(ctxt->gdk_dps_context); } void gtk_dps_context_flush(GtkDPSContext * ctxt) { g_return_if_fail (ctxt); gdk_dps_context_flush(ctxt->gdk_dps_context); } static void gtk_real_dps_context_enter_context (GtkDPSContext *gtk_dps_context, DPSContext raw_ctxt) { g_return_if_fail(gtk_dps_context->entered == FALSE); gtk_dps_context->entered = TRUE; } static void gtk_real_dps_context_leave_context (GtkDPSContext *gtk_dps_context, DPSContext raw_ctxt) { g_return_if_fail(gtk_dps_context->entered == TRUE); gtk_dps_context->entered = FALSE; } DPSContext gtk_dps_context_enter_context (GtkDPSContext *gtk_dps_context) { DPSContext raw_ctxt; g_return_val_if_fail(gtk_dps_context != NULL, 0); g_return_val_if_fail(GTK_IS_DPS_CONTEXT (gtk_dps_context), 0); g_return_val_if_fail(gtk_dps_context->gdk_dps_context, 0); raw_ctxt = gdk_dps_context_get_raw_context(gtk_dps_context->gdk_dps_context); gtk_signal_emit(GTK_OBJECT (gtk_dps_context), dps_context_signals[ENTER_CONTEXT], raw_ctxt); return raw_ctxt; } GdkGC* gtk_dps_context_get_gc (GtkDPSContext * gtk_dps_context) { g_return_val_if_fail(gtk_dps_context != NULL, NULL); g_return_val_if_fail(GTK_IS_DPS_CONTEXT (gtk_dps_context), NULL); return gdk_dps_context_get_gc(gtk_dps_context->gdk_dps_context); } void gtk_dps_context_update_coordtr(GtkDPSContext * gtk_dps_context, GdkDPSCoordtr * coordtr) { g_return_if_fail(gtk_dps_context != NULL); g_return_if_fail(GTK_IS_DPS_CONTEXT (gtk_dps_context)); g_return_if_fail(gtk_dps_context->gdk_dps_context); g_return_if_fail(coordtr); gdk_dps_context_update_coordtr(gtk_dps_context->gdk_dps_context, coordtr); } gboolean gtk_dps_context_try_update_coordtr(GtkDPSContext * gtk_dps_context, GdkDPSCoordtr * coordtr) { g_return_val_if_fail(gtk_dps_context != NULL, FALSE); g_return_val_if_fail(GTK_IS_DPS_CONTEXT (gtk_dps_context), FALSE); g_return_val_if_fail(gtk_dps_context->gdk_dps_context, FALSE); g_return_val_if_fail(coordtr, FALSE); return gdk_dps_context_try_update_coordtr(gtk_dps_context->gdk_dps_context, coordtr); } void gtk_dps_context_leave_context (GtkDPSContext *gtk_dps_context) { DPSContext raw_ctxt; g_return_if_fail(gtk_dps_context != NULL); g_return_if_fail(GTK_IS_DPS_CONTEXT (gtk_dps_context)); g_return_if_fail(gtk_dps_context->gdk_dps_context); raw_ctxt = gdk_dps_context_get_raw_context(gtk_dps_context->gdk_dps_context); gtk_signal_emit(GTK_OBJECT (gtk_dps_context), dps_context_signals[LEAVE_CONTEXT], raw_ctxt); return; } static void gtk_dps_context_destroy (GtkObject * object) { GtkDPSContext * ctxt; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_DPS_CONTEXT (object)); ctxt = GTK_DPS_CONTEXT(object); g_return_if_fail (ctxt->gdk_dps_context); if (!gdk_dps_context_is_shared(ctxt->gdk_dps_context)) gdk_dps_context_free(ctxt->gdk_dps_context); ctxt->gdk_dps_context = NULL; if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); }