diff options
Diffstat (limited to 'endless/eoswindow.c')
-rw-r--r-- | endless/eoswindow.c | 216 |
1 files changed, 113 insertions, 103 deletions
diff --git a/endless/eoswindow.c b/endless/eoswindow.c index d026e6b..3037e4f 100644 --- a/endless/eoswindow.c +++ b/endless/eoswindow.c @@ -54,13 +54,7 @@ #define _EOS_TOP_BAR_EDGE_FINISHING_HEIGHT_PX 2 -G_DEFINE_TYPE (EosWindow, eos_window, GTK_TYPE_APPLICATION_WINDOW) - -#define WINDOW_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), EOS_TYPE_WINDOW, EosWindowPrivate)) - -struct _EosWindowPrivate -{ +typedef struct { EosApplication *application; GtkWidget *top_bar; @@ -79,7 +73,9 @@ struct _EosWindowPrivate gulong visible_page_property_handler; GtkCssProvider *background_provider; gchar *current_background_css_props; -}; +} EosWindowPrivate; + +G_DEFINE_TYPE_WITH_PRIVATE (EosWindow, eos_window, GTK_TYPE_APPLICATION_WINDOW) enum { @@ -94,13 +90,14 @@ static GParamSpec *eos_window_props[NPROPS] = { NULL, }; static void override_background_css(EosWindow *self, gchar *background_css) { + EosWindowPrivate *priv = eos_window_get_instance_private (self); // Override the css GtkStyleProvider *provider = - GTK_STYLE_PROVIDER (self->priv->background_provider); + GTK_STYLE_PROVIDER (priv->background_provider); GdkScreen *screen = gdk_screen_get_default (); GError *error = NULL; gtk_style_context_remove_provider_for_screen (screen, provider); - gtk_css_provider_load_from_data (self->priv->background_provider, + gtk_css_provider_load_from_data (priv->background_provider, background_css, -1, &error); gtk_style_context_add_provider_for_screen (screen, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -116,9 +113,10 @@ override_background_css(EosWindow *self, gchar *background_css) static void update_page_actions (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); - EosMainArea *ma = EOS_MAIN_AREA (self->priv->main_area); - GtkWidget *page = self->priv->current_page; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); + EosMainArea *ma = EOS_MAIN_AREA (priv->main_area); + GtkWidget *page = priv->current_page; if (page != NULL) { @@ -141,9 +139,10 @@ update_page_actions (EosWindow *self) static void update_page_toolbox (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); - EosMainArea *ma = EOS_MAIN_AREA (self->priv->main_area); - GtkWidget *page = self->priv->current_page; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); + EosMainArea *ma = EOS_MAIN_AREA (priv->main_area); + GtkWidget *page = priv->current_page; if (page != NULL) { @@ -167,9 +166,10 @@ update_page_toolbox (EosWindow *self) static void update_page_left_topbar (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); - EosTopBar *tb = EOS_TOP_BAR (self->priv->top_bar); - GtkWidget *page = self->priv->current_page; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); + EosTopBar *tb = EOS_TOP_BAR (priv->top_bar); + GtkWidget *page = priv->current_page; if (page != NULL) { @@ -193,9 +193,10 @@ update_page_left_topbar (EosWindow *self) static void update_page_center_topbar (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); - EosTopBar *tb = EOS_TOP_BAR (self->priv->top_bar); - GtkWidget *page = self->priv->current_page; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); + EosTopBar *tb = EOS_TOP_BAR (priv->top_bar); + GtkWidget *page = priv->current_page; if (page != NULL) { @@ -212,10 +213,11 @@ update_page_center_topbar (EosWindow *self) static void sync_stack_animation (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); - gtk_stack_set_transition_type (GTK_STACK (self->priv->background_stack), + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); + gtk_stack_set_transition_type (GTK_STACK (priv->background_stack), eos_page_manager_get_gtk_stack_transition_type (pm)); - gtk_stack_set_transition_duration (GTK_STACK (self->priv->background_stack), + gtk_stack_set_transition_duration (GTK_STACK (priv->background_stack), eos_page_manager_get_transition_duration (pm)); } @@ -252,8 +254,9 @@ format_background_css (EosPageManager *pm, static void update_page_background (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); - GtkWidget *page = self->priv->current_page; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); + GtkWidget *page = priv->current_page; // If no page set, do not transition if (page == NULL) return; @@ -261,21 +264,21 @@ update_page_background (EosWindow *self) gchar *next_background_css_props = format_background_css (pm, page); // If page background are exactly the same, do not transition - if (g_strcmp0 (self->priv->current_background_css_props, next_background_css_props) == 0) + if (g_strcmp0 (priv->current_background_css_props, next_background_css_props) == 0) return; gchar *background_css = g_strdup_printf(CSS_TEMPLATE, - gtk_widget_get_name (self->priv->current_background), - self->priv->current_background_css_props, - gtk_widget_get_name (self->priv->next_background), + gtk_widget_get_name (priv->current_background), + priv->current_background_css_props, + gtk_widget_get_name (priv->next_background), next_background_css_props); override_background_css (self, background_css); - gtk_stack_set_visible_child (GTK_STACK (self->priv->background_stack), - self->priv->next_background); + gtk_stack_set_visible_child (GTK_STACK (priv->background_stack), + priv->next_background); // Swap our background frames for next animation - GtkWidget *temp = self->priv->next_background; - self->priv->next_background = self->priv->current_background; - self->priv->current_background = temp; - self->priv->current_background_css_props = next_background_css_props; + GtkWidget *temp = priv->next_background; + priv->next_background = priv->current_background; + priv->current_background = temp; + priv->current_background_css_props = next_background_css_props; } /* @@ -319,14 +322,15 @@ update_visible_page_properties (GtkWidget *widget, static void update_page (EosWindow *self) { - EosPageManager *pm = EOS_PAGE_MANAGER (self->priv->page_manager); + EosWindowPrivate *priv = eos_window_get_instance_private (self); + EosPageManager *pm = EOS_PAGE_MANAGER (priv->page_manager); - if (self->priv->current_page) + if (priv->current_page) { - g_signal_handler_disconnect (self->priv->current_page, - self->priv->visible_page_property_handler); + g_signal_handler_disconnect (priv->current_page, + priv->visible_page_property_handler); } - self->priv->current_page = eos_page_manager_get_visible_page (pm); + priv->current_page = eos_page_manager_get_visible_page (pm); update_page_actions (self); update_page_toolbox (self); @@ -334,13 +338,13 @@ update_page (EosWindow *self) update_page_left_topbar (self); update_page_center_topbar (self); update_page_background (self); - gtk_stack_set_transition_type (GTK_STACK (self->priv->background_stack), + gtk_stack_set_transition_type (GTK_STACK (priv->background_stack), GTK_STACK_TRANSITION_TYPE_NONE); - if (self->priv->current_page) + if (priv->current_page) { - self->priv->visible_page_property_handler = - g_signal_connect (self->priv->current_page, + priv->visible_page_property_handler = + g_signal_connect (priv->current_page, "child-notify", G_CALLBACK (update_visible_page_properties), self); @@ -354,11 +358,12 @@ eos_window_get_property (GObject *object, GParamSpec *pspec) { EosWindow *self = EOS_WINDOW (object); + EosWindowPrivate *priv = eos_window_get_instance_private (self); switch (property_id) { case PROP_APPLICATION: - g_value_set_object (value, self->priv->application); + g_value_set_object (value, priv->application); break; case PROP_PAGE_MANAGER: @@ -374,10 +379,11 @@ static void set_application (EosWindow *self, EosApplication *application) { - self->priv->application = application; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + priv->application = application; gtk_window_set_application (GTK_WINDOW (self), - GTK_APPLICATION (self->priv->application)); - if (self->priv->application == NULL) + GTK_APPLICATION (priv->application)); + if (priv->application == NULL) { g_error ("In order to create a window, you must have an application " "for it to connect to."); @@ -416,11 +422,12 @@ eos_window_get_preferred_height (GtkWidget *widget, int *natural_height) { EosWindow *self = EOS_WINDOW (widget); + EosWindowPrivate *priv = eos_window_get_instance_private (self); int top_bar_minimum, top_bar_natural; GTK_WIDGET_CLASS (eos_window_parent_class)->get_preferred_height (widget, minimum_height, natural_height); - gtk_widget_get_preferred_height (self->priv->top_bar, + gtk_widget_get_preferred_height (priv->top_bar, &top_bar_minimum, &top_bar_natural); if (minimum_height != NULL) *minimum_height += top_bar_minimum; @@ -435,23 +442,24 @@ eos_window_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { EosWindow *self = EOS_WINDOW (widget); + EosWindowPrivate *priv = eos_window_get_instance_private (self); GtkWidget *child; GtkAllocation child_allocation = *allocation; gtk_widget_set_allocation (widget, allocation); - if (self->priv->top_bar != NULL) + if (priv->top_bar != NULL) { int top_bar_natural; GtkAllocation top_bar_allocation = *allocation; - gtk_widget_get_preferred_height (self->priv->top_bar, + gtk_widget_get_preferred_height (priv->top_bar, NULL, &top_bar_natural); top_bar_allocation.height = MIN(top_bar_natural, allocation->height); child_allocation.y += top_bar_allocation.height; child_allocation.height -= top_bar_allocation.height; - gtk_widget_size_allocate (self->priv->top_bar, &top_bar_allocation); + gtk_widget_size_allocate (priv->top_bar, &top_bar_allocation); } /* We can't chain up to GtkWindow's implementation of size_allocate() here, @@ -465,12 +473,13 @@ static void eos_window_map (GtkWidget *widget) { EosWindow *self = EOS_WINDOW (widget); + EosWindowPrivate *priv = eos_window_get_instance_private (self); GTK_WIDGET_CLASS (eos_window_parent_class)->map (widget); - if (self->priv->top_bar != NULL - && gtk_widget_get_visible (self->priv->top_bar)) + if (priv->top_bar != NULL + && gtk_widget_get_visible (priv->top_bar)) { - gtk_widget_map (self->priv->top_bar); + gtk_widget_map (priv->top_bar); } } @@ -478,21 +487,22 @@ static void eos_window_unmap (GtkWidget *widget) { EosWindow *self = EOS_WINDOW (widget); + EosWindowPrivate *priv = eos_window_get_instance_private (self); GTK_WIDGET_CLASS (eos_window_parent_class)->unmap (widget); - if (self->priv->top_bar != NULL) - gtk_widget_unmap (self->priv->top_bar); + if (priv->top_bar != NULL) + gtk_widget_unmap (priv->top_bar); } static void eos_window_show (GtkWidget *widget) { EosWindow *self = EOS_WINDOW (widget); + EosWindowPrivate *priv = eos_window_get_instance_private (self); GTK_WIDGET_CLASS (eos_window_parent_class)->show (widget); - if (self->priv->top_bar != NULL) - gtk_widget_show_all (self->priv->top_bar); - + if (priv->top_bar != NULL) + gtk_widget_show_all (priv->top_bar); } /* The top bar is an internal child, so include it in our list of internal @@ -504,9 +514,10 @@ eos_window_forall (GtkContainer *container, gpointer callback_data) { EosWindow *self = EOS_WINDOW (container); + EosWindowPrivate *priv = eos_window_get_instance_private (self); - if (include_internals && self->priv->top_bar != NULL) - (*callback) (self->priv->top_bar, callback_data); + if (include_internals && priv->top_bar != NULL) + (*callback) (priv->top_bar, callback_data); GTK_CONTAINER_CLASS (eos_window_parent_class)->forall (container, include_internals, callback, @@ -529,8 +540,6 @@ eos_window_class_init (EosWindowClass *klass) GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); - g_type_class_add_private (klass, sizeof (EosWindowPrivate)); - object_class->get_property = eos_window_get_property; object_class->set_property = eos_window_set_property; /* Overriding the following six functions is because we treat the top bar as @@ -623,68 +632,68 @@ on_edge_finishing_draw_cb (GtkWidget *edge_finishing, static void eos_window_init (EosWindow *self) { - self->priv = WINDOW_PRIVATE (self); + EosWindowPrivate *priv = eos_window_get_instance_private (self); - self->priv->top_bar = eos_top_bar_new (); - gtk_widget_set_parent (self->priv->top_bar, GTK_WIDGET (self)); + priv->top_bar = eos_top_bar_new (); + gtk_widget_set_parent (priv->top_bar, GTK_WIDGET (self)); - self->priv->overlay = gtk_overlay_new (); - gtk_container_add (GTK_CONTAINER (self), self->priv->overlay); + priv->overlay = gtk_overlay_new (); + gtk_container_add (GTK_CONTAINER (self), priv->overlay); - self->priv->background_stack = gtk_stack_new (); - gtk_container_add (GTK_CONTAINER (self->priv->overlay), self->priv->background_stack); + priv->background_stack = gtk_stack_new (); + gtk_container_add (GTK_CONTAINER (priv->overlay), priv->background_stack); gchar *background_name1 = g_strdup_printf (BACKGROUND_FRAME_NAME_TEMPLATE, 1); - self->priv->next_background = g_object_new (GTK_TYPE_FRAME, "name", background_name1, NULL); - gtk_container_add (GTK_CONTAINER (self->priv->background_stack), self->priv->next_background); + priv->next_background = g_object_new (GTK_TYPE_FRAME, "name", background_name1, NULL); + gtk_container_add (GTK_CONTAINER (priv->background_stack), priv->next_background); // Add the current background to the stack second. I think the latest added // will be the first visible page in the stack gchar *background_name0 = g_strdup_printf (BACKGROUND_FRAME_NAME_TEMPLATE, 0); - self->priv->current_background = g_object_new (GTK_TYPE_FRAME, "name", background_name0, NULL); - gtk_container_add (GTK_CONTAINER (self->priv->background_stack), self->priv->current_background); + priv->current_background = g_object_new (GTK_TYPE_FRAME, "name", background_name0, NULL); + gtk_container_add (GTK_CONTAINER (priv->background_stack), priv->current_background); - self->priv->background_provider = gtk_css_provider_new (); + priv->background_provider = gtk_css_provider_new (); // We start all the background frames transparent with no styling - self->priv->current_background_css_props = TRANSPARENT_FRAME_CSS_PROPERTIES; + priv->current_background_css_props = TRANSPARENT_FRAME_CSS_PROPERTIES; gchar *background_css = g_strdup_printf(CSS_TEMPLATE, - gtk_widget_get_name (self->priv->current_background), + gtk_widget_get_name (priv->current_background), TRANSPARENT_FRAME_CSS_PROPERTIES, - gtk_widget_get_name (self->priv->next_background), + gtk_widget_get_name (priv->next_background), TRANSPARENT_FRAME_CSS_PROPERTIES); override_background_css (self, background_css); - self->priv->main_area = eos_main_area_new (); - gtk_overlay_add_overlay (GTK_OVERLAY (self->priv->overlay), self->priv->main_area); + priv->main_area = eos_main_area_new (); + gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), priv->main_area); // We want the overlay to size to the main area, the widget on top. The // overlay gets its size request from the widget on the bottom, the // background frame with no minimum size. So we use a size group. - self->priv->overlay_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH); - gtk_size_group_add_widget (self->priv->overlay_size_group, self->priv->background_stack); - gtk_size_group_add_widget (self->priv->overlay_size_group, self->priv->main_area); + priv->overlay_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH); + gtk_size_group_add_widget (priv->overlay_size_group, priv->background_stack); + gtk_size_group_add_widget (priv->overlay_size_group, priv->main_area); - self->priv->edge_finishing = gtk_drawing_area_new (); - gtk_widget_set_vexpand (self->priv->edge_finishing, FALSE); - gtk_widget_set_valign (self->priv->edge_finishing, GTK_ALIGN_START); + priv->edge_finishing = gtk_drawing_area_new (); + gtk_widget_set_vexpand (priv->edge_finishing, FALSE); + gtk_widget_set_valign (priv->edge_finishing, GTK_ALIGN_START); /* has_window == FALSE is necessary for not catching input events */ - gtk_widget_set_has_window (self->priv->edge_finishing, FALSE); - gtk_widget_set_size_request (self->priv->edge_finishing, + gtk_widget_set_has_window (priv->edge_finishing, FALSE); + gtk_widget_set_size_request (priv->edge_finishing, -1, _EOS_TOP_BAR_EDGE_FINISHING_HEIGHT_PX); - g_signal_connect_after (self->priv->edge_finishing, "realize", + g_signal_connect_after (priv->edge_finishing, "realize", G_CALLBACK (after_edge_finishing_realize_cb), NULL); - g_signal_connect (self->priv->edge_finishing, "draw", + g_signal_connect (priv->edge_finishing, "draw", G_CALLBACK (on_edge_finishing_draw_cb), NULL); - gtk_overlay_add_overlay (GTK_OVERLAY (self->priv->overlay), - self->priv->edge_finishing); + gtk_overlay_add_overlay (GTK_OVERLAY (priv->overlay), + priv->edge_finishing); gtk_window_set_decorated (GTK_WINDOW (self), FALSE); gtk_window_maximize (GTK_WINDOW (self)); gtk_window_set_default_size (GTK_WINDOW (self), DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT); - g_signal_connect (self->priv->top_bar, "minimize-clicked", + g_signal_connect (priv->top_bar, "minimize-clicked", G_CALLBACK (on_minimize_clicked_cb), NULL); - g_signal_connect (self->priv->top_bar, "close-clicked", + g_signal_connect (priv->top_bar, "close-clicked", G_CALLBACK (on_close_clicked_cb), NULL); eos_window_set_page_manager (self, @@ -722,8 +731,8 @@ EosPageManager * eos_window_get_page_manager (EosWindow *self) { g_return_val_if_fail (self != NULL && EOS_IS_WINDOW (self), NULL); - - return self->priv->page_manager; + EosWindowPrivate *priv = eos_window_get_instance_private (self); + return priv->page_manager; } /** @@ -737,18 +746,19 @@ void eos_window_set_page_manager (EosWindow *self, EosPageManager *page_manager) { + EosWindowPrivate *priv = eos_window_get_instance_private (self); g_return_if_fail (self != NULL && EOS_IS_WINDOW (self)); g_return_if_fail (page_manager != NULL && EOS_IS_PAGE_MANAGER (page_manager)); - EosMainArea *main_area = EOS_MAIN_AREA (self->priv->main_area); + EosMainArea *main_area = EOS_MAIN_AREA (priv->main_area); - self->priv->page_manager = page_manager; + priv->page_manager = page_manager; eos_main_area_set_content (main_area, - GTK_WIDGET (self->priv->page_manager)); + GTK_WIDGET (priv->page_manager)); update_page (self); - g_signal_connect_swapped (self->priv->page_manager, "notify::visible-page", + g_signal_connect_swapped (priv->page_manager, "notify::visible-page", G_CALLBACK (update_page), self); } |