自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

原创 Gobject tutorial 十三

不像我们的例子,GAction在GLib中有具体的使用功能。那么,在GSimpleAction中GAction是怎么实现的呢。下面,我们以glib-2.78.2/gio/tests/actions.c为例,来了解一下GAction的用法。此篇,我们只了解GAction的用法这一个点,而不深究GAction与GObject的关系。那什么是action呢?那,什么是action呢,在这里我们可以理解为一个鼠标点击动作。GAction是一个Interface,那么Interface对应的数据结构又是什么呢。

2024-07-18 20:29:36 363

原创 Gobject tutorial 十二

在g_io_unix_create_watch的函数体中我们看到了对GIOUnixWatch成员pollfd、channel、conditon的设置,而没有对source的设置,这是因为,GIOUnixWatch的地址与其成员source的地址一致。g_source_attach函数的主要工作是g_source_attach_unlocked函数完成。让我门回到g_io_add_watch_full,接下来,我们要分析函数g_source_set_callback。首先我们看看事件源的生成过程。

2024-07-06 16:45:21 821

原创 GTK tutorial 十五

g_application_real_activate函数首先判断用户是否为GApplication的activate信号设置了信号处理函数,如果没设置且activate函数还是用默认的函数g_application_real_activate,那么就会有warning出现。因此, real_closure->va_marshal被设置为node->va_marshaller. 由之前的分析知道node->va_marshaller的值为g_cclosure_marshal_VOID__VOIDv。

2024-07-02 11:38:15 603

原创 Gobject tutorial 十一

GValue & Boxed type

2024-06-26 11:36:00 633

原创 Gobject tutorial 十

主事件循环管理所有可用的事件源,事件可以是各种类型、各种数量的。比如说文件描述符(普通文件、管道以及套接字)和超时。新类型的事件源可以通过函数g_source_attach来添加。为了使多个相互独立的事件源集能在不同的线程中进行处理,每个事件源都会关联一个GMainContext。一个GMainContext只能在一个线程中运行,但, 事件源可以添加到一个线程中的GmainContext,而从另外一个线程的GMainContext中移除。我们来先来看看GLib中对事件源的定义。

2024-06-25 10:32:31 1984

原创 Gobject tutorial 九

当参数转换完成后,marhaaller还会调用用户提供的回调函数,并以刚刚转换完成的参数列表作为参数。Glib中有一个通用的函数,g_cclosure_marshal_generic,我们在平常在调用g_signal_new时,当将其参数c_marshaller设置为NULL时,g_cclosure_marshal_generic就是此时的默认marshaller.当然,还存在其他的marshaller,比如说g_cclosure_marshal_VOID__INT。回调函数的类型是GCallback。

2024-06-21 17:22:43 981

原创 Gobject tutorial 八

如果这是最后一个对对象B的引用,那么A释放对B的引用,会导致unref 函数执行对象B的dispose, 进而导致B对象释放对对象A的引用,如果这也是对对象A的最后一个引用,对象B对对象A的引用的释放会导致第二次执行A的dispose。既然在注册属性过程中,GparamSpec是必须的,那么,就有必要对生成GParamSpec的函数进行说明,我们以上例中的g_param_spec_float为例,看看Glib的说明。对于不同的对象实例,属性值是不同的,因此,属性值是存储在对象的实例中的。

2024-06-20 21:15:15 806

原创 Gobject tutorial 七

当g_object_new获取到新对象的初始化完成的类结构的索引之后,如果GObject的constructor函数被重写,那么,g_object_new函数将会调用新类型的类结构中constructor(如上例中的viewer_file_cosntructed,实际上也是新类ViewFileClass中GObject的constructor,这是因为,ViewFile是一个final类型对象)来创建新对象。GObject能够确保所有类结构和实例结构的成员(除指向父结构的成员外)的值都被设置为0。

2024-06-19 17:36:52 783

原创 Gobject tutorial 六

