📄 gtkwidget.c
字号:
/* 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 + -