首页
登录 | 注册

evince-自定义类型

在evince 中使用了多个 自定义类型,主要 的是
。EvWindow
。EvApplication
定义分别如下:
  1. struct _EvWindow {
  2.     GtkWindow        base_instance;
  3.     EvWindowPrivate        *priv;
  4. };

  5. struct _EvWindowPrivate {
  6.     /* UI */
  7.     EvChrome chrome;

  8.     GtkWidget *main_box;
  9.     GtkWidget *menubar;
  10.     GtkWidget *toolbar;
  11.     GtkWidget *hpaned;
  12.     GtkWidget *view_box;
  13.     GtkWidget *sidebar;
  14.     GtkWidget *find_bar;
  15.     GtkWidget *scrolled_window;
  16.     GtkWidget *view;
  17.     GtkWidget *presentation_view;
  18.     GtkWidget *message_area;
  19.     GtkWidget *password_view;
  20.     GtkWidget *sidebar_thumbs;
  21.     GtkWidget *sidebar_links;
  22.     GtkWidget *sidebar_attachments;
  23.     GtkWidget *sidebar_layers;
  24.     GtkWidget *sidebar_annots;
  25.     GtkWidget *sidebar_bookmarks;

  26.     /* Settings */
  27.     GSettings *settings;
  28.     GSettings *default_settings;
  29.     GSettings *lockdown_settings;

  30.     /* Menubar accels */
  31.     guint menubar_accel_keyval;
  32.     GdkModifierType menubar_accel_modifier;

  33.     /* Progress Messages */
  34.     guint progress_idle;
  35.     GCancellable *progress_cancellable;

  36.     /* Dialogs */
  37.     GtkWidget *properties;
  38.     GtkWidget *print_dialog;

  39.     /* UI Builders */
  40.     GtkActionGroup *action_group;
  41.     GtkActionGroup *view_popup_action_group;
  42.     GtkActionGroup *attachment_popup_action_group;
  43.     GtkRecentManager *recent_manager;
  44.     GtkActionGroup *recent_action_group;
  45.     guint recent_ui_id;
  46.     GtkActionGroup *bookmarks_action_group;
  47.     guint bookmarks_ui_id;
  48.     GtkUIManager *ui_manager;

  49.     /* Fullscreen mode */
  50.     GtkWidget *fullscreen_toolbar;

  51.     /* Popup view */
  52.     GtkWidget *view_popup;
  53.     EvLink *link;
  54.     EvImage *image;
  55.     EvAnnotation *annot;

  56.     /* Popup attachment */
  57.     GtkWidget *attachment_popup;
  58.     GList *attach_list;

  59.     /* Document */
  60.     EvDocumentModel *model;
  61.     char *uri;
  62.     glong uri_mtime;
  63.     char *local_uri;
  64.     gboolean in_reload;
  65.     EvFileMonitor *monitor;
  66.     guint setup_document_idle;
  67.     
  68.     EvDocument *document;
  69.     EvHistory *history;
  70.     EvWindowPageMode page_mode;
  71.     EvWindowTitle *title;
  72.     EvMetadata *metadata;
  73.     EvBookmarks *bookmarks;
  74.     gboolean is_new_doc;

  75.     /* Load params */
  76.     EvLinkDest *dest;
  77.     gchar *search_string;
  78.     EvWindowRunMode window_mode;

  79.     EvJob *load_job;
  80.     EvJob *reload_job;
  81.     EvJob *thumbnail_job;
  82.     EvJob *save_job;
  83.     EvJob *find_job;

  84.     /* Printing */
  85.     GQueue *print_queue;
  86.     GtkPrintSettings *print_settings;
  87.     GtkPageSetup *print_page_setup;
  88.     gboolean close_after_print;

  89. #ifdef ENABLE_DBUS
  90.     /* DBus */
  91.     guint dbus_object_id;
  92.     gchar *dbus_object_path;
  93. #endif
  94. };

  1. struct _EvApplication {
  2.     GObject base_instance;

  3.     gchar *uri;

  4.     gchar *dot_dir;
  5.     gchar *data_dir;

  6. #ifdef ENABLE_DBUS
  7.     GDBusConnection *connection;
  8.         guint registration_id;
  9.     EvMediaPlayerKeys *keys;
  10.     gboolean doc_registered;
  11. #endif

  12.     TotemScrsaver *scr_saver;

  13. #ifdef WITH_SMCLIENT
  14.     EggSMClient *smclient;
  15. #endif

  16.     gchar *filechooser_open_uri;
  17.     gchar *filechooser_save_uri;
  18. };

gtk+中使用 G_DEFINE_TYPE() 来定义自定义类型。然后调用
  1. gpointer g_object_new (GType object_type,  const gchar *first_property_name, ...);
来创建一个新自定义类型。

以Ev_window为例:

ev_window.c 370:
  1. G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
ev_window.h 54:
  1. #define EV_TYPE_WINDOW            (ev_window_get_type())