接着调用接口结构中base_init、default_init(class_int)、接口实现时所在类型的interface_init(例如Tint中的 t_compare_interface_init).如果同一个接口在很多类型中都存在实现(例如,Tcomparable在Tint,Tstr中都有实现),那么,接口实现所在的每个类型在初始化过程中,当轮到接口初始化时,接口中的base_init、interface_init都要执行一次,然而,default_init却只执行一次。其他成员还有接口函数指针。

2024-06-19 10:05:48 701

原创 Gobject tutorial 五

Type System Concepts

2024-06-17 20:09:05 1544

原创 Gobject tutorial 四

TIntCllass 初始化开始前,其父类TNumberClass已完成初始化。在应用程序第一次调用g_object_new(T_TYPE_INT,...)时,TIntClass会进行初始化。TNumber是abstract类型,不能直接实例化,也不能直接创建其class。但,当第一次创建其衍生类的实例时,TNumbe classr就会被初始化。

2024-06-17 09:22:56 237

原创 Gobject tutorial 三

在GLib中,类型可以分为两种。一种是可以被继承的(derivable),一种是不能被继承的(final)。二者的主要区别是,final 类型对象的类结构中,除了其父类外,再无其他成员。而derivable类型对象的类结构中会存在其他成员, 且derivable类型的类对其衍生类是可见的。对于上篇我们的例子TDouble,就是一个final类。我们在注册时使用的是G_DEFINE_TYPE,实际上还可以使用。

2024-06-15 18:45:19 1843

原创 Gobject tutorial 二

Type system and registration process

2024-06-15 10:44:51 835

原创 Gobject tutorial 一

参考: https://github.com/ToshioCP/Gobject-tutorial/tree/main?tab=readme-ov-fileGobject 实例是通过函数g_object_new创建的。Gobject不仅包含实例还包含类。从广义上来说,GObject是一个包含类和实例的对象。从狭义上来说,GObject仅仅是一个C结构体的定义。 g_object_new函数分配一个sizeof(GObject)大小的内存,并进行初始化,函数返回值是指向此分配内存的指针。此分配的内存就是一

2024-06-14 17:04:01 374

原创 marco之窗口最大化流程分析

此函数会在menu_callback中被调用。menu_callback会作为参数传递给函数meta_ui_window_menu_new.最终,函数的调用源头是在meta_frame这个新创建的GObject的button_press_event中。因此,需要跟踪函数meta_ui_window_menu_new流程,确定menu_callback存放的位置。那么函数meta_ui_window_menu_new又是怎么被调用的呢?最终,menu_callback会在active_cb函数中被调用。

2024-06-13 18:09:00 145

原创 GTK tutorial 十四

color selection widget,使用户能够自由选择颜色。在很多应用中,当我们选择颜色时就会弹出一个能够交互的配色窗口。这个窗口的功能就是此widget实现的。下面实现一个配色窗口来示例此widget的用法。

2024-06-13 15:02:29 416

原创 GTK tutorial 十三

Spin Button用于让用户在一个范围内的数值中选择一个数字。它包含一个text entry box,并且在entry box旁边有用于上下翻的箭头按钮。entry box也能够直接被编辑。下面举例说明其用法。

2024-06-13 11:12:05 470

原创 GTK tutorial 十二

Dialogs widget 是一个预封装了一些小部件的window.装的部件包括一个在窗口顶部的vbox,vbox中包含一ge separartor以及一个hbox.Dialog widget 主要为用户弹出消息。对与dialog widget的使用,主要是对其中的hbox的使用。Rulers widget 通常用于在窗口中标记鼠标指针的位置。rulers有水平的,也有垂直的。下面的例子是使用rule实现一个600x400 pixel的画布。

2024-06-11 20:52:37 322

原创 GTK tutorial 十一

当你将鼠标指针放在一个按钮或者其他widget上一段时间,这些文本字符串就会显示出来。他的用法很简单,在调用gtk_tooltips_new创建完成后,调用gtk_tooltops_set_tips对tooltips和widget进行绑定就可以了。Label没有自己的X window,因此,不能发送信号。Arrow widget用于显示一个箭头,箭头可以朝向很多方向,并且有很多样式。与Label 一样,arrow 不会发射信号。Process Bars 用于显示操作的状态。arrow 的用法距离说明如下。

