⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkwidget.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 5 页
字号:
/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#include <stdarg.h>#include <string.h>#include "gtkcontainer.h"#include "gtkmain.h"#include "gtkrc.h"#include "gtkselection.h"#include "gtksignal.h"#include "gtkwidget.h"#include "gtkwindow.h"#include "gtkbindings.h"#include "gtkprivate.h"#include "gdk/gdk.h"#include "gdk/gdkx.h"#define WIDGET_CLASS(w)	 GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)#define	INIT_PATH_SIZE	(512)enum {  SHOW,  HIDE,  MAP,  UNMAP,  REALIZE,  UNREALIZE,  DRAW,  DRAW_FOCUS,  DRAW_DEFAULT,  SIZE_REQUEST,  SIZE_ALLOCATE,  STATE_CHANGED,  PARENT_SET,  STYLE_SET,  ADD_ACCELERATOR,  REMOVE_ACCELERATOR,  GRAB_FOCUS,  EVENT,  BUTTON_PRESS_EVENT,  BUTTON_RELEASE_EVENT,  MOTION_NOTIFY_EVENT,  DELETE_EVENT,  DESTROY_EVENT,  EXPOSE_EVENT,  KEY_PRESS_EVENT,  KEY_RELEASE_EVENT,  ENTER_NOTIFY_EVENT,  LEAVE_NOTIFY_EVENT,  CONFIGURE_EVENT,  FOCUS_IN_EVENT,  FOCUS_OUT_EVENT,  MAP_EVENT,  UNMAP_EVENT,  PROPERTY_NOTIFY_EVENT,  SELECTION_CLEAR_EVENT,  SELECTION_REQUEST_EVENT,  SELECTION_NOTIFY_EVENT,  SELECTION_GET,  SELECTION_RECEIVED,  PROXIMITY_IN_EVENT,  PROXIMITY_OUT_EVENT,  DRAG_BEGIN,  DRAG_END,  DRAG_DATA_DELETE,  DRAG_LEAVE,  DRAG_MOTION,  DRAG_DROP,  DRAG_DATA_GET,  DRAG_DATA_RECEIVED,  CLIENT_EVENT,  NO_EXPOSE_EVENT,  VISIBILITY_NOTIFY_EVENT,  DEBUG_MSG,  LAST_SIGNAL};enum {  ARG_0,  ARG_NAME,  ARG_PARENT,  ARG_X,  ARG_Y,  ARG_WIDTH,  ARG_HEIGHT,  ARG_VISIBLE,  ARG_SENSITIVE,  ARG_APP_PAINTABLE,  ARG_CAN_FOCUS,  ARG_HAS_FOCUS,  ARG_CAN_DEFAULT,  ARG_HAS_DEFAULT,  ARG_RECEIVES_DEFAULT,  ARG_COMPOSITE_CHILD,  ARG_STYLE,  ARG_EVENTS,  ARG_EXTENSION_EVENTS};typedef	struct	_GtkStateData	 GtkStateData;struct _GtkStateData{  GtkStateType  state;  guint		state_restoration : 1;  guint         parent_sensitive : 1;  guint		use_forall : 1;};static void gtk_widget_class_init		 (GtkWidgetClass    *klass);static void gtk_widget_init			 (GtkWidget	    *widget);static void gtk_widget_set_arg			 (GtkObject         *object,						  GtkArg	    *arg,						  guint		     arg_id);static void gtk_widget_get_arg			 (GtkObject         *object,						  GtkArg	    *arg,						  guint		     arg_id);static void gtk_widget_shutdown			 (GtkObject	    *object);static void gtk_widget_real_destroy		 (GtkObject	    *object);static void gtk_widget_finalize			 (GtkObject	    *object);static void gtk_widget_real_show		 (GtkWidget	    *widget);static void gtk_widget_real_hide		 (GtkWidget	    *widget);static void gtk_widget_real_map			 (GtkWidget	    *widget);static void gtk_widget_real_unmap		 (GtkWidget	    *widget);static void gtk_widget_real_realize		 (GtkWidget	    *widget);static void gtk_widget_real_unrealize		 (GtkWidget	    *widget);static void gtk_widget_real_draw		 (GtkWidget	    *widget,						  GdkRectangle	    *area);static void gtk_widget_real_size_request	 (GtkWidget	    *widget,						  GtkRequisition    *requisition);static void gtk_widget_real_size_allocate	 (GtkWidget	    *widget,						  GtkAllocation	    *allocation);static gint gtk_widget_real_key_press_event      (GtkWidget         *widget,						  GdkEventKey       *event);static gint gtk_widget_real_key_release_event    (GtkWidget         *widget,						  GdkEventKey       *event);static void gtk_widget_style_set		 (GtkWidget	    *widget,						  GtkStyle          *previous_style);static void gtk_widget_real_grab_focus           (GtkWidget         *focus_widget);static void  gtk_widget_redraw_queue_remove       (GtkWidget         *widget);     static GdkColormap* gtk_widget_peek_colormap (void);static GdkVisual*   gtk_widget_peek_visual   (void);static GtkStyle*    gtk_widget_peek_style    (void);static void gtk_widget_reparent_container_child  (GtkWidget     *widget,						  gpointer       client_data);static void gtk_widget_propagate_state		 (GtkWidget	*widget,						  GtkStateData 	*data);static void gtk_widget_set_style_internal	 (GtkWidget	*widget,						  GtkStyle	*style,						  gboolean	 initial_emission);static void gtk_widget_set_style_recurse	 (GtkWidget	*widget,						  gpointer	 client_data);static gboolean gtk_widget_is_offscreen           (GtkWidget     *widget);static GtkWidgetAuxInfo* gtk_widget_aux_info_new     (void);static void		 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);static GtkObjectClass *parent_class = NULL;static guint widget_signals[LAST_SIGNAL] = { 0 };static GMemChunk *aux_info_mem_chunk = NULL;static GdkColormap *default_colormap = NULL;static GdkVisual *default_visual = NULL;static GtkStyle *gtk_default_style = NULL;static GSList *colormap_stack = NULL;static GSList *visual_stack = NULL;static GSList *style_stack = NULL;static guint   composite_child_stack = 0;static GSList *gtk_widget_redraw_queue = NULL;static const gchar *aux_info_key = "gtk-aux-info";static guint        aux_info_key_id = 0;static const gchar *event_key = "gtk-event-mask";static guint        event_key_id = 0;static const gchar *extension_event_key = "gtk-extension-event-mode";static guint        extension_event_key_id = 0;static const gchar *parent_window_key = "gtk-parent-window";static guint        parent_window_key_id = 0;static const gchar *saved_default_style_key = "gtk-saved-default-style";static guint        saved_default_style_key_id = 0;static const gchar *shape_info_key = "gtk-shape-info";static const gchar *colormap_key = "gtk-colormap";static const gchar *visual_key = "gtk-visual";static const gchar *rc_style_key = "gtk-rc-style";static guint        rc_style_key_id = 0;/***************************************** * gtk_widget_get_type: * *   arguments: * *   results: *****************************************/GtkTypegtk_widget_get_type (void){  static GtkType widget_type = 0;    if (!widget_type)    {      static const GtkTypeInfo widget_info =      {	"GtkWidget",	sizeof (GtkWidget),	sizeof (GtkWidgetClass),	(GtkClassInitFunc) gtk_widget_class_init,	(GtkObjectInitFunc) gtk_widget_init,        /* reserved_1 */ NULL,	/* reserved_2 */ NULL,	(GtkClassInitFunc) NULL,      };            widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);    }    return widget_type;}/***************************************** * gtk_widget_class_init: * *   arguments: * *   results: *****************************************/#include "stdio.h"static voidgtk_widget_debug_msg (GtkWidget          *widget,		      const gchar        *string){  fprintf (stderr, "Gtk-DEBUG: %s\n", string);}static voidgtk_widget_class_init (GtkWidgetClass *klass){  GtkObjectClass *object_class;    object_class = (GtkObjectClass*) klass;    parent_class = gtk_type_class (gtk_object_get_type ());    gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);  gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);  gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);  gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);  gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);  gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);  gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);  gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);  gtk_object_add_arg_type ("GtkWidget::app_paintable", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_APP_PAINTABLE);  gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);  gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);  gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);  gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);  gtk_object_add_arg_type ("GtkWidget::receives_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_RECEIVES_DEFAULT);  gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);  gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);  gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);  gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);    widget_signals[SHOW] =    gtk_signal_new ("show",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, show),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[HIDE] =    gtk_signal_new ("hide",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[MAP] =    gtk_signal_new ("map",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, map),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[UNMAP] =    gtk_signal_new ("unmap",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[REALIZE] =    gtk_signal_new ("realize",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[UNREALIZE] =    gtk_signal_new ("unrealize",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[DRAW] =    gtk_signal_new ("draw",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),		    gtk_marshal_NONE__POINTER,		    GTK_TYPE_NONE, 1,		    GTK_TYPE_POINTER);  widget_signals[DRAW_FOCUS] =    gtk_signal_new ("draw_focus",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[DRAW_DEFAULT] =    gtk_signal_new ("draw_default",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[SIZE_REQUEST] =    gtk_signal_new ("size_request",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),		    gtk_marshal_NONE__POINTER,		    GTK_TYPE_NONE, 1,		    GTK_TYPE_POINTER);  widget_signals[SIZE_ALLOCATE] =    gtk_signal_new ("size_allocate",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),		    gtk_marshal_NONE__POINTER,		    GTK_TYPE_NONE, 1,		    GTK_TYPE_POINTER);  widget_signals[STATE_CHANGED] =    gtk_signal_new ("state_changed",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),		    gtk_marshal_NONE__UINT,		    GTK_TYPE_NONE, 1,		    GTK_TYPE_STATE_TYPE);  widget_signals[PARENT_SET] =    gtk_signal_new ("parent_set",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),		    gtk_marshal_NONE__OBJECT,		    GTK_TYPE_NONE, 1,		    GTK_TYPE_OBJECT);  widget_signals[STYLE_SET] =    gtk_signal_new ("style_set",		    GTK_RUN_FIRST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),		    gtk_marshal_NONE__POINTER,		    GTK_TYPE_NONE, 1,		    GTK_TYPE_STYLE);  widget_signals[ADD_ACCELERATOR] =    gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,				GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));  widget_signals[REMOVE_ACCELERATOR] =    gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,				   GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));  widget_signals[GRAB_FOCUS] =    gtk_signal_new ("grab_focus",		    GTK_RUN_LAST | GTK_RUN_ACTION,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, grab_focus),		    gtk_marshal_NONE__NONE,		    GTK_TYPE_NONE, 0);  widget_signals[EVENT] =    gtk_signal_new ("event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[BUTTON_PRESS_EVENT] =    gtk_signal_new ("button_press_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[BUTTON_RELEASE_EVENT] =    gtk_signal_new ("button_release_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[MOTION_NOTIFY_EVENT] =    gtk_signal_new ("motion_notify_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[DELETE_EVENT] =    gtk_signal_new ("delete_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[DESTROY_EVENT] =    gtk_signal_new ("destroy_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[EXPOSE_EVENT] =    gtk_signal_new ("expose_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[KEY_PRESS_EVENT] =    gtk_signal_new ("key_press_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),		    gtk_marshal_BOOL__POINTER,		    GTK_TYPE_BOOL, 1,		    GTK_TYPE_GDK_EVENT);  widget_signals[KEY_RELEASE_EVENT] =    gtk_signal_new ("key_release_event",		    GTK_RUN_LAST,		    object_class->type,		    GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -