← Back to team overview

lightdm-gtk-greeter-team team mailing list archive

[Merge] lp:~kalgasnik/lightdm-gtk-greeter/new_panel_layout into lp:lightdm-gtk-greeter

 

Andrew P. has proposed merging lp:~kalgasnik/lightdm-gtk-greeter/new_panel_layout into lp:lightdm-gtk-greeter.

Requested reviews:
  LightDM Gtk+ Greeter Development Team (lightdm-gtk-greeter-team)

For more details, see:
https://code.launchpad.net/~kalgasnik/lightdm-gtk-greeter/new_panel_layout/+merge/222460

New panel items:
"~spacer"
"~separator"
"~host"
"~clock"

GtkMenuBar was subclassed (GreeterMenuBar) to implement "~spacer" item.
-- 
https://code.launchpad.net/~kalgasnik/lightdm-gtk-greeter/new_panel_layout/+merge/222460
Your team LightDM Gtk+ Greeter Development Team is requested to review the proposed merge of lp:~kalgasnik/lightdm-gtk-greeter/new_panel_layout into lp:lightdm-gtk-greeter.
=== modified file 'src/Makefile.am'
--- src/Makefile.am	2014-05-21 17:44:19 +0000
+++ src/Makefile.am	2014-06-08 14:38:02 +0000
@@ -7,7 +7,8 @@
 
 lightdm_gtk_greeter_SOURCES = \
 	$(lightdm_gtk_greeter_built_sources) \
-	lightdm-gtk-greeter.c
+	lightdm-gtk-greeter.c \
+	greetermenubar.c
 
 AM_CPPFLAGS = \
 	-I$(top_srcdir) \
@@ -42,7 +43,9 @@
 if MAINTAINER_MODE
 
 lightdm-gtk-greeter-ui.h: $(srcdir)/lightdm-gtk-greeter.glade Makefile
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=lightdm_gtk_greeter_ui $< >$@
+	$(AM_V_GEN) sed "s/GtkMenuBar/GreeterMenuBar/g" $< > $(srcdir)/lightdm-gtk-greeter-temp.glade
+	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=lightdm_gtk_greeter_ui $(srcdir)/lightdm-gtk-greeter-temp.glade >$@
+	$(AM_V_GEN) rm -f $(srcdir)/lightdm-gtk-greeter-temp.glade
 
 lightdm-gtk-greeter-css-fallback.h: $(srcdir)/lightdm-gtk-greeter-fallback.css Makefile
 	$(AM_V_GEN) exo-csource --static --name=lightdm_gtk_greeter_css_fallback $< >$@

=== added file 'src/greeter_menu_bar.xml'
--- src/greeter_menu_bar.xml	1970-01-01 00:00:00 +0000
+++ src/greeter_menu_bar.xml	2014-06-08 14:38:02 +0000
@@ -0,0 +1,8 @@
+<glade-catalog name="greeter_menu_bar" domain="glade-3" 
+               depends="gtk+" version="1.0">
+  <glade-widget-classes>
+    <glade-widget-class title="Greeter MenuBar" name="GreeterMenuBar" 
+                        generic-name="GreeterMenuBar" parent="GtkMenuBar"
+                        icon-name="widget-gtk-window"/>
+  </glade-widget-classes>
+</glade-catalog>

