GtkAllocation *allocation);
static gboolean gtk_plug_key_press_event (GtkWidget *widget,
GdkEventKey *event);
+static gboolean gtk_plug_focus_event (GtkWidget *widget,
+ GdkEventFocus *event);
static void gtk_plug_set_focus (GtkWindow *window,
GtkWidget *focus);
static gboolean gtk_plug_focus (GtkWidget *widget,
widget_class->realize = gtk_plug_realize;
widget_class->unrealize = gtk_plug_unrealize;
widget_class->key_press_event = gtk_plug_key_press_event;
+ widget_class->focus_in_event = gtk_plug_focus_event;
+ widget_class->focus_out_event = gtk_plug_focus_event;
widget_class->show = gtk_plug_show;
widget_class->hide = gtk_plug_hide;
GTK_PRIVATE_UNSET_FLAG (plug, GTK_IN_REPARENT);
socket->plug_widget = NULL;
+ g_object_unref (socket->plug_window);
socket->plug_window = NULL;
+
socket->same_app = FALSE;
plug->same_app = FALSE;
gtk_plug_construct (GtkPlug *plug,
GdkNativeWindow socket_id)
{
- gtk_plug_construct_for_display (plug, gdk_get_default_display (), socket_id);
+ gtk_plug_construct_for_display (plug, gdk_display_get_default (), socket_id);
}
/**
GtkWidget*
gtk_plug_new (GdkNativeWindow socket_id)
{
- return gtk_plug_new_for_display (gdk_get_default_display (), socket_id);
+ return gtk_plug_new_for_display (gdk_display_get_default (), socket_id);
}
/**
GDK_KEY_RELEASE_MASK |
GDK_ENTER_NOTIFY_MASK |
GDK_LEAVE_NOTIFY_MASK |
- GDK_FOCUS_CHANGE_MASK |
GDK_STRUCTURE_MASK);
attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP;
return FALSE;
}
+static gboolean
+gtk_plug_focus_event (GtkWidget *widget,
+ GdkEventFocus *event)
+{
+ /* We eat focus-in events and focus-out events, since they
+ * can be generated by something like a keyboard grab on
+ * a child of the plug.
+ */
+ return FALSE;
+}
+
static void
gtk_plug_set_focus (GtkWindow *window,
GtkWidget *focus)
/* Ask for focus from embedder
*/
- if (focus && !window->has_focus)
+ if (focus && !window->has_toplevel_focus)
{
-#if 0
- XEvent xevent;
-
- xevent.xfocus.type = FocusIn;
- xevent.xfocus.display = GDK_WINDOW_XDISPLAY (plug->socket_window);
- xevent.xfocus.window = GDK_WINDOW_XWINDOW (plug->socket_window);
- xevent.xfocus.mode = EMBEDDED_APP_WANTS_FOCUS;
- xevent.xfocus.detail = FALSE; /* Don't force */
-
- gdk_error_trap_push ();
- XSendEvent (GDK_DISPLAY (),
- GDK_WINDOW_XWINDOW (plug->socket_window),
- False, NoEventMask, &xevent);
- gdk_display_sync (gdk_drawable_get_display (plug->socket_window));
- gdk_error_trap_pop ();
-#endif
-
send_xembed_message (plug, XEMBED_REQUEST_FOCUS, 0, 0, 0,
gtk_get_current_event_time ());
}
send_xembed_message (plug, message, 0, 0, 0,
gtk_get_current_event_time ());
-
-#if 0
- gtk_window_set_focus (GTK_WINDOW (widget), NULL);
-
- gdk_error_trap_push ();
- XSetInputFocus (GDK_WINDOW_XDISPLAY (plug->socket_window),
- GDK_WINDOW_XWINDOW (plug->socket_window),
- RevertToParent, event->time);
- gdk_display_sync (gdk_drawable_get_display (plug->socket_window));
- gdk_error_trap_pop ();
-
- gtk_plug_forward_key_press (plug, event);
-#endif
}
}
GdkDisplay *display = gdk_drawable_get_display (plug->socket_window);
XEvent xevent;
+ GTK_NOTE(PLUGSOCKET,
+ g_message ("GtkPlug: Sending XEMBED message of type %ld", message));
+
xevent.xclient.window = GDK_WINDOW_XWINDOW (plug->socket_window);
xevent.xclient.type = ClientMessage;
xevent.xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "_XEMBED");
glong data2,
guint32 time)
{
+ GtkWindow *window = GTK_WINDOW (plug);
+
GTK_NOTE (PLUGSOCKET,
- g_message ("Message of type %ld received", message));
+ g_message ("GtkPlug: Message of type %ld received", message));
switch (message)
{
case XEMBED_EMBEDDED_NOTIFY:
break;
case XEMBED_WINDOW_ACTIVATE:
- GTK_NOTE(PLUGSOCKET,
- g_message ("GtkPlug: ACTIVATE received"));
+ _gtk_window_set_is_active (window, TRUE);
break;
case XEMBED_WINDOW_DEACTIVATE:
- GTK_NOTE(PLUGSOCKET,
- g_message ("GtkPlug: DEACTIVATE received"));
+ _gtk_window_set_is_active (window, FALSE);
break;
case XEMBED_MODALITY_ON:
break;
case XEMBED_FOCUS_IN:
+ _gtk_window_set_has_toplevel_focus (window, TRUE);
switch (detail)
{
case XEMBED_FOCUS_FIRST:
focus_first_last (plug, GTK_DIR_TAB_BACKWARD);
break;
case XEMBED_FOCUS_CURRENT:
- /* fall through */;
+ break;
}
-
- case XEMBED_FOCUS_OUT:
- {
- GdkEvent event;
-
- event.focus_change.type = GDK_FOCUS_CHANGE;
- event.focus_change.window = GTK_WIDGET (plug)->window;
- event.focus_change.send_event = TRUE;
- event.focus_change.in = (message == XEMBED_FOCUS_IN);
-
- gtk_widget_event (GTK_WIDGET (plug), &event);
+ break;
- break;
- }
+ case XEMBED_FOCUS_OUT:
+ _gtk_window_set_has_toplevel_focus (window, FALSE);
+ break;
case XEMBED_GRAB_KEY:
case XEMBED_UNGRAB_KEY:
}
}
else
- break;
+ goto done;
}
if (xre->parent != GDK_WINDOW_XWINDOW (gdk_screen_get_root_window (screen)))
if (!was_embedded)
g_signal_emit (G_OBJECT (plug), plug_signals[EMBEDDED], 0);
}
-
+
+ done:
g_object_unref (plug);
break;