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