=== added file 'src/greetermenubar.c'
--- src/greetermenubar.c	1970-01-01 00:00:00 +0000
+++ src/greetermenubar.c	2014-06-08 14:38:02 +0000
@@ -0,0 +1,350 @@
+#include <gtk/gtk.h>
+#include "greetermenubar.h"
+
+
+static void greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation);
+
+G_DEFINE_TYPE(GreeterMenuBar, greeter_menu_bar, GTK_TYPE_MENU_BAR);
+
+static void
+greeter_menu_bar_class_init(GreeterMenuBarClass* klass)
+{
+	GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(klass);
+	widget_class->size_allocate = greeter_menu_bar_size_allocate;
+}
+
+static void
+greeter_menu_bar_init(GreeterMenuBar* square)
+{
+
+}
+
+GtkWidget* 
+greeter_menu_bar_new()
+{
+	return GTK_WIDGET(g_object_new(greeter_menu_bar_get_type(), NULL));
+}
+
+#if GTK_CHECK_VERSION (3, 0, 0)
+static gint
+sort_minimal_size(gconstpointer a, gconstpointer b, GtkRequestedSize* sizes)
+{
+    gint a_size = sizes[GPOINTER_TO_INT(a)].natural_size;
+    gint b_size = sizes[GPOINTER_TO_INT(b)].natural_size;
+    return a_size == b_size ? 0 : a_size > b_size ? -1 : +1; 
+}
+
+static void
+greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation)
+{
+    GList* item;
+    GList* shell_children;
+    GList* expand_nums = NULL;
+    guint visible_count = 0, expand_count = 0;
+
+	g_return_if_fail(allocation != NULL);
+	g_return_if_fail(GREETER_IS_MENU_BAR(widget));
+
+    gtk_widget_set_allocation(widget, allocation);
+
+    GtkPackDirection pack_direction = gtk_menu_bar_get_pack_direction(GTK_MENU_BAR(widget));
+    g_return_if_fail(pack_direction == GTK_PACK_DIRECTION_LTR || pack_direction == GTK_PACK_DIRECTION_RTL);
+
+    shell_children = gtk_container_get_children(GTK_CONTAINER(widget));
+
+    for(item = shell_children; item; item = g_list_next(item))
+        if(gtk_widget_get_visible(item->data))
+        {
+            if(gtk_widget_compute_expand(item->data, GTK_ORIENTATION_HORIZONTAL))
+            {
+                expand_nums = g_list_prepend(expand_nums, GINT_TO_POINTER(visible_count));
+                expand_count++;
+            }
+            visible_count++;
+        }
+
+    if(gtk_widget_get_realized(widget))
+        gdk_window_move_resize(gtk_widget_get_window(widget),
+                               allocation->x, allocation->y,
+                               allocation->width, allocation->height);
+
+    if(visible_count > 0)
+    {
+        GtkAllocation remaining_space;
+        GtkStyleContext* context = gtk_widget_get_style_context(widget);
+        GtkStateFlags flags = gtk_widget_get_state_flags(widget);
+        GtkRequestedSize* requested_sizes = g_newa(GtkRequestedSize, visible_count);
+        guint border_width = gtk_container_get_border_width(GTK_CONTAINER(widget));
+        GtkShadowType shadow_type = GTK_SHADOW_OUT;
+        GtkBorder border;
+        gint toggle_size;
+
+        gtk_style_context_get_padding(context, flags, &border);
+        gtk_widget_style_get(widget, "shadow-type", &shadow_type, NULL);
+
+        remaining_space.x = (border_width + border.left);
+        remaining_space.y = (border_width + border.top);
+        remaining_space.width = allocation->width -
+                                2 * border_width - border.left - border.right;
+        remaining_space.height = allocation->height -
+                                 2 * border_width - border.top - border.bottom;
+
+        if (shadow_type != GTK_SHADOW_NONE)
+        {
+            gtk_style_context_get_border(context, flags, &border);
+
+            remaining_space.x += border.left;
+            remaining_space.y += border.top;
+            remaining_space.width -= border.left + border.right;
+            remaining_space.height -= border.top + border.bottom;
+        }
+
+        GtkRequestedSize* request = requested_sizes;
+        int size = remaining_space.width;
+        gboolean ltr = (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_LTR) == (pack_direction == GTK_PACK_DIRECTION_LTR);
+
+        for(item = shell_children; item; item = g_list_next(item))
+        {
+            if (!gtk_widget_get_visible(item->data))
+                continue;
+
+            request->data = item->data;
+            gtk_widget_get_preferred_width_for_height(item->data, remaining_space.height,
+                    &request->minimum_size,
+                    &request->natural_size);
+            gtk_menu_item_toggle_size_request(GTK_MENU_ITEM(item->data),
+                                              &toggle_size);
+            request->minimum_size += toggle_size;
+            request->natural_size += toggle_size;
+
+            gtk_menu_item_toggle_size_allocate(GTK_MENU_ITEM(item->data), toggle_size);
+
+            size -= request->minimum_size;
+            request++;
+        }
+
+        size = gtk_distribute_natural_allocation(size, visible_count, requested_sizes);
+
+        /* Distribution extra space for widgets with expand=True */
+        if(size > 0 && expand_nums)
+        {
+            expand_nums = g_list_sort_with_data(expand_nums, (GCompareDataFunc)sort_minimal_size,
+                                                requested_sizes);
+            GList* first_item = expand_nums;
+            gint needed_size = -1;
+            gint max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size;
+            gint total_needed_size = 0;
+
+
+            /* Free space that all widgets need to have the same (max_size) width
+             * [___max_width___][widget         ][widget____     ]
+             * total_needed_size := [] + [         ] + [     ]
+             * total_needed_size = [              ]
+             */
+            for(item = g_list_next(expand_nums); item; item = g_list_next(item))
+                total_needed_size += max_size - requested_sizes[GPOINTER_TO_INT(item->data)].natural_size;
+
+            while(first_item)
+            {
+                if(size >= total_needed_size)
+                {
+                    /* total_needed_size is enough for all remaining widgets */
+                    needed_size = max_size + (size - total_needed_size)/expand_count;
+                    break;
+                }
+                /* Removing current maximal widget from list */
+                total_needed_size -= max_size - requested_sizes[GPOINTER_TO_INT(item->data)].natural_size;
+                first_item = g_list_next(first_item);
+                if(first_item)
+                    max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].natural_size;
+            }
+
+            for(item = first_item; item; item = g_list_next(item))
+            {
+                request = &requested_sizes[GPOINTER_TO_INT(item->data)];
+                gint dsize = needed_size - request->natural_size;
+                if(size < dsize)
+                    dsize = size;
+                size -= dsize;
+                request->natural_size += dsize;
+            }
+        }
+        
+        gint i;
+        for(i = 0; i < visible_count; i++)
+        {
+            GtkAllocation child_allocation = remaining_space;
+            request = &requested_sizes[i];
+
+            child_allocation.width = request->natural_size;
+            remaining_space.width -= request->natural_size;
+            if (ltr)
+                remaining_space.x += request->natural_size;
+            else
+                child_allocation.x += remaining_space.width;
+            gtk_widget_size_allocate(request->data, &child_allocation);
+        }
+        g_list_free(expand_nums);
+    }
+    g_list_free(shell_children);
+}
+#else
+static gboolean
+widget_get_expand (GtkWidget* widget)
+{
+    return g_object_get_data(G_OBJECT(widget),
+                             GREETER_MENU_BAR_EXPAND_PROP) != NULL;
+}
+
+struct RequestedSize
+{
+    GtkWidget* child;
+    GtkRequisition size;
+};
+
+static gint
+sort_minimal_size(gconstpointer a, gconstpointer b, struct RequestedSize* sizes)
+{
+    gint a_size = sizes[GPOINTER_TO_INT(a)].size.width;
+    gint b_size = sizes[GPOINTER_TO_INT(b)].size.width;
+    return a_size == b_size ? 0 : a_size > b_size ? -1 : +1; 
+}
+
+static void
+greeter_menu_bar_size_allocate(GtkWidget* widget, GtkAllocation* allocation)
+{
+    GList* item;
+    GList* shell_children;
+    GList* expand_nums = NULL;
+    guint visible_count = 0, expand_count = 0;
+
+    g_return_if_fail (GTK_IS_MENU_BAR (widget));
+    g_return_if_fail (allocation != NULL);
+
+    GtkPackDirection pack_direction = gtk_menu_bar_get_pack_direction(GTK_MENU_BAR(widget));
+    g_return_if_fail(pack_direction == GTK_PACK_DIRECTION_LTR || pack_direction == GTK_PACK_DIRECTION_RTL);
+ 
+    shell_children = GTK_MENU_SHELL (widget)->children;
+
+    for(item = shell_children; item; item = g_list_next(item))
+        if(gtk_widget_get_visible(item->data))
+        {
+            if(widget_get_expand(item->data))
+            {
+                expand_nums = g_list_prepend(expand_nums, GINT_TO_POINTER(visible_count));
+                expand_count++;
+            }
+            visible_count++;
+        }
+
+    widget->allocation = *allocation;
+    if (gtk_widget_get_realized (widget))
+        gdk_window_move_resize (widget->window,
+                                allocation->x, allocation->y,
+                                allocation->width, allocation->height);
+
+    if (visible_count)
+    {
+        gint toggle_size, ipadding;
+        GtkTextDirection direction = gtk_widget_get_direction (widget);
+        GtkShadowType shadow_type = GTK_SHADOW_OUT;
+        GtkAllocation remaining_space;
+
+        gtk_widget_style_get (widget, "shadow-type", &shadow_type, NULL);
+        gtk_widget_style_get (widget, "internal-padding", &ipadding, NULL);
+
+        remaining_space.x = (GTK_CONTAINER (widget)->border_width + ipadding);
+        remaining_space.y = (GTK_CONTAINER (widget)->border_width);
+        remaining_space.width = allocation->width - 2 * remaining_space.x;
+        remaining_space.height = allocation->height - 2 * remaining_space.y;
+
+        if (shadow_type != GTK_SHADOW_NONE)
+        {
+            remaining_space.x += widget->style->xthickness;
+            remaining_space.y += widget->style->ythickness;
+            remaining_space.width -= 2 * widget->style->xthickness;
+            remaining_space.height -= 2 * widget->style->ythickness;
+        }
+
+        struct RequestedSize* requested_sizes = g_newa(struct RequestedSize, visible_count);
+        struct RequestedSize* request = requested_sizes;
+        int size = remaining_space.width;
+
+        for(item = shell_children; item; item = g_list_next(item))
+        {
+            if (!gtk_widget_get_visible (item->data))
+                continue;
+            request->child = item->data;
+            gtk_menu_item_toggle_size_request (GTK_MENU_ITEM (request->child), &toggle_size);
+            gtk_menu_item_toggle_size_allocate (GTK_MENU_ITEM (request->child), toggle_size);
+            gtk_widget_get_child_requisition (request->child, &request->size);
+            request->size.width += toggle_size;
+            request->size.height += toggle_size;
+            size -= request->size.width;
+            ++request;
+        }
+
+        if(size > 0 && expand_nums)
+        {
+            expand_nums = g_list_sort_with_data(expand_nums, (GCompareDataFunc)sort_minimal_size,
+                                                requested_sizes);
+            GList* first_item = expand_nums;
+            gint needed_size = -1;
+            gint max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].size.width;
+            gint total_needed_size = 0;
+
+
+            /* Free space that all widgets need to have the same (max_size) width
+             * [___max_width___][widget         ][widget____     ]
+             * total_needed_size := [] + [         ] + [     ]
+             * total_needed_size = [              ]
+             */
+            for(item = g_list_next(expand_nums); item; item = g_list_next(item))
+                total_needed_size += max_size - requested_sizes[GPOINTER_TO_INT(item->data)].size.width;
+
+            while(first_item)
+            {
+                if(size >= total_needed_size)
+                {
+                    /* total_needed_size is enough for all remaining widgets */
+                    needed_size = max_size + (size - total_needed_size)/expand_count;
+                    break;
+                }
+                /* Removing current maximal widget from list */
+                total_needed_size -= max_size - requested_sizes[GPOINTER_TO_INT(item->data)].size.width;
+                first_item = g_list_next(first_item);
+                if(first_item)
+                    max_size = requested_sizes[GPOINTER_TO_INT(first_item->data)].size.width;
+            }
+
+            for(item = first_item; item; item = g_list_next(item))
+            {
+                request = &requested_sizes[GPOINTER_TO_INT(item->data)];
+                gint dsize = needed_size - request->size.width;
+                if(size < dsize)
+                    dsize = size;
+                size -= dsize;
+                request->size.width += dsize;
+            }
+        }
+
+        gboolean ltr = (direction == GTK_TEXT_DIR_LTR) == (pack_direction == GTK_PACK_DIRECTION_LTR);
+        GtkAllocation child_allocation;
+        gint i;
+        for(i = 0; i < visible_count; i++)
+        {
+            child_allocation = remaining_space;
+            request = &requested_sizes[i];
+
+            child_allocation.width = request->size.width;
+            remaining_space.width -= request->size.width;
+            if (ltr)
+                remaining_space.x += request->size.width;
+            else
+                child_allocation.x += remaining_space.width;
+            gtk_widget_size_allocate(request->child, &child_allocation);
+        }
+        g_list_free(expand_nums);
+    }
+}
+#endif

