x11: Implement the set_accept_focus() vfunc

Actually set the InputHint flag and set the input field of the WM_SPEC
hints depending on the value of the accept-focus bitfield.

http://bugzilla.clutter-project.org/show_bug.cgi?id=2500
This commit is contained in:
Emmanuele Bassi 2010-12-28 17:38:39 +00:00
parent bbede9fef5
commit 497f39e2f4
2 changed files with 17 additions and 4 deletions

View File

@ -537,7 +537,7 @@ clutter_stage_x11_set_user_resizable (ClutterStageWindow *stage_window,
stage_x11->xwin_height); stage_x11->xwin_height);
} }
static void static inline void
update_wm_hints (ClutterStageX11 *stage_x11) update_wm_hints (ClutterStageX11 *stage_x11)
{ {
ClutterBackend *backend; ClutterBackend *backend;
@ -551,16 +551,26 @@ update_wm_hints (ClutterStageX11 *stage_x11)
return; return;
backend = clutter_get_default_backend (); backend = clutter_get_default_backend ();
g_assert (CLUTTER_IS_BACKEND_X11 (backend));
g_return_if_fail (CLUTTER_IS_BACKEND_X11 (backend));
backend_x11 = CLUTTER_BACKEND_X11 (backend); backend_x11 = CLUTTER_BACKEND_X11 (backend);
wm_hints.flags = StateHint; wm_hints.flags = StateHint | InputHint;
wm_hints.initial_state = NormalState; wm_hints.initial_state = NormalState;
wm_hints.input = stage_x11->accept_focus ? True : False;
XSetWMHints (backend_x11->xdpy, stage_x11->xwin, &wm_hints); XSetWMHints (backend_x11->xdpy, stage_x11->xwin, &wm_hints);
} }
static void
clutter_stage_x11_set_accept_focus (ClutterStageWindow *stage_window,
gboolean accept_focus)
{
ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window);
stage_x11->accept_focus = !!accept_focus;
update_wm_hints (stage_x11);
}
static void static void
set_stage_state (ClutterStageX11 *stage_x11, set_stage_state (ClutterStageX11 *stage_x11,
ClutterStageX11State unset_flags, ClutterStageX11State unset_flags,
@ -691,6 +701,7 @@ clutter_stage_x11_init (ClutterStageX11 *stage)
stage->is_foreign_xwin = FALSE; stage->is_foreign_xwin = FALSE;
stage->fullscreening = FALSE; stage->fullscreening = FALSE;
stage->is_cursor_visible = TRUE; stage->is_cursor_visible = TRUE;
stage->accept_focus = TRUE;
stage->title = NULL; stage->title = NULL;
@ -705,6 +716,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
iface->set_fullscreen = clutter_stage_x11_set_fullscreen; iface->set_fullscreen = clutter_stage_x11_set_fullscreen;
iface->set_cursor_visible = clutter_stage_x11_set_cursor_visible; iface->set_cursor_visible = clutter_stage_x11_set_cursor_visible;
iface->set_user_resizable = clutter_stage_x11_set_user_resizable; iface->set_user_resizable = clutter_stage_x11_set_user_resizable;
iface->set_accept_focus = clutter_stage_x11_set_accept_focus;
iface->show = clutter_stage_x11_show; iface->show = clutter_stage_x11_show;
iface->hide = clutter_stage_x11_hide; iface->hide = clutter_stage_x11_hide;
iface->resize = clutter_stage_x11_resize; iface->resize = clutter_stage_x11_resize;

View File

@ -54,6 +54,7 @@ struct _ClutterStageX11
guint fullscreening : 1; guint fullscreening : 1;
guint is_cursor_visible : 1; guint is_cursor_visible : 1;
guint viewport_initialized : 1; guint viewport_initialized : 1;
guint accept_focus : 1;
Window xwin; Window xwin;
gint xwin_width; gint xwin_width;