summaryrefslogtreecommitdiff
path: root/src/lightdm-gtk-greeter.c
diff options
context:
space:
mode:
authorAndrew P. <pan.pav.7c5@gmail.com>2015-02-25 11:25:32 +0300
committerAndrew P. <pan.pav.7c5@gmail.com>2015-02-25 11:25:32 +0300
commitee20e3acd13765963a35a816db6493662985a6c4 (patch)
tree806e8840394975bf09b5b82d841aa09a222e43de /src/lightdm-gtk-greeter.c
parent3268ff2a919d7dabf8d14ba5f240fea9521435f9 (diff)
downloadlightdm-gtk-greeter-git-ee20e3acd13765963a35a816db6493662985a6c4.tar.gz
"Onboard" - losing focus in xembed mode; Mirrored display - do not create second window for it
Diffstat (limited to 'src/lightdm-gtk-greeter.c')
-rw-r--r--src/lightdm-gtk-greeter.c67
1 files changed, 29 insertions, 38 deletions
diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c
index 69627ab..7a08a44 100644
--- a/src/lightdm-gtk-greeter.c
+++ b/src/lightdm-gtk-greeter.c
@@ -53,6 +53,7 @@
#include "src/lightdm-gtk-greeter-css-fallback.h"
#include "src/lightdm-gtk-greeter-css-application.h"
+
static LightDMGreeter *greeter;
/* State file */
@@ -70,7 +71,8 @@ static void close_pid (GPid pid, gboolean remove);
static void sigterm_cb (gpointer user_data);
/* Screen window */
-static GtkOverlay *screen_overlay;
+static GtkOverlay *screen_overlay;
+static GtkWidget *screen_overlay_child;
/* Login window */
static GtkWidget *login_window;
@@ -283,7 +285,7 @@ void a11y_contrast_cb (GtkCheckMenuItem *item);
void a11y_keyboard_cb (GtkCheckMenuItem *item, gpointer user_data);
void a11y_reader_cb (GtkCheckMenuItem *item, gpointer user_data);
-/* Power indciator */
+/* Power indicator */
static void power_menu_cb (GtkWidget *menuitem, gpointer userdata);
void suspend_cb (GtkWidget *widget, LightDMGreeter *greeter);
void hibernate_cb (GtkWidget *widget, LightDMGreeter *greeter);
@@ -316,12 +318,12 @@ greeter_save_focus(GtkWidget* widget)
void
greeter_restore_focus(const gpointer saved_data)
{
- if (!saved_data)
+ struct SavedFocusData *data = saved_data;
+
+ if (!saved_data || !GTK_IS_WIDGET (data->widget))
return;
- struct SavedFocusData *data = saved_data;
- if (GTK_IS_WIDGET (data->widget))
- gtk_widget_grab_focus (data->widget);
+ gtk_widget_grab_focus (data->widget);
if (GTK_IS_EDITABLE(data->widget) && data->editable_pos > -1)
gtk_editable_set_position(GTK_EDITABLE(data->widget), data->editable_pos);
}
@@ -732,7 +734,7 @@ set_user_image (const gchar *username)
}
else
{
- g_warning ("Failed to load user image: %s", error->message);
+ g_debug ("Failed to load user image: %s", error->message);
g_clear_error (&error);
}
}
@@ -849,6 +851,7 @@ menu_command_run (MenuCommand *command)
if (id != 0 && end_ptr > text)
{
socket = GTK_SOCKET (gtk_socket_new ());
+ gtk_container_foreach (GTK_CONTAINER (command->widget), (GtkCallback)gtk_widget_destroy, NULL);
gtk_container_add (GTK_CONTAINER (command->widget), GTK_WIDGET (socket));
gtk_socket_add_id (socket, id);
gtk_widget_show_all (GTK_WIDGET (command->widget));
@@ -879,6 +882,7 @@ menu_command_run (MenuCommand *command)
g_warning ("[Command/%s] Failed to run: %s", command->name, error->message);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (command->menu_item), FALSE);
}
+
g_clear_error (&error);
return command->pid;
@@ -2513,54 +2517,40 @@ load_user_list (void)
set_displayed_user (greeter, name);
g_free (name);
}
-
}
g_free (last_user);
}
static GdkFilterReturn
-focus_upon_map (GdkXEvent *gxevent, GdkEvent *event, gpointer data)
+wm_window_filter (GdkXEvent *gxevent, GdkEvent *event, gpointer data)
{
- XEvent* xevent = (XEvent*)gxevent;
- GdkWindow* keyboard_win = a11y_keyboard_command && a11y_keyboard_command->widget ?
- gtk_widget_get_window (GTK_WIDGET (a11y_keyboard_command->widget)) : NULL;
+ XEvent *xevent = (XEvent*)gxevent;
if (xevent->type == MapNotify)
{
- Window xwin = xevent->xmap.window;
- Window keyboard_xid = 0;
- GdkDisplay* display = gdk_x11_lookup_xdisplay (xevent->xmap.display);
- GdkWindow* win = gdk_x11_window_foreign_new_for_display (display, xwin);
+ GdkDisplay *display = gdk_x11_lookup_xdisplay (xevent->xmap.display);
+ GdkWindow *win = gdk_x11_window_foreign_new_for_display (display, xevent->xmap.window);
GdkWindowTypeHint win_type = gdk_window_get_type_hint (win);
- /* Check to see if this window is our onboard window, since we don't want to focus it. */
- if (keyboard_win)
- keyboard_xid = gdk_x11_window_get_xid (keyboard_win);
-
- if (xwin != keyboard_xid
- && win_type != GDK_WINDOW_TYPE_HINT_TOOLTIP
- && win_type != GDK_WINDOW_TYPE_HINT_NOTIFICATION)
- {
+ if (win_type != GDK_WINDOW_TYPE_HINT_COMBO &&
+ win_type != GDK_WINDOW_TYPE_HINT_TOOLTIP &&
+ win_type != GDK_WINDOW_TYPE_HINT_NOTIFICATION)
+ /*
+ if (win_type == GDK_WINDOW_TYPE_HINT_DESKTOP ||
+ win_type == GDK_WINDOW_TYPE_HINT_DIALOG)
+ */
gdk_window_focus (win, GDK_CURRENT_TIME);
- /* Make sure to keep keyboard above */
- if (keyboard_win)
- gdk_window_raise (keyboard_win);
- }
}
else if (xevent->type == UnmapNotify)
{
Window xwin;
- int revert_to;
- XGetInputFocus (xevent->xunmap.display, &xwin, &revert_to);
+ int revert_to = RevertToNone;
+ XGetInputFocus (xevent->xunmap.display, &xwin, &revert_to);
if (revert_to == RevertToNone)
- {
- gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (login_window)), GDK_CURRENT_TIME);
- /* Make sure to keep keyboard above */
- if (keyboard_win)
- gdk_window_raise (keyboard_win);
- }
+ gdk_window_lower (gtk_widget_get_window (gtk_widget_get_toplevel (GTK_WIDGET (screen_overlay))));
}
+
return GDK_FILTER_CONTINUE;
}
@@ -2769,6 +2759,7 @@ main (int argc, char **argv)
/* Screen window */
screen_overlay = GTK_OVERLAY (gtk_builder_get_object (builder, "screen_overlay"));
+ screen_overlay_child = GTK_WIDGET (gtk_builder_get_object (builder, "screen_overlay_child"));
/* Login window */
login_window = GTK_WIDGET (gtk_builder_get_object (builder, "login_window"));
@@ -3140,10 +3131,10 @@ main (int argc, char **argv)
}
g_strfreev (values);
- /* focus fix (source: unity-greeter) */
+ /* There is no window manager, so we need to implement some of its functionality */
GdkWindow* root_window = gdk_get_default_root_window ();
gdk_window_set_events (root_window, gdk_window_get_events (root_window) | GDK_SUBSTRUCTURE_MASK);
- gdk_window_add_filter (root_window, focus_upon_map, NULL);
+ gdk_window_add_filter (root_window, wm_window_filter, NULL);
gtk_widget_show (GTK_WIDGET (screen_overlay));