=== added file 'src/greetermenubar.h'
--- src/greetermenubar.h	1970-01-01 00:00:00 +0000
+++ src/greetermenubar.h	2014-06-08 14:38:02 +0000
@@ -0,0 +1,37 @@
+#ifndef GREETER_MENU_BAR_H
+#define GREETER_MENU_BAR_H
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#if !GTK_CHECK_VERSION (3, 0, 0)
+#define GREETER_MENU_BAR_EXPAND_PROP      "gtk2-fallback-expand"
+#endif
+
+G_BEGIN_DECLS
+
+#define GREETER_MENU_BAR_TYPE            (greeter_menu_bar_get_type())
+#define GREETER_MENU_BAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GREETER_MENU_BAR_TYPE, GreeterMenuBar))
+#define GREETER_MENU_BAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GREETER_MENU_BAR_TYPE, GreeterMenuBarClass))
+#define GREETER_IS_MENU_BAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GREETER_MENU_BAR_TYPE))
+#define GREETER_IS_MENU_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GREETER_MENU_BAR_TYPE))
+
+typedef struct _GreeterMenuBar       GreeterMenuBar;
+typedef struct _GreeterMenuBarClass  GreeterMenuBarClass;
+
+struct _GreeterMenuBar
+{
+	GtkMenuBar parent_instance;
+};
+
+struct _GreeterMenuBarClass
+{
+	GtkMenuBarClass parent_class;
+};
+
+GType greeter_menu_bar_get_type(void) G_GNUC_CONST;
+GtkWidget *greeter_menu_bar_new(void);
+
+G_END_DECLS
+
+#endif /* GREETER_MENU_BAR_H */