2024-06-11 14:23:58 381

原创 GTK tutorial 十

toolbar 通常用来将一些widget合并成组,这样利于对组内widget的外形及布局进行定制。一般,toolbar会包含带图标的button、label和tooltips。当然,其他的widget也能往里放。NoteBooks widget是一个“page"的集合。这些“pages”的内容会相互覆盖,每次只能查看一个“pages”的内容。此widget 有两个版本,一个创建横向的box,一个创建纵向的box.接下来举例说明此widget的用法。下面的例子对其用法进行说明。下面距离说明其用法。

2024-06-07 14:51:35 272

原创 GTK tutorial 九

Aspect Frames widget 与 frame widget 类似,区别在于,此widget强制设置了放置在其中的widget的纵横比,为了符合此纵横比,此widget根据需要会调整此widget所包含的空间。当你预览一个图片时,你最大化窗口,图片跟着放大, 那么图片的纵横比是不是要与之前的一致呢。scrolled window 用于创建一个可滚动的区域,此区域中可以放入任何类型的widget.不论区域中的widget的尺寸多大,都能通过滚动条对区域中的widget进行查看。1,看看会发生什么。

2024-06-06 19:47:53 943

原创 GTK tutorial 八

比如,这些widget不能接受event、如果他们的尺寸设置不合适,你也不能进行缩放,等等问题。下面的例子显示了如何使用EventBox,例子的功能是,当放大窗口时,会有更多的文本内容出现,当点击文本内容时,程序会退出。Alignment widget的功能是,根据Alignment widget的尺寸放置widget在其window中。Fixed Container的功能是,可以将widget放在其窗口的固定位置,这个位置是相对与其窗口的左上角的。下面的例子显示了Fixed Container的用法。

2024-06-06 15:03:25 431

原创 GTK tutorial 七

toggle button是check button 和radio button的实现基础。为了改变toggle button以及其raido button、check button的状态,需要调用函数 gtk_toggle_button_set_active,当调用此函数导致状态改变后,button会发送“clicked”和 “toggled”信号。Radio button与check button类似,但是它们是成组出现的,且每次只能选择组中的一项。下面的例子显示了radio button 的用法。

2024-06-05 20:02:22 382

原创 GTK tutorial 六

range widget 包含scrollbar widget 和scale widget. 所有的rang widget 都包含"trough"和“slider"。range widget 的 update policy用于指定在用户交互期间,adjustment的value值变化的时机和发出value_changed信号的时机。例如,可以使用scale widget 调整一张照片的放大程度、控制颜色的亮度、指定在截屏软件的截屏时间。

2024-06-05 14:52:06 426

原创 GTK tutorial 五

一种方式是,当widget发生调整时,各个widget都发送自己的信号,这些信号的类型可能不同。另一种方式是将调整后的新数据传递到信号处理函数或者让应用查看widget的数据结构以确保调整已经发生。但,也可以将几个widget的调整绑定到一起,当对一个widget进行调整时,其他相关的widget会自动进行相应的调整。对于此问题,GTK定义了一个叫Adjustment的object,Adjustment不是widget,而是一种以更抽象、更灵活的形式对各个widget的调整进行传递和存储的方式。

2024-06-04 16:46:36 186

原创 GTK tutorial 四

widget 类的默认draw函数对于需要重绘区域,只是简单的生成一个合成的expose event,然而,有些类型的widget通过利用这两个函数的区别,可以节省很多工作。例如,如果一个widget 有多个X windows, expose能够对窗口进行识别,那么,重绘时,可以只画被影响的窗口。这个动作draw函数是干不来的。我们在使用widget时,对于用户来说,最终是需要通过屏幕上的图形来与widget交互的。我们使用的例子是一个带指针的模拟表盘,用户可以拖拽表盘的指针来设置指针所指向的值。

2024-06-03 20:10:17 479

