拖放

GTK+ 有一套高级的用来支持图形程序之间通过拖放系统传递信息的函数。GTK+ 能在低级的 Xdnd 和 Motif 拖放协议基础上实施拖放。

概述

一个支持 GTK+ 拖放的应用程序先要定义和设置能拖放的构件。每个构件都可以是拖放的来源端和/或目标端。注意这些构件必须有一个关联的 X 窗口,用 GTK_WIDGET_NO_WINDOW(widget) 检测。

源构件可以发送拖动数据,因此允许用户把东西从它们上面拖出去,同时目标构件能接收拖动数据。拖放的目标端能限制它们接受谁的拖动数据,比如,同一应用程序或任意应用程序(包括它自己)。

发送和接收拖动数据是利用 GTK+ 信号来进行的。投放一个项到一个目的构件需要一个数据请求(源构件使用)和数据接收信号处理函数(目的构件使用)。还可以连接一些附加的信号处理函数,如果你想要知道何时拖动开始(在拖动开始的最初阶段),何时投放成功,以及何时整个拖放过程完成(是否成功)。

当接收到请求时,你的应用程序将需要为源构件提供数据,还包括一个拖动数据请求信号处理函数。而对目的构件将需要一个拖动数据接收信号处理函数。

一个典型的拖放周期将像下面这样:

  1. 拖动开始。

  2. 拖动数据请求(当投放发生)。

  3. 拖动数据被接收(可能在同一个应用程序内部或不同应用程序之间)。

  4. 拖动数据被删除(如果拖动是移动)。

  5. 拖放过程完成。

在它们之间也有一些次要的步骤,但这些我们等下再作详细介绍。