=== modified file 'src/lightdm-gtk-greeter.c'
--- src/lightdm-gtk-greeter.c	2014-06-06 06:56:00 +0000
+++ src/lightdm-gtk-greeter.c	2014-06-08 14:38:02 +0000
@@ -55,6 +55,7 @@
 
 #include <lightdm.h>
 
+#include "src/greetermenubar.h"
 #include <src/lightdm-gtk-greeter-ui.h>
 
 #if GTK_CHECK_VERSION (3, 0, 0)
@@ -73,12 +74,22 @@
 
 /* Panel Widgets */
 static GtkWindow *panel_window;
+<<<<<<< TREE
 static GtkWidget *clock_label;
 static GtkWidget *menubar, *power_menuitem, *session_menuitem, *language_menuitem, *a11y_menuitem,
                  *layout_menuitem, *session_badge;
+=======
+static GtkWidget *menubar;
+static GtkWidget *power_menuitem, *language_menuitem, *a11y_menuitem, *session_menuitem, *session_badge;
+>>>>>>> MERGE-SOURCE
 static GtkWidget *suspend_menuitem, *hibernate_menuitem, *restart_menuitem, *shutdown_menuitem;
+<<<<<<< TREE
 static GtkWidget *keyboard_menuitem;
 static GtkMenu *session_menu, *language_menu, *layout_menu;
+=======
+static GtkWidget *keyboard_menuitem, *clock_menuitem, *clock_label, *host_menuitem;
+static GtkMenu *session_menu, *language_menu;
+>>>>>>> MERGE-SOURCE
 
 /* Login Window Widgets */
 static GtkWindow *login_window;
@@ -165,6 +176,36 @@
 #endif
 
 
+typedef enum
+{
+    PANEL_ITEM_INDICATOR,
+    PANEL_ITEM_SPACER,
+    PANEL_ITEM_SEPARATOR,
+    PANEL_ITEM_TEXT
+} GreeterPanelItemType;
+
+#if GTK_CHECK_VERSION (3, 0, 0)
+static const gchar *PANEL_ITEM_STYLE = "panel-item";
+static const gchar *PANEL_ITEM_STYLE_HOVERED = "panel-item-hovered";
+
+static const gchar *PANEL_ITEM_STYLES[] = 
+{
+    "panel-item-indicator",
+    "panel-item-spacer",
+    "panel-item-separator",
+    "panel-item-text"
+};
+#endif
+
+static const gchar *PANEL_ITEM_DATA_INDEX = "panel-item-data-index";
+
+#ifdef HAVE_LIBINDICATOR
+static const gchar *INDICATOR_ITEM_DATA_OBJECT    = "indicator-item-data-object";
+static const gchar *INDICATOR_ITEM_DATA_ENTRY     = "indicator-item-data-entry";
+static const gchar *INDICATOR_ITEM_DATA_BOX       = "indicator-item-data-box";
+static const gchar *INDICATOR_DATA_MENUITEMS      = "indicator-data-menuitems";
+#endif
+
 static void
 pam_message_finalize (PAMConversationMessage *message)
 {
@@ -172,34 +213,63 @@
     g_free (message);
 }
 
+<<<<<<< TREE
+=======
+#if GTK_CHECK_VERSION (3, 0, 0)
+static gboolean
+panel_item_enter_notify_cb (GtkWidget *widget, GdkEvent *event, gpointer enter)
+{
+    GtkStyleContext *context = gtk_widget_get_style_context (widget);
+    if (GPOINTER_TO_INT (enter))
+        gtk_style_context_add_class (context, PANEL_ITEM_STYLE_HOVERED);
+    else
+        gtk_style_context_remove_class (context, PANEL_ITEM_STYLE_HOVERED);
+    return FALSE;
+}
+#endif
+
+>>>>>>> MERGE-SOURCE
 static void
-add_indicator_to_panel (GtkWidget *indicator_item, gint index)
+panel_add_item (GtkWidget *widget, gint index, GreeterPanelItemType item_type)
 {
     gint insert_pos = 0;
     GList* items = gtk_container_get_children (GTK_CONTAINER (menubar));
     GList* item;
     for (item = items; item; item = item->next)
     {
-        if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item->data), "indicator-custom-index-data")) < index)
+        if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item->data), PANEL_ITEM_DATA_INDEX)) < index)
             break;
         insert_pos++;
     }
     g_list_free (items);
 