原创 GTK tutorial 三

我们创建的widget叫做Tictactoe,如题目所说,它是一个组合widget,类似与FileSelection. 它由一个3x3的toggle button 组成。尽管GTK提供了很多基础的widget供我们使用,但是总有些时候我们需要创建自己的widget. 当然通过创建一个全新的widget,也有助于我们对GTK的了解。接下来我们会创建一个全新的组合widget,通过此widget的创建,来了解当我们调用gtk_*_new来使用GTK提供的的widget时,背后发生的事。

2024-05-31 17:17:11 260

原创 GTK tutorial 二

GTK widget的设计使用的是OO的思想,但是,却是用C语言来实现的。对属于一类的所有widget的实例(例如所有的Button),他们共有的信息存储在他们所属的类的结构里。为了实现类之间的继承,类结构体的第一个成员必须是此类的父结构体。并且,类结构只存储一份。还有一个结构体,每个类的实例化都会对应一个。此结构体用于存储每个实例化对象所特有的信息。我们称这个结构体为对象结构体,与类结构体类似,它的第一个成员是其父类所对应的对象结构体。下面的树形结构显示了各个数据结构之间的层级关系。

2024-05-31 14:37:49 264

原创 GTK tutorial 一

GTK(GIMP ToolKit)是一个用于创建图形化的用户接口的库。GIMP的全称是GNU Image Manipulation Program.GTK最开始是用于开发GIMP的。GTK依赖于GDK(GIMP Drawing Kit)、gdk-pixbuf、Glib和Pango.GTK是一个面向对象的API.虽然GTK是用C语言写的。它的面向对象的实现是通过类的思想及回调函数来实现的。gdk-pixbuf用于客户端图片管理。在GTK2.0以后,GLib的类型系统是GTK中类的层次结构的基础。

2024-05-31 10:02:33 896

原创 ACPICA User Guide and Programmer Reference 翻译11