根据G_DEFINE_TYPE的定义:
  1. #define G_DEFINE_TYPE(TN, t_n, T_P)     G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})

  1. #define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_)   
  2.                        _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_)
  3.                         {_C_;}
  4.                        _G_DEFINE_TYPE_EXTENDED_END()

  1. #define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
  2. \
  3. static void type_name##_init (TypeName *self); \
  4. static void type_name##_class_init (TypeName##Class *klass); \
  5. static gpointer type_name##_parent_class = NULL; \
  6. static void type_name##_class_intern_init (gpointer klass) \
  7. { \
  8.   type_name##_parent_class = g_type_class_peek_parent (klass); \
  9.   type_name##_class_init ((TypeName##Class*) klass); \
  10. } \
  11. \
  12. GType \
  13. type_name##_get_type (void) \
  14. { \
  15.   static volatile gsize g_define_type_id__volatile = 0; \
  16.   if (g_once_init_enter (&g_define_type_id__volatile)) \
  17.     { \
  18.       GType g_define_type_id = \
  19.         g_type_register_static_simple (TYPE_PARENT, \
  20.                                        g_intern_static_string (#TypeName), \
  21.                                        sizeof (TypeName##Class), \
  22.                                        (GClassInitFunc) type_name##_class_intern_init, \
  23.                                        sizeof (TypeName), \
  24.                                        (GInstanceInitFunc) type_name##_init, \
  25.                                        (GTypeFlags) flags); \
  26.       { /* custom code follows */
  27. #define _G_DEFINE_TYPE_EXTENDED_END()    \
  28.         /* following custom code */    \
  29.       }                    \
  30.       g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
  31.     }                    \
  32.   return g_define_type_id__volatile;    \
  33. } /* closes type_name##_get_type() */
  1. G_DEFINE_TYPE_EXTENDED (EvWindow, ev_window, GTK_TYPE_WIDGET, 0, {});
  2.     将扩展成:
  3.         
  4.     static void ev_window_init (EvWindow *self);
  5.     static void ev_window_class_init (EvWindowClass *klass);
  6.     static gpointer ev_window_parent_class = NULL;
  7.     static void ev_window_class_intern_init (gpointer klass)
  8.     {
  9.       ev_window_parent_class = g_type_class_peek_parent (klass);
  10.       ev_window_class_init ((EvWindowClass*) klass);
  11.     }
  12.     GType ev_window_get_type (void)
  13.     {
  14.       static volatile gsize g_define_type_id__volatile = 0;
  15.       if (g_once_init_enter (&g_define_type_id__volatile))
  16.         {
  17.           GType g_define_type_id =
  18.             g_type_register_static_simple (GTK_TYPE_WIDGET,
  19.                                            g_intern_static_string ("EvWindow"),
  20.                                            sizeof (EvWindowClass),
  21.                                            (GClassInitFunc) ev_window_class_intern_init,
  22.                                            sizeof (EvWindow),
  23.                                            (GInstanceInitFunc) ev_window_init,
  24.                                            (GTypeFlags) flags);
  25.             
  26.           g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
  27.         }
  28.       return g_define_type_id__volatile;
  29.     }
当调用
  1. ev_window = GTK_WIDGET (g_object_new (EV_TYPE_WINDOW,
  2.                           "type", GTK_WINDOW_TOPLEVEL,
  3.                           NULL));
时,EV_TYPE_WINDOW -> ev_window_get_type -> ev_window_init。

相关文章

  •     errors是用的最多的一个package,go doc上面显示有202948个package使用了errors.我相信只有使用go写程序,基本上都会用到这个库.每一个编程语言都离不开错误处理的话题.     Java 通过catc ...
  • C/C++拾遗(二十八):在实践中学习
         学习一门语言,最重要的是实践.自己决定学习C++的初衷,并不是奢望自己成为C++的编程高手,而是希望C++成为一个自己手中熟练好用的语言工具,利用C++自己可以将头脑中闪过的小火花转变成现实,说白了就是自己开始对C++语言的定位就 ...
  • Wings-让单元测试智能全自动生成
    前言 单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理念来看或是从单元测试不受UI影响可以高速批量验证的特性,所以业界所倡导的测试驱动开发,这个里面提到的测试驱动更多的就是指单元测试驱动.但一般开发团队还是很少的系统化 ...
  • 如何进行对C# .NET通用泛型进行快速排序? 我们经常使用List泛型进行数据的封装,但是有时候,在某种需求下,你可能需要对这个泛型进行排序,而排序规则是根据model中的某一个属性进行排序,这时棘手的事情来了,怎么办?!! 这个时候我们 ...
  • SNMP从入门到开发:进阶篇
    管理信息库:MIB 我们要扩展mib首先必须清楚mib是如何定义的,用的什么语言,有哪些约定,遵循哪些规则等等.这些基本东西掌握过后,我们就可以很轻松的来写自己的mib文件了. 所谓管理信息库,或者MIB,就是所有代理进程包含的.并且能够被 ...
  • 作为一个.NET程序员,应该知道的不仅仅是拖拽一个控件到设计时窗口中.就像一个赛车手,一定要了解他的爱车 – 能做什么不能做什么. 本文参考Scott Hanselman给出的.NET问题列表,整理如下.包括WinForms,ASP.NET ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.012 s.
京ICP备10005923号