-    gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), GTK_WIDGET (indicator_item), insert_pos);
+    #if GTK_CHECK_VERSION (3, 0, 0)
+    gtk_style_context_add_class (gtk_widget_get_style_context (widget), PANEL_ITEM_STYLE);
+    gtk_style_context_add_class (gtk_widget_get_style_context (widget), PANEL_ITEM_STYLES[item_type]);
+    if (item_type == PANEL_ITEM_INDICATOR)
+    {
+        g_signal_connect (G_OBJECT (widget), "enter-notify-event",
+                          G_CALLBACK (panel_item_enter_notify_cb), GINT_TO_POINTER(TRUE));
+        g_signal_connect (G_OBJECT (widget), "leave-notify-event",
+                          G_CALLBACK (panel_item_enter_notify_cb), GINT_TO_POINTER(FALSE));
+    }
+    #endif
+
+    gtk_widget_show (widget);
+    gtk_menu_shell_insert (GTK_MENU_SHELL (menubar), widget, insert_pos);
 }
 
 #ifdef HAVE_LIBINDICATOR
 static gboolean
-entry_scrolled (GtkWidget *menuitem, GdkEventScroll *event, gpointer data)
+indicator_entry_scrolled_cb (GtkWidget *menuitem, GdkEventScroll *event, gpointer data)
 {
     IndicatorObject      *io;
     IndicatorObjectEntry *entry;
 
     g_return_val_if_fail (GTK_IS_WIDGET (menuitem), FALSE);
 
-    io = g_object_get_data (G_OBJECT (menuitem), "indicator-custom-object-data");
-    entry = g_object_get_data (G_OBJECT (menuitem), "indicator-custom-entry-data");
+    io = g_object_get_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_OBJECT);
+    entry = g_object_get_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_ENTRY);
 
     g_return_val_if_fail (INDICATOR_IS_OBJECT (io), FALSE);
 
@@ -210,15 +280,15 @@
 }
 
 static void
-entry_activated (GtkWidget *widget, gpointer user_data)
+indicator_entry_activated_cb (GtkWidget *widget, gpointer user_data)
 {
     IndicatorObject      *io;
     IndicatorObjectEntry *entry;
 
     g_return_if_fail (GTK_IS_WIDGET (widget));
 
-    io = g_object_get_data (G_OBJECT (widget), "indicator-custom-object-data");
-    entry = g_object_get_data (G_OBJECT (widget), "indicator-custom-entry-data");
+    io = g_object_get_data (G_OBJECT (widget), INDICATOR_ITEM_DATA_OBJECT);
+    entry = g_object_get_data (G_OBJECT (widget), INDICATOR_ITEM_DATA_ENTRY);
 
     g_return_if_fail (INDICATOR_IS_OBJECT (io));
 
@@ -226,10 +296,10 @@
 }
 
 static GtkWidget*
-create_menuitem (IndicatorObject *io, IndicatorObjectEntry *entry, GtkWidget *menubar)
+indicator_entry_create_menuitem (IndicatorObject *io, IndicatorObjectEntry *entry, GtkWidget *menubar)
 {
     GtkWidget *box, *menuitem;
-    gint index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (io), "indicator-custom-index-data"));
+    gint index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (io), PANEL_ITEM_DATA_INDEX));
 
 #if GTK_CHECK_VERSION (3, 0, 0)
     box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
@@ -240,13 +310,13 @@
 
     gtk_widget_add_events(GTK_WIDGET(menuitem), GDK_SCROLL_MASK);
 
-    g_object_set_data (G_OBJECT (menuitem), "indicator-custom-box-data", box);
-    g_object_set_data (G_OBJECT (menuitem), "indicator-custom-object-data", io);
-    g_object_set_data (G_OBJECT (menuitem), "indicator-custom-entry-data", entry);
-    g_object_set_data (G_OBJECT (menuitem), "indicator-custom-index-data", GINT_TO_POINTER (index));
+    g_object_set_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_BOX, box);
+    g_object_set_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_OBJECT, io);
+    g_object_set_data (G_OBJECT (menuitem), INDICATOR_ITEM_DATA_ENTRY, entry);
+    g_object_set_data (G_OBJECT (menuitem), PANEL_ITEM_DATA_INDEX, GINT_TO_POINTER (index));
 
-    g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (entry_activated), NULL);
-    g_signal_connect (G_OBJECT (menuitem), "scroll-event", G_CALLBACK (entry_scrolled), NULL);
+    g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (indicator_entry_activated_cb), NULL);
+    g_signal_connect (G_OBJECT (menuitem), "scroll-event", G_CALLBACK (indicator_entry_scrolled_cb), NULL);
 
     if (entry->image)
         gtk_box_pack_start (GTK_BOX(box), GTK_WIDGET(entry->image), FALSE, FALSE, 1);
@@ -259,24 +329,24 @@
 
     gtk_container_add (GTK_CONTAINER (menuitem), box);
     gtk_widget_show (box);
-    add_indicator_to_panel (menuitem, index);
+    panel_add_item(menuitem, index, PANEL_ITEM_INDICATOR);
 
     return menuitem;
 }
 
 static void