4.2.5对象初始化——AcpiIntializeObjects 此步完成被装载之后的命名空间中的对象的初始化,然后,初始化并使能运行时通用事件:初始化所有的操作域。此步利用默认handler——SystemMemory, SystemIO, PCI_Config, andDataTable,执行地址空间中所有的_REG方法。注:在控制方法中定义的操作域直到控制方法实际执行时才得以初始化。 完成复杂对象的初始化(Operation Regions, BufferFields, Buf...

2020-06-10 20:23:40 293

原创 ACPICA User Guide and Programmer Reference 翻译10

4.1规定的主操作系统初始化序列 本小节说明包含ACPICA子系统的通用操作系统的初始化序列。在内核初始化期间,ACPICA子系统必须被很早被加载。实际上,必须将ACPICA作为内核的基本初始化模块之一。ACPICA子系统对OS的基本要求包括对内存管理、同步原语和中断的支持。只要这些服务都可用,ACPICA子系统就需要被初始化。只有ACPI可用之后,主板设备的枚举和配置才开始。 总的来说,ACPI表是对硬件的描述,因此需要在很早的时候就要被加载到OS。4.1.1 B...

2020-05-10 14:41:32 234 1

原创 ACPICA User Guide and Programmer Reference 翻译9

3.3设计策略与哲学 本小节介绍ACPICA子系统的设计与实现的策略与哲学。3.3.1外部接口3.3.1.1异常码 所有的外部接口(Acpi*)都以一个异常码作为函数的返回值。其他所有的返回值都是通过以指针方式传递进来的参数进行返回。这就实现了一致和简单的同步异常处理模型。 由于ACPICA子系统在众多操作系统中支持重入和多线程操作,为了...

2020-05-07 23:17:17 173

原创 ACPICA User Guide and Programmer Reference 翻译8

3.2.4异常处理所有在对ACPICA子系统的请求的处理过程中发生的异常都以ACPI_STATUS为返回码返回到调用者。所有ACPICA的异常都是以“AE_”开头,例如,AE_OK表示请求执行成功。所有异常处理都由调用者内联到ACPICA子系统接口中。对于以Acpi和AcpiOs开头的调用没有异常处理函数与之关联。3.2.5 多任务和可重入ACPICA子系统的所有组成部分都应该是可...

2020-05-05 15:10:53 372

原创 ACPICA User Guide and Programmer Reference 翻译7

3.2执行模式3.2.1初始化 ACPICA子系统的初始化完全由主操作系统驱动。由于可能在不同的时间点初始化ACPICA子系统的不同部分(取决于主操作系统的要求),初始化被分为多步进行。下面是四个主要步骤。全局初始化ACPICA子系统——初始化全局数据和其他部分。 初始化表管理功能,加载ACPI表——在可以构建内部命名空间之前,FADT,FACS,DSDT和SSDT表必...

2020-05-04 22:21:16 237

原创 ACPICA User Guide and Programmer Reference 翻译6

3.设计详述 本小节包含适用于ACPICA子系统两大部分的概念,数据类型和数据结构。3.1 ACPI命名空间基础 ACPI命名空间是一个大的数据结构,它是由ACPICA子系统创建和管理的。它是根据DSDT表创建的,命名空间是一个由ACPI对象组成的分层结构。3.1.1 对象 每一个在命名空间中的对象都有一个4字节长的名字。根节点使用...

2020-05-04 00:30:43 235

原创 ACPICA User Guide and Programmer Reference 翻译5

2.3 OSL架构 在不同的操作系统下,可以使用OSL子模块重构在本操作系统下执行的属于自己的ACPICA子模块,甚至可以将此模块重构为不需要主操作系统就可以执行。换句话说,OSL子模块作为一种连接ACPICA到特定操作系统 的方式。OSL利用主操作系统的系统调用和服务来为其他子模块创建功能接口。因此,OSL对于每一个操作系统都是特定的。 OSL实现了一个依赖于...

2020-05-03 10:27:21 238

原创 ACPICA User Guide and Programmer Reference 翻译4

2.2.1 ACPI表管理 此模块管理所有ACPI表,例如,RSDT/XSDT,FADT, FACS,DSDT, SSDT等等。这些表可以从固件程序提供,也可以由主操作系统提供。此模块的管理功能包括:ACPI 表校验 ACPI表安装和卸载 使用ACPI表2.2.2对ACPI表的初始使用 很多情况下,系统/内核的初始化的较早阶段需要一些ACPI表。例如,...

2020-05-03 00:35:57 522

原创 ACPICA User Guide and Programmer Reference 翻译3

2.1.3.2 主操作系统交互方式 主操作系统(hos operating system)直接调用ACPICA子系统的以Acpi开头的接口函数来请求ACPI服务。 当ACPICA子系统需要调用操作系统服务的时候,它都是通过调用操作系统服务层(OSL)来实现的。OSL层调用操作系统服务或者OSL代替ACPICA子系统(与操作系统无关部分)调用操作系统服务时,都是由...

2020-05-02 18:12:15 316

原创 ACPICA User Guide and Programmer Reference 翻译2

2.1.2操作系统服务层 操作系统服务层(OSL)用于将来自于与系统无关的ACPICA子系统层的请求回传到主操作系统,OSL使用主操作系统的源语实现了一些通用的操作系统服务接口。 由于OSL的性质,对于每一个支持ACPI的操作系统,OSL都必须重新实现。可以只有一个与操作系统无关的ACPICA子系统部分,但是,对于每一个支持APCICA的操作系统,必须有与之...

2020-04-30 20:34:46 242

原创 ACPICA User Guide and Programmer Reference 翻译1

https://acpica.org/sites/acpica/files/acpica-reference_18.pdf 英文版下载地址2.1 ACPICA子系统概述 ACPICA子系统(ACPI Component Architecture)实现了ACPI协议底层功能(基本功能)。这些功能包括 AML解释器、ACPI命名空间管理、ACPI表管理、ACPI设备管理和事件处理。...

2020-04-28 21:06:06 291

用于在button 上显示的xpm格式图片

用于在button 上显示的xpm格式图片

2024-06-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除