Подробности

[В начало]

Проблема в реализации № D0138

Краткое описание

Поведение функции gdk_selection_owner_set_for_display() не соответствует требованиям стандарта LSB 3.2

Подробное описание

В документации GDK-2.8.2, на которую ссылается стандарт LSB 3.2, функция gdk_selection_owner_set_for_display должна сгенерировать событие SelectionClear, когда параметр функции send_event = TRUE и новый владелец selection отличен от старого владельца, но функция не генерирует это событие. Причина этого, по моему мнению, заключается в том, что в коде функции вообще не используется параметр send_event.

Раздел стандарта

Linux Standard Base Desktop Specification 3.2. Chapter 15. Libraries. 15.21.1.1. Interfaces for GTK Drawing toolkit, который ссылается на http://www.gtk.org/api/2.6/gdk/gdk-Selections.html#gdk-selection-owner-set-for-display

Пример

#include <gdk/gdk.h>
#include <glib.h>
#include <stdio.h>

#define SELECTION GDK_SELECTION_PRIMARY

int main (int argc, char **argv)
{
	GdkWindow *first_owner = NULL;
	GdkWindowAttr first_owner_attr;
	GdkWindow *second_owner = NULL;
	GdkWindowAttr second_owner_attr;
	GdkDisplay *display = NULL;
	GdkEvent *event = NULL;
	gboolean sel_clear_event = FALSE;
	
	gdk_init(&argc, &argv);
	
	display = gdk_display_get_default();
	if(display == NULL)
	{
		printf("The gdk_display_get_default function returned NULL, unable to create GdkDisplay.\n");
		return 0;
	}
	
	first_owner_attr.title = "FIRST_OWNER";
	first_owner_attr.x = 3;
	first_owner_attr.y = 3;
	first_owner_attr.width = 500;
	first_owner_attr.height = 600;
	first_owner_attr.wclass = GDK_INPUT_OUTPUT;
	first_owner_attr.window_type = GDK_WINDOW_TOPLEVEL;
	first_owner_attr.event_mask = GDK_ALL_EVENTS_MASK;
		
	first_owner = gdk_window_new(NULL, &first_owner_attr, GDK_WA_X | GDK_WA_Y |GDK_WA_TITLE);
	if(first_owner == NULL)
	{
		printf("The gdk_window_new function returned NULL, unable to create GdkWindow.\n");
		return 0;
	}
	
	second_owner_attr.title = "SECOND_OWNER";
	second_owner_attr.x = 3;
	second_owner_attr.y = 3;
	second_owner_attr.width = 500;
	second_owner_attr.height = 600;
	second_owner_attr.wclass = GDK_INPUT_OUTPUT;
	second_owner_attr.window_type = GDK_WINDOW_TOPLEVEL;
	second_owner_attr.event_mask = GDK_ALL_EVENTS_MASK;
	
	second_owner = gdk_window_new(NULL, &second_owner_attr, GDK_WA_X | GDK_WA_Y |GDK_WA_TITLE);
	if(second_owner == NULL)
	{
		printf("The gdk_window_new function returned NULL, unable to create GdkWindow.\n");
		return 0;
	}
	
	gdk_window_show(first_owner);
	gdk_window_show(second_owner);
	
	gdk_selection_owner_set_for_display(display, first_owner, SELECTION, 
										GDK_CURRENT_TIME, FALSE);
	
	gdk_selection_owner_set_for_display(display, second_owner, SELECTION, 
										GDK_CURRENT_TIME, TRUE);
	
	sleep(1);
	while((event = gdk_event_get()) != NULL)
	{
		if(event->type == GDK_SELECTION_CLEAR)
		{
			sel_clear_event = TRUE;
			break;
		}
	}

	if(sel_clear_event == FALSE)
	{
		printf("The function should send the GDK_SELECTION_CLEAR evenrt, but it doesn't");
	}
	
	if(first_owner != NULL)
	{
		gdk_window_destroy(first_owner);
	}

	if(second_owner != NULL)
	{
		gdk_window_destroy(second_owner);
	}
	
	if(event != NULL)
	{
		gdk_event_free(event);
	}
	
	if(display != NULL)
	{
		gdk_display_close(display);
	}
	
return 0;
}

Компонент

gtk+ 2.17.10 or early

Принято

Gnome Bugzilla, 593653

[В начало]