Add drag_end_event for future expansion, plus allow passing in NULL to the gdk filter stuff to get events without a window in our app

This commit is contained in:
Elliot Lee 1998-03-01 22:37:30 +00:00
parent b7056ea129
commit 3fb589b2ff
9 changed files with 128 additions and 48 deletions

View File

@ -1701,24 +1701,27 @@ gdk_event_translate (GdkEvent *event,
window = gdk_window_lookup (xevent->xany.window);
window_private = (GdkWindowPrivate *) window;
if (window == NULL)
g_warning ("%#lx -> NULL\n", xevent->xany.window);
else
if (window != NULL)
gdk_window_ref (window);
else if(gdk_null_window_warnings) /* Special purpose programs that
get events for other windows may
want to disable this */
g_warning ("%#lx -> NULL\n", xevent->xany.window);
/* Check for filters for this window */
if (window_private)
{
GdkFilterReturn result;
result = gdk_event_apply_filters (xevent, event, window_private->filters);
if (result != GDK_FILTER_CONTINUE)
{
return (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
}
}
{
GdkFilterReturn result;
result = gdk_event_apply_filters (xevent, event,
window_private
?window_private->filters
:default_filters);
if (result != GDK_FILTER_CONTINUE)
{
return (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
}
}
/* We do a "manual" conversion of the XEvent to a
* GdkEvent. The structures are mostly the same so

View File

@ -47,4 +47,6 @@ GdkDndGlobals gdk_dnd = {None,None,None,
gchar *gdk_progname = NULL;
gchar *gdk_progclass = NULL;
gint gdk_error_code;
gint gdk_error_warnings = TRUE;
gboolean gdk_error_warnings = TRUE;
gboolean gdk_null_window_warnings = TRUE;
GList *default_filters = NULL;

View File

@ -250,6 +250,8 @@ extern gchar *gdk_progname;
extern gchar *gdk_progclass;
extern gint gdk_error_code;
extern gint gdk_error_warnings;
extern gboolean gdk_null_window_warnings;
extern GList *default_filters;
/* Debugging support */

View File

@ -1475,13 +1475,15 @@ gdk_window_add_filter (GdkWindow *window,
GList *tmp_list;
GdkEventFilter *filter;
g_return_if_fail (window != NULL);
private = (GdkWindowPrivate*) window;
if (private->destroyed)
if (private && private->destroyed)
return;
tmp_list = private->filters;
if(private)
tmp_list = private->filters;
else
tmp_list = default_filters;
while (tmp_list)
{
filter = (GdkEventFilter *)tmp_list->data;
@ -1493,8 +1495,11 @@ gdk_window_add_filter (GdkWindow *window,
filter = g_new (GdkEventFilter, 1);
filter->function = function;
filter->data = data;
private->filters = g_list_append (private->filters, filter);
if(private)
private->filters = g_list_append (private->filters, filter);
else
default_filters = g_list_append (default_filters, filter);
}
void
@ -1506,10 +1511,13 @@ gdk_window_remove_filter (GdkWindow *window,
GList *tmp_list;
GdkEventFilter *filter;
g_return_if_fail (window != NULL);
private = (GdkWindowPrivate*) window;
tmp_list = private->filters;
if(private)
tmp_list = private->filters;
else
tmp_list = default_filters;
while (tmp_list)
{
filter = (GdkEventFilter *)tmp_list->data;
@ -1517,7 +1525,10 @@ gdk_window_remove_filter (GdkWindow *window,
if ((filter->function == function) && (filter->data == data))
{
private->filters = g_list_remove_link (private->filters, tmp_list);
if(private)
private->filters = g_list_remove_link (private->filters, tmp_list);
else
default_filters = g_list_remove_link (default_filters, tmp_list);
g_list_free_1 (tmp_list);
g_free (filter);

View File

@ -47,4 +47,6 @@ GdkDndGlobals gdk_dnd = {None,None,None,
gchar *gdk_progname = NULL;
gchar *gdk_progclass = NULL;
gint gdk_error_code;
gint gdk_error_warnings = TRUE;
gboolean gdk_error_warnings = TRUE;
gboolean gdk_null_window_warnings = TRUE;
GList *default_filters = NULL;

View File

@ -1701,24 +1701,27 @@ gdk_event_translate (GdkEvent *event,
window = gdk_window_lookup (xevent->xany.window);
window_private = (GdkWindowPrivate *) window;
if (window == NULL)
g_warning ("%#lx -> NULL\n", xevent->xany.window);
else
if (window != NULL)
gdk_window_ref (window);
else if(gdk_null_window_warnings) /* Special purpose programs that
get events for other windows may
want to disable this */
g_warning ("%#lx -> NULL\n", xevent->xany.window);
/* Check for filters for this window */
if (window_private)
{
GdkFilterReturn result;
result = gdk_event_apply_filters (xevent, event, window_private->filters);
if (result != GDK_FILTER_CONTINUE)
{
return (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
}
}
{
GdkFilterReturn result;
result = gdk_event_apply_filters (xevent, event,
window_private
?window_private->filters
:default_filters);
if (result != GDK_FILTER_CONTINUE)
{
return (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
}
}
/* We do a "manual" conversion of the XEvent to a
* GdkEvent. The structures are mostly the same so

View File

@ -1475,13 +1475,15 @@ gdk_window_add_filter (GdkWindow *window,
GList *tmp_list;
GdkEventFilter *filter;
g_return_if_fail (window != NULL);
private = (GdkWindowPrivate*) window;
if (private->destroyed)
if (private && private->destroyed)
return;
tmp_list = private->filters;
if(private)
tmp_list = private->filters;
else
tmp_list = default_filters;
while (tmp_list)
{
filter = (GdkEventFilter *)tmp_list->data;
@ -1493,8 +1495,11 @@ gdk_window_add_filter (GdkWindow *window,
filter = g_new (GdkEventFilter, 1);
filter->function = function;
filter->data = data;
private->filters = g_list_append (private->filters, filter);
if(private)
private->filters = g_list_append (private->filters, filter);
else
default_filters = g_list_append (default_filters, filter);
}
void
@ -1506,10 +1511,13 @@ gdk_window_remove_filter (GdkWindow *window,
GList *tmp_list;
GdkEventFilter *filter;
g_return_if_fail (window != NULL);
private = (GdkWindowPrivate*) window;
tmp_list = private->filters;
if(private)
tmp_list = private->filters;
else
tmp_list = default_filters;
while (tmp_list)
{
filter = (GdkEventFilter *)tmp_list->data;
@ -1517,7 +1525,10 @@ gdk_window_remove_filter (GdkWindow *window,
if ((filter->function == function) && (filter->data == data))
{
private->filters = g_list_remove_link (private->filters, tmp_list);
if(private)
private->filters = g_list_remove_link (private->filters, tmp_list);
else
default_filters = g_list_remove_link (default_filters, tmp_list);
g_list_free_1 (tmp_list);
g_free (filter);

View File

@ -74,6 +74,7 @@ enum {
PROXIMITY_OUT_EVENT,
DRAG_BEGIN_EVENT,
DRAG_REQUEST_EVENT,
DRAG_END_EVENT,
DROP_ENTER_EVENT,
DROP_LEAVE_EVENT,
DROP_DATA_AVAILABLE_EVENT,
@ -626,6 +627,14 @@ gtk_widget_class_init (GtkWidgetClass *klass)
gtk_widget_marshal_signal_4,
GTK_TYPE_BOOL, 1,
GTK_TYPE_GDK_EVENT);
widget_signals[DRAG_END_EVENT] =
gtk_signal_new ("drag_end_event",
GTK_RUN_LAST,
object_class->type,
GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
gtk_widget_marshal_signal_4,
GTK_TYPE_BOOL, 1,
GTK_TYPE_GDK_EVENT);
widget_signals[DROP_ENTER_EVENT] =
gtk_signal_new ("drop_enter_event",
GTK_RUN_FIRST,
@ -2650,6 +2659,24 @@ gtk_widget_get_parent_window (GtkWidget *widget)
return (parent_window != NULL) ? parent_window : widget->parent->window;
}
/*****************************************
* gtk_widget_set_style:
*
* arguments:
*
* results:
*****************************************/
void
gtk_widget_set_style (GtkWidget *widget,
GtkStyle *style)
{
g_return_if_fail (widget != NULL);
GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
gtk_widget_set_style_internal (widget, style);
}
/*****************************************
* gtk_widget_set_uposition:
*

View File

@ -317,6 +317,8 @@ struct _GtkWidgetClass
GdkEventDragBegin *event);
gint (* drag_request_event) (GtkWidget *widget,
GdkEventDragRequest *event);
gint (* drag_end_event) (GtkWidget *widget,
GdkEvent *event);
gint (* drop_enter_event) (GtkWidget *widget,
GdkEventDropEnter *event);
gint (* drop_leave_event) (GtkWidget *widget,
@ -441,6 +443,23 @@ void gtk_widget_set_events (GtkWidget *widget,
void gtk_widget_set_extension_events (GtkWidget *widget,
GdkExtensionMode mode);
GtkWidget* gtk_widget_get_toplevel (GtkWidget *widget);
GtkWidget* gtk_widget_get_ancestor (GtkWidget *widget,
gint type);
GdkColormap* gtk_widget_get_colormap (GtkWidget *widget);
GdkVisual* gtk_widget_get_visual (GtkWidget *widget);
GtkStyle* gtk_widget_get_style (GtkWidget *widget);
gint gtk_widget_get_events (GtkWidget *widget);
GdkExtensionMode gtk_widget_get_extension_events (GtkWidget *widget);
void gtk_widget_get_pointer (GtkWidget *widget,
gint *x,
gint *y);
gint gtk_widget_is_ancestor (GtkWidget *widget,
GtkWidget *ancestor);
gint gtk_widget_is_child (GtkWidget *widget,
GtkWidget *child);
GdkExtensionMode gtk_widget_get_extension_events (GtkWidget *widget);
GtkWidget* gtk_widget_get_toplevel (GtkWidget *widget);
GtkWidget* gtk_widget_get_ancestor (GtkWidget *widget,