-entry_added (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
+indicator_entry_added_cb (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
 {
     GHashTable *menuitem_lookup;
     GtkWidget  *menuitem;
 
     /* if the menuitem doesn't already exist, create it now */
-    menuitem_lookup = g_object_get_data (G_OBJECT (io), "indicator-custom-menuitems-data");
+    menuitem_lookup = g_object_get_data (G_OBJECT (io), INDICATOR_DATA_MENUITEMS);
     g_return_if_fail (menuitem_lookup);
     menuitem = g_hash_table_lookup (menuitem_lookup, entry);
     if (!GTK_IS_WIDGET (menuitem))
     {
-        menuitem = create_menuitem (io, entry, GTK_WIDGET (user_data));
+        menuitem = indicator_entry_create_menuitem (io, entry, GTK_WIDGET (user_data));
         g_hash_table_insert (menuitem_lookup, entry, menuitem);
     }
 
@@ -284,22 +354,22 @@
 }
 
 static void
-entry_removed_cb (GtkWidget *widget, gpointer userdata)
+remove_indicator_entry_cb (GtkWidget *widget, gpointer userdata)
 {
     IndicatorObject *io;
     GHashTable      *menuitem_lookup;
     GtkWidget       *menuitem;
     gpointer         entry;
 
-    io = g_object_get_data (G_OBJECT (widget), "indicator-custom-object-data");
+    io = g_object_get_data (G_OBJECT (widget), INDICATOR_ITEM_DATA_OBJECT);
     if (!INDICATOR_IS_OBJECT (io))
         return;
 
-    entry = g_object_get_data (G_OBJECT (widget), "indicator-custom-entry-data");
+    entry = g_object_get_data (G_OBJECT (widget), INDICATOR_ITEM_DATA_ENTRY);
     if (entry != userdata)
         return;
 
-    menuitem_lookup = g_object_get_data (G_OBJECT (io), "indicator-custom-menuitems-data");
+    menuitem_lookup = g_object_get_data (G_OBJECT (io), INDICATOR_DATA_MENUITEMS);
     g_return_if_fail (menuitem_lookup);
     menuitem = g_hash_table_lookup (menuitem_lookup, entry);
     if (GTK_IS_WIDGET (menuitem))
@@ -309,13 +379,13 @@
 }
 
 static void
-entry_removed (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
+indicator_entry_removed_cb (IndicatorObject *io, IndicatorObjectEntry *entry, gpointer user_data)
 {
-    gtk_container_foreach (GTK_CONTAINER (user_data), entry_removed_cb, entry);
+    gtk_container_foreach (GTK_CONTAINER (user_data), remove_indicator_entry_cb, entry);
 }
 
 static void
-menu_show (IndicatorObject *io, IndicatorObjectEntry *entry, guint32 timestamp, gpointer user_data)
+indicator_menu_show_cb (IndicatorObject *io, IndicatorObjectEntry *entry, guint32 timestamp, gpointer user_data)
 {
     IndicatorObjectEntry *entrydata;
     GtkWidget            *menuitem;
@@ -403,9 +473,14 @@
     GHashTable *builtin_items = NULL;
     GHashTableIter iter;
     gpointer iter_value;
+    #ifdef HAVE_LIBINDICATOR
     gboolean inited = FALSE;
+    #endif
     gboolean fallback = FALSE;
 
+    const gchar *DEFAULT_LAYOUT[] = {"~host", "~spacer", "~clock", "~spacer",
+                                     "~session", "~language", "~a11y", "~power", NULL};
+
 #ifdef START_INDICATOR_SERVICES
     GError *error = NULL;
     gchar *AT_SPI_CMD[] = {"/usr/lib/at-spi2-core/at-spi-bus-launcher", "--launch-immediately", NULL};
@@ -423,8 +498,9 @@
             fallback = TRUE;
     }
 
-    if (names && !fallback)
+    if (!names || fallback)
     {
+<<<<<<< TREE
         builtin_items = g_hash_table_new (g_str_hash, g_str_equal);
 
         g_hash_table_insert (builtin_items, "~power", power_menuitem);
@@ -436,15 +512,66 @@
         g_hash_table_iter_init (&iter, builtin_items);
         while (g_hash_table_iter_next (&iter, NULL, &iter_value))
             gtk_container_remove (GTK_CONTAINER (menubar), iter_value);
+=======
+        names = (gchar**)DEFAULT_LAYOUT;
+        length = g_strv_length (names);
+>>>>>>> MERGE-SOURCE
     }
 
+    builtin_items = g_hash_table_new (g_str_hash, g_str_equal);
+
+    g_hash_table_insert (builtin_items, "~power", power_menuitem);
+    g_hash_table_insert (builtin_items, "~session", session_menuitem);
+    g_hash_table_insert (builtin_items, "~language", language_menuitem);
+    g_hash_table_insert (builtin_items, "~a11y", a11y_menuitem);
+    g_hash_table_insert (builtin_items, "~host", host_menuitem);
+    g_hash_table_insert (builtin_items, "~clock", clock_menuitem);
+
+    g_hash_table_iter_init (&iter, builtin_items);
+    while (g_hash_table_iter_next (&iter, NULL, &iter_value))
+        gtk_container_remove (GTK_CONTAINER (menubar), iter_value);
+
     for (i = 0; i < length; ++i)
     {
-        if (names[i][0] == '~' && g_hash_table_lookup_extended (builtin_items, names[i], NULL, &iter_value))
+        if (names[i][0] == '~')
         {   /* Built-in indicators */
-            g_object_set_data (G_OBJECT (iter_value), "indicator-custom-index-data", GINT_TO_POINTER (i));
-            add_indicator_to_panel (iter_value, i);
-            g_hash_table_remove (builtin_items, (gconstpointer)names[i]);
+            GreeterPanelItemType item_type = PANEL_ITEM_INDICATOR;
+            if (g_hash_table_lookup_extended (builtin_items, names[i], NULL, &iter_value))
+                g_hash_table_remove (builtin_items, (gconstpointer)names[i]);
+            else if (g_strcmp0 (names[i], "~separator") == 0)
+            {
+                #if GTK_CHECK_VERSION (3, 0, 0)
+                GtkWidget *separator = gtk_separator_new (GTK_ORIENTATION_VERTICAL);
+                #else
+                GtkWidget *separator = gtk_vseparator_new ();
+                #endif
+                item_type = PANEL_ITEM_SEPARATOR;
+                iter_value = gtk_separator_menu_item_new ();
+                gtk_widget_show (separator);
+                gtk_container_add (iter_value, separator);
+            }
+            else if (g_strcmp0 (names[i], "~spacer") == 0)
+            {
+                item_type = PANEL_ITEM_SPACER;
+                iter_value = gtk_separator_menu_item_new ();
+                gtk_menu_item_set_label (iter_value, "");
+                #if GTK_CHECK_VERSION (3, 0, 0)
+                gtk_widget_set_hexpand (iter_value, TRUE);
+                #else
+                g_object_set_data(G_OBJECT(iter_value), GREETER_MENU_BAR_EXPAND_PROP, "1");
+                #endif
+            }
+            else if (names[i][1] == '~')
+            {
+                item_type = PANEL_ITEM_TEXT;
+                iter_value = gtk_separator_menu_item_new ();
+                gtk_menu_item_set_label (iter_value, &names[i][2]);
+            }
+            else
+                continue;
+
+            g_object_set_data (G_OBJECT (iter_value), PANEL_ITEM_DATA_INDEX, GINT_TO_POINTER (i));
+            panel_add_item (iter_value, i, item_type);
             continue;
         }
 
@@ -497,21 +624,21 @@
             GList *entries, *lp;
 
             /* used to store/fetch menu entries */
-            g_object_set_data_full (G_OBJECT (io), "indicator-custom-menuitems-data",
+            g_object_set_data_full (G_OBJECT (io), INDICATOR_DATA_MENUITEMS,
                                     g_hash_table_new (g_direct_hash, g_direct_equal),
                                     (GDestroyNotify) g_hash_table_destroy);
-            g_object_set_data (G_OBJECT (io), "indicator-custom-index-data", GINT_TO_POINTER (i));
+            g_object_set_data (G_OBJECT (io), PANEL_ITEM_DATA_INDEX, GINT_TO_POINTER (i));
 
             g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED,
-                              G_CALLBACK (entry_added), menubar);
+                              G_CALLBACK (indicator_entry_added_cb), menubar);
             g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED,
-                              G_CALLBACK (entry_removed), menubar);
+                              G_CALLBACK (indicator_entry_removed_cb), menubar);
             g_signal_connect (G_OBJECT (io), INDICATOR_OBJECT_SIGNAL_MENU_SHOW,
-                              G_CALLBACK (menu_show), menubar);
+                              G_CALLBACK (indicator_menu_show_cb), menubar);
 
             entries = indicator_object_get_entries (io);
             for (lp = entries; lp; lp = g_list_next (lp))
