The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

GTK+ 2.0 Tutorial

<<< Previous

Managing Selections

Next >>>


Поиск выделения (Retrieving the selection)

Поиск выделения является асинхронным процессом, который запускается вызовом функции:

gboolean gtk_selection_convert( GtkWidget *widget, 
                                GdkAtom    selection, 
                                GdkAtom    target,
                                guint32    time );

Это преобразует (converts) выделение в форму определённую target. Если вообще возможно, то аргумент time должен быть временем события которое вызвало выделение (selection). Это помогает событиям удостовериться в том, что пользователь их попросил. Однако, если это не доступно (например, если преобразование было вызвано "clicked" сигналом), то вы можете использовать постоянный GDK_CURRENT_TIME.

Когда хозяин выделения отвечает на запрос, вашему приложению посылается сигнал "selection_received".  Обработчик для этого сигнала получает указатель на структуру GtkSelectionData, которая определена как:

struct _GtkSelectionData
{
  GdkAtom selection;
  GdkAtom target;
  GdkAtom type;
  gint    format;
  guchar *data;
  gint    length;
};

selection и target значения которые вы дали в вашем вызове gtk_selection_convert(). type  является атомом, который идентифицирует тип данных, возвращенных владельцем выбора. Некоторые возможные значения : "STRING" - строка из символов latin-1, "ATOM" - ряд атомов, "INTEGER" - целое число, и т.д.. Большинство targets могут вернуть только один тип. format даёт длину единиц (например букв) в битах. Обычно вам не нужно заботится об этом получая данные. data - указатель на возвращенные данные, а length - возвращает длину данных в байтах. Если длина отрицательная, то произошла ошибка и выделение не может быть восстановлено. Это могло случится, если у выделения небыло приложения владельца, или запрашиваемая вами цель не поддерживается приложением. Буфер всегда гарантированно больше length на один байт; лишний байт всегда 0 (zero), таким образом нет необходимости копировать строку, только чтобы закончить её (nul-terminate them).

В следующем примере мы восстанавливаем специальную цель "TARGETS", которая является списком всех целей в которые может быть преобразовано выделение.

#include <stdlib.h>
#include <gtk/gtk.h>
void selection_received( GtkWidget        *widget, 
                         GtkSelectionData *selection_data, 
                         gpointer          data );
/* Вызываем обработчик когда пользователь нажал на кнопку "Get Targets" */
void get_targets( GtkWidget *widget,
                  gpointer data )
{
  static GdkAtom targets_atom = GDK_NONE;
  GtkWidget *window = (GtkWidget *)data;        
  /* Получаем атом соответствующий строке "TARGETS" */
  if (targets_atom == GDK_NONE)
    targets_atom = gdk_atom_intern ("TARGETS", FALSE);
  /* Запрос цели "TARGETS" для первичного выделения */
  gtk_selection_convert (window, GDK_SELECTION_PRIMARY, targets_atom,
                         GDK_CURRENT_TIME);
}
/* Обработчик сигнала вызванный владельцем выделения возвращает данные */
void selection_received( GtkWidget        *widget,
                         GtkSelectionData *selection_data, 
                         gpointer          data )
{
  GdkAtom *atoms;
  GList *item_list;
  int i;
  /* **** ВАЖНО **** Проверьте успешность поиска  */
  if (selection_data->length < 0)
    {
      g_print ("Selection retrieval failed\n");
      return;
    }
  /* Удостоверьтесь, что мы получили данные в ожидаемой форме */
  if (selection_data->type != GDK_SELECTION_TYPE_ATOM)
    {
      g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
      return;
    }
  
  /* Распечатайте атомы, которые мы получили */
  atoms = (GdkAtom *)selection_data->data;
  item_list = NULL;
  for (i = 0; i < selection_data->length / sizeof(GdkAtom); i++)
    {
      char *name;
      name = gdk_atom_name (atoms[i]);
      if (name != NULL)
        g_print ("%s\n",name);
      else
        g_print ("(bad atom)\n");
    }
  return;
}
int main( int   argc,
          char *argv[] )
{
  GtkWidget *window;
  GtkWidget *button;
  
  gtk_init (&argc, &argv);
  /* Создаём окно верхнего уровня */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Event Box");
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  g_signal_connect (G_OBJECT (window), "destroy",
                    G_CALLBACK (exit), NULL);
  /* Создаём кнопку для получения целей */
  button = gtk_button_new_with_label ("Get Targets");
  gtk_container_add (GTK_CONTAINER (window), button);
  g_signal_connect (G_OBJECT (button), "clicked",
                    G_CALLBACK (get_targets), (gpointer) window);
  g_signal_connect (G_OBJECT (window), "selection_received",
                    G_CALLBACK (selection_received), NULL);
  gtk_widget_show (button);
  gtk_widget_show (window);
  
  gtk_main ();
  
  return 0;
}

<<< Previous

Home

Next >>>

Managing Selections

Up

Supplying the selection






Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру