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

📄 dw_widget.c

📁 嵌入式浏览器Dillo源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * File: dw_widget.c * * Copyright (C) 2001 Sebastian Geerken <S.Geerken@ping.de> * * 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. */#include <gtk/gtk.h>#include "dw_widget.h"#include "dw_container.h"#include "dw_gtk_viewport.h"static void Dw_widget_init                (DwWidget *widget);static void Dw_widget_class_init          (DwWidgetClass *klass);static void Dw_widget_shutdown            (GtkObject *object);static void Dw_widget_destroy             (GtkObject *object);static void Dw_widget_real_size_request      (DwWidget *widget,                                              DwRequisition *requisition);static void Dw_widget_real_size_allocate     (DwWidget *widget,                                              DwAllocation *allocation);static void Dw_widget_real_get_extremes      (DwWidget *widget,                                              DwExtremes *extremes);static void Dw_widget_real_set_width         (DwWidget *widget,                                              gint32 width);static void Dw_widget_real_set_ascent        (DwWidget *widget,                                              gint32 ascent);static void Dw_widget_real_set_descent       (DwWidget *widget,                                              gint32 descent);static void Dw_widget_real_draw              (DwWidget *widget,                                              DwRectangle *area,                                              GdkEventExpose *event);static void Dw_widget_real_realize           (DwWidget *widget);static void Dw_widget_real_unrealize         (DwWidget *widget);static gint Dw_widget_real_button_press      (DwWidget *widget,                                              gint32 x,                                              gint32 y,                                              GdkEventButton *event);static gint Dw_widget_real_button_release    (DwWidget *widget,                                              gint32 x,                                              gint32 y,                                              GdkEventButton *event);static gint Dw_widget_real_motion_notify     (DwWidget *widget,                                              gint32 x,                                              gint32 y,                                              GdkEventMotion *event);static gint Dw_widget_real_enter_notify      (DwWidget *widget,                                              DwWidget *last_widget,                                              GdkEventMotion *event);static gint Dw_widget_real_leave_notify      (DwWidget *widget,                                              DwWidget *next_widget,                                              GdkEventMotion *event);static void Dw_widget_update_cursor          (DwWidget *widget);enum{   SIZE_REQUEST,   FAST_SIZE_REQUEST,   SIZE_ALLOCATE,   SET_WIDTH,   SET_ASCENT,   SET_DESCENT,   DRAW,   REALIZE,   UNREALIZE,   BUTTON_PRESS_EVENT,   BUTTON_RELEASE_EVENT,   MOTION_NOTIFY_EVENT,   ENTER_NOTIFY_EVENT,   LEAVE_NOTIFY_EVENT,   LAST_SIGNAL};static GtkObjectClass *parent_class;static guint widget_signals[LAST_SIGNAL] = { 0 };/* * Standard Gtk+ function */GtkType a_Dw_widget_get_type (void){   static GtkType type = 0;   if (!type) {      GtkTypeInfo info = {         "DwWidget",         sizeof (DwWidget),         sizeof (DwWidgetClass),         (GtkClassInitFunc) Dw_widget_class_init,         (GtkObjectInitFunc) Dw_widget_init,         (GtkArgSetFunc) NULL,         (GtkArgGetFunc) NULL,         (GtkClassInitFunc) NULL      };      type = gtk_type_unique (GTK_TYPE_OBJECT, &info);   }   return type;}/* * Standard Gtk+ function */static void Dw_widget_init (DwWidget *widget){   widget->flags = DW_NEEDS_RESIZE | DW_EXTREMES_CHANGED | DW_HAS_CONTENT;   widget->parent = NULL;   widget->viewport = NULL;   widget->allocation.x = -1;   widget->allocation.y = -1;   widget->allocation.width = 1;   widget->allocation.ascent = 1;   widget->allocation.descent = 0;   /* todo: comment */   widget->anchors_table = NULL;   widget->cursor = NULL;   widget->style = NULL;}/* * Standard Gtk+ function */static void Dw_widget_class_init (DwWidgetClass *klass){   GtkObjectClass *object_class;   parent_class = gtk_type_class (gtk_object_get_type ());   object_class = GTK_OBJECT_CLASS (klass);   widget_signals[SIZE_REQUEST] =      gtk_signal_new ("size_request",                      GTK_RUN_FIRST,                      object_class->type,                      GTK_SIGNAL_OFFSET (DwWidgetClass, 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 (DwWidgetClass, size_allocate),                      gtk_marshal_NONE__POINTER,                      GTK_TYPE_NONE,                      1, GTK_TYPE_POINTER);   widget_signals[SET_WIDTH] =      gtk_signal_new ("set_width",                      GTK_RUN_FIRST,                      object_class->type,                      GTK_SIGNAL_OFFSET (DwWidgetClass, set_width),                      gtk_marshal_NONE__POINTER,                      GTK_TYPE_NONE,                      1, GTK_TYPE_UINT);   widget_signals[SET_ASCENT] =      gtk_signal_new ("set_ascent",                      GTK_RUN_FIRST,                      object_class->type,                      GTK_SIGNAL_OFFSET (DwWidgetClass, set_ascent),                      gtk_marshal_NONE__POINTER,                      GTK_TYPE_NONE,                      1, GTK_TYPE_UINT);   widget_signals[SET_DESCENT] =      gtk_signal_new ("set_descent",                      GTK_RUN_FIRST,                      object_class->type,                      GTK_SIGNAL_OFFSET (DwWidgetClass, set_descent),                      gtk_marshal_NONE__POINTER,                      GTK_TYPE_NONE,                      1, GTK_TYPE_UINT);   widget_signals[DRAW] =      gtk_signal_new ("draw",                      GTK_RUN_FIRST,                      object_class->type,                      GTK_SIGNAL_OFFSET (DwWidgetClass, draw),                      gtk_marshal_NONE__POINTER,                      GTK_TYPE_NONE,                      2, GTK_TYPE_POINTER, GTK_TYPE_GDK_EVENT);   widget_signals[REALIZE] =      gtk_signal_new ("realize",                      GTK_RUN_FIRST,                      object_class->type,                      GTK_SIGNAL_OFFSET (DwWidgetClass, 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 (DwWidgetClass, unrealize),                      gtk_marshal_NONE__NONE,                      GTK_TYPE_NONE, 0);  widget_signals[BUTTON_PRESS_EVENT] =     gtk_signal_new ("button_press_event",                     GTK_RUN_LAST,                     object_class->type,                     GTK_SIGNAL_OFFSET (DwWidgetClass, button_press_event),                     gtk_marshal_BOOL__POINTER,                     GTK_TYPE_BOOL,                     3, GTK_TYPE_UINT, GTK_TYPE_UINT, GTK_TYPE_GDK_EVENT);  widget_signals[BUTTON_RELEASE_EVENT] =     gtk_signal_new ("button_release_event",                     GTK_RUN_LAST,                     object_class->type,                     GTK_SIGNAL_OFFSET (DwWidgetClass, button_release_event),                     gtk_marshal_BOOL__POINTER,                     GTK_TYPE_BOOL,                     3, GTK_TYPE_UINT, GTK_TYPE_UINT, GTK_TYPE_GDK_EVENT);  widget_signals[MOTION_NOTIFY_EVENT] =     gtk_signal_new ("motion_notify_event",                     GTK_RUN_LAST,                     object_class->type,                     GTK_SIGNAL_OFFSET (DwWidgetClass, motion_notify_event),                     gtk_marshal_BOOL__POINTER,                     GTK_TYPE_BOOL,                     3, GTK_TYPE_UINT, GTK_TYPE_UINT, GTK_TYPE_GDK_EVENT);  widget_signals[ENTER_NOTIFY_EVENT] =     gtk_signal_new ("enter_notify_event",                     GTK_RUN_LAST,                     object_class->type,                     GTK_SIGNAL_OFFSET (DwWidgetClass, enter_notify_event),                     gtk_marshal_BOOL__POINTER,                     GTK_TYPE_BOOL,                     3, GTK_TYPE_UINT, GTK_TYPE_UINT, GTK_TYPE_GDK_EVENT);  widget_signals[LEAVE_NOTIFY_EVENT] =     gtk_signal_new ("leave_notify_event",                     GTK_RUN_LAST,                     object_class->type,                     GTK_SIGNAL_OFFSET (DwWidgetClass, leave_notify_event),                     gtk_marshal_BOOL__POINTER,                     GTK_TYPE_BOOL,                     3, GTK_TYPE_UINT, GTK_TYPE_UINT, GTK_TYPE_GDK_EVENT);   object_class->shutdown = Dw_widget_shutdown;   object_class->destroy = Dw_widget_destroy;   klass->size_request = Dw_widget_real_size_request;   klass->get_extremes = Dw_widget_real_get_extremes;   klass->size_allocate = Dw_widget_real_size_allocate;   klass->mark_size_change = NULL;   klass->mark_extremes_change = NULL;   klass->set_width = Dw_widget_real_set_width;   klass->set_ascent = Dw_widget_real_set_ascent;   klass->set_descent = Dw_widget_real_set_descent;   klass->draw = Dw_widget_real_draw;   klass->realize = Dw_widget_real_realize;   klass->unrealize = Dw_widget_real_unrealize;   klass->button_press_event = Dw_widget_real_button_press;   klass->button_release_event = Dw_widget_real_button_release;   klass->motion_notify_event = Dw_widget_real_motion_notify;   klass->enter_notify_event = Dw_widget_real_enter_notify;   klass->leave_notify_event = Dw_widget_real_leave_notify;}/* * Standard Gtk+ function */static void Dw_widget_shutdown (GtkObject *object){   DwWidget *widget;   widget = DW_WIDGET (object);   a_Dw_widget_unrealize (widget);   if (widget->parent)      Dw_container_remove (DW_CONTAINER (widget->parent), widget);   else      Dw_gtk_viewport_remove_dw (GTK_DW_VIEWPORT (widget->viewport));   parent_class->shutdown (object);}/* * Standard Gtk+ function */static void Dw_widget_destroy (GtkObject *object){   DwWidget *widget;   widget = DW_WIDGET (object);   if (widget->anchors_table) {      g_hash_table_destroy(widget->anchors_table);   }   /* The widget the pointer is in? */   if (widget->viewport != NULL &&       widget == GTK_DW_VIEWPORT(widget->viewport)->last_entered)      /* todo: perhaps call the leave_notify function? */      GTK_DW_VIEWPORT(widget->viewport)->last_entered = NULL;   if (widget->style)      a_Dw_style_unref (widget->style);   parent_class->destroy (object);}/* * Standard Dw function */static void Dw_widget_real_size_request (DwWidget *widget,                                         DwRequisition *requisition){   g_warning ("DwWidget::size_request not implemented for `%s'",              gtk_type_name (GTK_OBJECT_TYPE (widget)));   /* return random size to prevent crashes*/   requisition->width = 50;   requisition->ascent = 50;   requisition->descent = 50;}/* * Standard Dw function */static void Dw_widget_real_get_extremes (DwWidget *widget,                                         DwExtremes *extremes){   /* Simply return the requisition width */   DwRequisition requisition;   a_Dw_widget_size_request (widget, &requisition);   extremes->min_width = extremes->max_width = requisition.width;}/* * Standard Dw function */static void Dw_widget_real_size_allocate  (DwWidget *widget,                                           DwAllocation *allocation){   /* ignored */}/* * Standard Dw function */static void Dw_widget_real_set_width       (DwWidget *widget,                                            gint32 width){   /* ignored */}/* * Standard Dw function */static void Dw_widget_real_set_ascent (DwWidget *widget,                                       gint32 ascent){   /* ignored */}/* * Standard Dw function */static void Dw_widget_real_set_descent (DwWidget *widget,                                        gint32 descent){   /* ignored */}/* * Standard Dw function */static void Dw_widget_real_draw    (DwWidget *widget,                                    DwRectangle *area,                                    GdkEventExpose *event){   /* ignored */}/* * Standard Dw function */static void Dw_widget_real_realize (DwWidget *widget){   /* ignored */}/* * Standard Dw function */static void Dw_widget_real_unrealize (DwWidget *widget){   /* ignored */}/*

⌨️ 快捷键说明

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