-                entry_added (io, lp->data, menubar);
+                indicator_entry_added_cb (io, lp->data, menubar);
             g_list_free (entries);
         }
         else
@@ -522,7 +649,7 @@
         g_free (path);
         #endif
     }
-    if (names)
+    if (names && names != (gchar**)DEFAULT_LAYOUT)
         g_strfreev (names);
 
     if (builtin_items)
@@ -1691,9 +1818,6 @@
         gchar *font_name, **tokens;
         guint length;
 
-        /* Hide the clock since indicators are about to eat the screen. */
-        gtk_widget_hide(GTK_WIDGET(clock_label));
-
         g_object_get (gtk_settings_get_default (), "gtk-font-name", &font_name, NULL);
         tokens = g_strsplit (font_name, " ", -1);
         length = g_strv_length (tokens);
@@ -1715,8 +1839,6 @@
     else
     {
         g_object_set (gtk_settings_get_default (), "gtk-font-name", default_font_name, NULL);
-        /* Show the clock as needed */
-        gtk_widget_show_all(GTK_WIDGET(clock_label));
     }
 }
 
@@ -2166,8 +2288,8 @@
     
     strftime(time_str, 50, clock_format, timeinfo);
     markup = g_markup_printf_escaped("<b>%s</b>", time_str);
-    if (g_strcmp0(markup, gtk_label_get_label(GTK_LABEL(clock_label))) != 0)
-        gtk_label_set_markup( GTK_LABEL(clock_label), markup );
+    if (g_strcmp0(markup, gtk_label_get_label (GTK_LABEL (clock_label))) != 0)
+        gtk_label_set_markup (GTK_LABEL (clock_label), markup);
     g_free(markup);
     
     return TRUE;
@@ -2646,11 +2768,13 @@
     gtk_style_context_add_class(GTK_STYLE_CONTEXT(gtk_widget_get_style_context(GTK_WIDGET(panel_window))), GTK_STYLE_CLASS_MENUBAR);
     g_signal_connect (G_OBJECT (panel_window), "draw", G_CALLBACK (background_window_draw), NULL);
 #endif
-    gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
     session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu"));
     language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu"));
+<<<<<<< TREE
     layout_menu = GTK_MENU(gtk_builder_get_object (builder, "layout_menu"));
     clock_label = GTK_WIDGET(gtk_builder_get_object (builder, "clock_label"));
+=======
+>>>>>>> MERGE-SOURCE
     menubar = GTK_WIDGET (gtk_builder_get_object (builder, "menubar"));
 
     /* Login window */
@@ -2707,8 +2831,13 @@
     language_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem"));
     a11y_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem"));
     power_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
+<<<<<<< TREE
     layout_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "layout_menuitem"));
     keyboard_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "keyboard_menuitem"));
+=======
+    clock_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "clock_menuitem"));
+    host_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "host_menuitem"));
+>>>>>>> MERGE-SOURCE
 
     gtk_accel_map_add_entry ("<Login>/a11y/font", GDK_KEY_F1, 0);
     gtk_accel_map_add_entry ("<Login>/a11y/contrast", GDK_KEY_F2, 0);
@@ -2738,15 +2867,6 @@
         g_free (value);
     }
 
