Glisser-déposer
Gtk::Widget dispose de plusieurs fonctions membres et signaux préfixés par « drag_ » qui sont utilisés pour le glisser-déposer.

Sources et destinations
Les objets sont glissés à partir de sources pour être déposés sur des destinations. Chaque source et chaque destination dispose d'informations à propos du format des données qu'elle peut recevoir ou envoyer, informations fournies par les éléments Gtk::TargetEntry. Une destination de dépôt n'accepte un élément glissé que s'ils partagent un élément Gtk::TargetEntry compatible. Les signaux appropriés sont alors émis, indiquant au gestionnaire de signaux le Gtk::TargetEntry qui a été utilisé.
Gtk::TargetEntry objects contain this information:
target: A name, such as "STRING"
info: An identifier which will be sent to your signals to tell you which TargetEntry was used.
flags: Used only for drag and drop, this specifies whether the data may be dragged to other widgets and applications, or only to the same ones.

Fonctions membres
Widgets can be identified as sources or destinations using these Gtk::Widget methods:

void drag_source_set(const std::vector<Gtk::TargetEntry>& targets,
      Gdk::ModifierType start_button_mask, Gdk::DragAction actions);

targets is a vector of Gtk::TargetEntry elements.
start_button_mask est une combinaison de valeurs liées avec l'opérateur binaire OR ; ces valeurs définissent quelle touche modificatrice ou quel bouton de souris doit être pressé pour démarrer le glisser.
actions est une combinaison de valeurs liées avec l'opérateur binaire OR ; elle précise les opérations de glisser-déposer possibles à partir de cette source — par exemple, copier, déplacer ou lier. L'utilisateur peut choisir le type d'opérations avec les touches modificatrices ; ainsi, Maj permet de transformer la « copie » en « déplacement » ; ce changement est indiqué par la modification de la forme du pointeur de souris.

void drag_dest_set(const std::vector<Gtk::TargetEntry>& targets,
    Gtk::DestDefaults flags, Gdk::DragAction actions);

flags est une combinaison de valeurs liées par l'opérateur binaire OR ; cette combinaison indique comment l'élément graphique répond visuellement aux éléments du glisser-déposer.
actions indique les actions de glisser-déposer que cette destination peut accepter — voir la description plus haut.

Signaux
Quand une destination a accepté un élément glissé, certains signaux vont être émis selon l'action choisie. Par exemple, l'utilisateur peut avoir maintenu enfoncée la touche Maj pour indiquer un déplacement plutôt qu'une copie. Souvenez-vous que l'utilisateur ne peut sélectionner que les actions définies dans vos appels à drag_dest_set() et drag_source_set().

Copie
The source widget will emit these signals, in this order:
drag_begin: Provides DragContext.
drag_data_get: Provides info about the dragged data format, and a Gtk::SelectionData structure, in which you should put the requested data.
drag_end: Provides DragContext.
The destination widget will emit these signals, in this order:
drag_motion: Provides DragContext and coordinates. You can call the drag_status() method of the DragContext to indicate which action will be accepted.
drag_drop: Provides DragContext and coordinates. You can call drag_get_data(), which triggers the drag_data_get signal in the source widget, and then the drag_data_received signal in the destination widget.
drag_data_received: Provides info about the dragged data format, and a Gtk::SelectionData structure which contains the dropped data. You should call the drag_finish() method of the DragContext to indicate whether the operation was successful.

Déplacement
During a move, the source widget will also emit this signal:
drag_data_delete: Gives the source the opportunity to delete the original data if that's appropriate.

DragContext
Les signaux de glisser-déposer fournissent un objet DragContext contenant certaines informations à propos de l'opération de glisser-déposer ; ces informations peuvent être utilisées pour influer sur le processus. Par exemple, vous pouvez faire apparaître l'élément graphique source ou modifier l'icône de glisser-déposer avec set_icon(). Plus important, vous pouvez faire appel à la fonction membre drag_finish() dans le gestionnaire du signal drag_data_received pour savoir si le dépôt a réussi ou non.

Exemple
Voici un exemple très simple montrant une opération de glisser-déposer avec copie :

Glisser-déposer
Source Code
File: dndwindow.h (For use with gtkmm 3, not gtkmm 2)

#ifndef GTKMM_EXAMPLE_DNDWINDOW_H
#define GTKMM_EXAMPLE_DNDWINDOW_H

#include <gtkmm/box.h>
#include <gtkmm/label.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>

class DnDWindow : public Gtk::Window
{

public:
  DnDWindow();
  virtual ~DnDWindow();

protected:
  //Signal handlers:
  void on_button_drag_data_get(
          const Glib::RefPtr<Gdk::DragContext>& context,
          Gtk::SelectionData& selection_data, guint info, guint time);
  void on_label_drop_drag_data_received(
          const Glib::RefPtr<Gdk::DragContext>& context, int x, int y,
          const Gtk::SelectionData& selection_data, guint info, guint time);

  //Member widgets:
  Gtk::Box m_HBox;
  Gtk::Button m_Button_Drag;
  Gtk::Label m_Label_Drop;
};

#endif // GTKMM_EXAMPLE_DNDWINDOW_H

File: main.cc (For use with gtkmm 3, not gtkmm 2)

#include "dndwindow.h"
#include <gtkmm/application.h>

int main (int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

  DnDWindow dndWindow;

  //Shows the window and returns when it is closed.
  return app->run(dndWindow);
}

File: dndwindow.cc (For use with gtkmm 3, not gtkmm 2)

#include "dndwindow.h"
#include <iostream>

DnDWindow::DnDWindow()
: m_Button_Drag("Drag Here\n"),
  m_Label_Drop("Drop here\n")
{
  set_title("DnD example");

  add(m_HBox);

  //Targets:
  std::vector<Gtk::TargetEntry> listTargets;
  listTargets.push_back( Gtk::TargetEntry("STRING") );
  listTargets.push_back( Gtk::TargetEntry("text/plain") );

  //Drag site:

  //Make m_Button_Drag a DnD drag source:
  m_Button_Drag.drag_source_set(listTargets);

  //Connect signals:
  m_Button_Drag.signal_drag_data_get().connect(sigc::mem_fun(*this,
              &DnDWindow::on_button_drag_data_get));

  m_HBox.pack_start(m_Button_Drag);

  //Drop site:

  //Make m_Label_Drop a DnD drop destination:
  m_Label_Drop.drag_dest_set(listTargets);

  //Connect signals:
  m_Label_Drop.signal_drag_data_received().connect(sigc::mem_fun(*this,
              &DnDWindow::on_label_drop_drag_data_received) );

  m_HBox.pack_start(m_Label_Drop);

  show_all();
}

DnDWindow::~DnDWindow()
{
}

void DnDWindow::on_button_drag_data_get(
        const Glib::RefPtr<Gdk::DragContext>&,
        Gtk::SelectionData& selection_data, guint, guint)
{
  selection_data.set(selection_data.get_target(), 8 /* 8 bits format */,
          (const guchar*)"I'm Data!",
          9 /* the length of I'm Data! in bytes */);
}

void DnDWindow::on_label_drop_drag_data_received(
        const Glib::RefPtr<Gdk::DragContext>& context, int, int,
        const Gtk::SelectionData& selection_data, guint, guint time)
{
  const int length = selection_data.get_length();
  if((length >= 0) && (selection_data.get_format() == 8))
  {
    std::cout << "Received \"" << selection_data.get_data_as_string()
        << "\" in label " << std::endl;
  }

  context->drag_finish(false, false, time);
}

There is a more complex example in examples/others/dnd.