-    /* Clock */
-    gtk_widget_set_no_show_all(GTK_WIDGET(clock_label),
-                           !g_key_file_get_boolean (config, "greeter", "show-clock", NULL));
-    gtk_widget_show_all(GTK_WIDGET(clock_label));
-    clock_format = g_key_file_get_value (config, "greeter", "clock-format", NULL);
-    if (!clock_format)
-        clock_format = "%a, %H:%M";
-    clock_timeout_thread();
-
     /* Session menu */
     if (gtk_widget_get_visible (session_menuitem))
     {
@@ -2852,6 +2972,7 @@
         g_signal_connect (G_OBJECT (power_menuitem),"activate", G_CALLBACK(power_menu_cb), NULL);
     }
 
+<<<<<<< TREE
     /* Layout menu */
     if (gtk_widget_get_visible (layout_menuitem))
     {
@@ -2899,6 +3020,25 @@
                                               fallback_css_priority);
     #endif
 
+=======
+
+    /* Host label */
+    if (gtk_widget_get_visible (host_menuitem))
+        gtk_menu_item_set_label (GTK_MENU_ITEM (host_menuitem), lightdm_get_hostname ());
+
+    /* Clock label */
+    if (gtk_widget_get_visible (clock_menuitem))
+    {
+        gtk_menu_item_set_label (GTK_MENU_ITEM (clock_menuitem), "");
+        clock_label = gtk_bin_get_child (GTK_BIN (clock_menuitem));
+        clock_format = g_key_file_get_value (config, "greeter", "clock-format", NULL);
+        if (!clock_format)
+            clock_format = "%a, %H:%M";
+        clock_timeout_thread ();
+        gdk_threads_add_timeout (1000, (GSourceFunc) clock_timeout_thread, NULL);
+    }
+
+>>>>>>> MERGE-SOURCE
     /* Users combobox */
     renderer = gtk_cell_renderer_text_new();
     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (user_combo), renderer, TRUE);
@@ -3011,7 +3151,6 @@
     }
     gtk_widget_set_sensitive (keyboard_menuitem, a11y_keyboard_command != NULL);
     gtk_widget_set_visible (keyboard_menuitem, a11y_keyboard_command != NULL);
-    gdk_threads_add_timeout (1000, (GSourceFunc) clock_timeout_thread, NULL);
 
     /* focus fix (source: unity-greeter) */
     GdkWindow* root_window = gdk_get_default_root_window ();

=== modified file 'src/lightdm-gtk-greeter.glade'
--- src/lightdm-gtk-greeter.glade	2014-05-06 23:20:09 +0000
+++ src/lightdm-gtk-greeter.glade	2014-06-08 14:38:02 +0000
@@ -12,8 +12,10 @@
       <group name="power_accelgroup"/>
     </accel-groups>
     <child>
-      <object class="GtkHBox" id="box3">
+      <object class="GtkMenuBar" id="menubar">
+        <property name="name">menubar</property>
         <property name="visible">True</property>
+<<<<<<< TREE
         <property name="can_focus">False</property>
         <property name="homogeneous">True</property>
         <child>
@@ -186,6 +188,145 @@
             <property name="pack_type">end</property>
             <property name="position">2</property>
           </packing>
+=======
+        <property name="can_focus">True</property>
+        <property name="halign">fill</property>
+        <property name="pack_direction">rtl</property>
+        <signal name="key-press-event" handler="menubar_key_press_cb" swapped="no"/>
+        <child>
+          <object class="GtkMenuItem" id="power_menuitem">
+            <property name="name">power_menuitem</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child type="submenu">
+              <object class="GtkMenu" id="power_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="accel_group">power_accelgroup</property>
+                <child>
+                  <object class="GtkMenuItem" id="suspend_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Suspend</property>
+                    <signal name="activate" handler="suspend_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="hibernate_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Hibernate</property>
+                    <signal name="activate" handler="hibernate_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="restart_menuitem">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Restart...</property>
+                    <signal name="activate" handler="restart_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="shutdown_menuitem">
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="accel_path">&lt;Login&gt;/power/shutdown</property>
+                    <property name="label" translatable="yes">Shut Down...</property>
+                    <signal name="activate" handler="shutdown_cb" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkMenuItem" id="a11y_menuitem">
+            <property name="name">a11y_menuitem</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child type="submenu">
+              <object class="GtkMenu" id="a11y_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="accel_group">a11y_accelgroup</property>
+                <child>
+                  <object class="GtkCheckMenuItem" id="large_font_menuitem">
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="accel_path">&lt;Login&gt;/a11y/font</property>
+                    <property name="label" translatable="yes">Large Font</property>
+                    <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="accel_path">&lt;Login&gt;/a11y/contrast</property>
+                    <property name="label" translatable="yes">High Contrast</property>
+                    <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkCheckMenuItem" id="keyboard_menuitem">
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="accel_path">&lt;Login&gt;/a11y/keyboard</property>
+                    <property name="label" translatable="yes">On Screen Keyboard</property>
+                    <property name="use_underline">True</property>
+                    <signal name="toggled" handler="a11y_keyboard_cb" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkMenuItem" id="language_menuitem">
+            <property name="name">language_menuitem</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="label">[language_code]</property>
+            <child type="submenu">
+              <object class="GtkMenu" id="language_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkMenuItem" id="session_menuitem">
+            <property name="name">session_menuitem</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child type="submenu">
+              <object class="GtkMenu" id="session_menu">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkSeparatorMenuItem" id="clock_menuitem">
+            <property name="name">clock_menuitem</property>
+            <property name="visible">False</property>
+            <property name="can_focus">False</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkSeparatorMenuItem" id="host_menuitem">
+            <property name="name">host_menuitem</property>
+            <property name="visible">False</property>
+            <property name="can_focus">False</property>
+          </object>
+>>>>>>> MERGE-SOURCE
         </child>
       </object>
     </child>