Blame src/widgets/dzl-bin.c

Packit Service c6b782
/* dzl-bin.c
Packit Service c6b782
 *
Packit Service c6b782
 * Copyright (C) 2017 Christian Hergert <chergert@redhat.com>
Packit Service c6b782
 *
Packit Service c6b782
 * This program is free software: you can redistribute it and/or modify
Packit Service c6b782
 * it under the terms of the GNU General Public License as published by
Packit Service c6b782
 * the Free Software Foundation, either version 3 of the License, or
Packit Service c6b782
 * (at your option) any later version.
Packit Service c6b782
 *
Packit Service c6b782
 * This program is distributed in the hope that it will be useful,
Packit Service c6b782
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service c6b782
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service c6b782
 * GNU General Public License for more details.
Packit Service c6b782
 *
Packit Service c6b782
 * You should have received a copy of the GNU General Public License
Packit Service c6b782
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service c6b782
 */
Packit Service c6b782
Packit Service c6b782
#define G_LOG_DOMAIN "dzl-bin"
Packit Service c6b782
Packit Service c6b782
#include "config.h"
Packit Service c6b782
Packit Service c6b782
/**
Packit Service c6b782
 * SECTION:dzl-bin
Packit Service c6b782
 * @title: DzlBin
Packit Service c6b782
 *
Packit Service c6b782
 * This is just a #GtkBin class that also allows for various styling with
Packit Service c6b782
 * CSS over what can be done in GtkBin directly.
Packit Service c6b782
 */
Packit Service c6b782
Packit Service c6b782
#include <string.h>
Packit Service c6b782
Packit Service c6b782
#include "widgets/dzl-bin.h"
Packit Service c6b782
#include "util/dzl-util-private.h"
Packit Service c6b782
Packit Service c6b782
G_DEFINE_TYPE (DzlBin, dzl_bin, GTK_TYPE_BIN)
Packit Service c6b782
Packit Service c6b782
static gboolean
Packit Service c6b782
dzl_bin_draw (GtkWidget *widget,
Packit Service c6b782
              cairo_t   *cr)
Packit Service c6b782
{
Packit Service c6b782
  GtkStyleContext *style_context;
Packit Service c6b782
  GtkWidget *child;
Packit Service c6b782
  GtkAllocation alloc;
Packit Service c6b782
  GtkStateFlags state;
Packit Service c6b782
  GtkBorder margin;
Packit Service c6b782
Packit Service c6b782
  g_assert (DZL_IS_BIN (widget));
Packit Service c6b782
Packit Service c6b782
  gtk_widget_get_allocation (widget, &alloc);
Packit Service c6b782
  alloc.x = 0;
Packit Service c6b782
  alloc.y = 0;
Packit Service c6b782
Packit Service c6b782
  style_context = gtk_widget_get_style_context (widget);
Packit Service c6b782
  state = gtk_widget_get_state_flags (widget);
Packit Service c6b782
Packit Service c6b782
  gtk_style_context_get_margin (style_context, state, &margin);
Packit Service c6b782
  dzl_gtk_allocation_subtract_border (&alloc, &margin);
Packit Service c6b782
Packit Service c6b782
  gtk_render_background (style_context, cr, alloc.x, alloc.y, alloc.width, alloc.height);
Packit Service c6b782
Packit Service c6b782
  child = gtk_bin_get_child (GTK_BIN (widget));
Packit Service c6b782
  if (child != NULL)
Packit Service c6b782
    gtk_container_propagate_draw (GTK_CONTAINER (widget), child, cr);
Packit Service c6b782
Packit Service c6b782
  gtk_render_frame (style_context, cr, alloc.x, alloc.y, alloc.width, alloc.height);
Packit Service c6b782
Packit Service c6b782
  return FALSE;
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_bin_size_allocate (GtkWidget     *widget,
Packit Service c6b782
                       GtkAllocation *alloc)
Packit Service c6b782
{
Packit Service c6b782
  DzlBin *self = (DzlBin *)widget;
Packit Service c6b782
  GtkAllocation child_alloc = { 0 };
Packit Service c6b782
  GtkWidget *child;
Packit Service c6b782
Packit Service c6b782
  g_assert (DZL_IS_BIN (self));
Packit Service c6b782
  g_assert (alloc != NULL);
Packit Service c6b782
Packit Service c6b782
  child = gtk_bin_get_child (GTK_BIN (self));
Packit Service c6b782
Packit Service c6b782
  if (child != NULL)
Packit Service c6b782
    {
Packit Service c6b782
      GtkStyleContext *style_context;
Packit Service c6b782
      GtkBorder borders;
Packit Service c6b782
Packit Service c6b782
      style_context = gtk_widget_get_style_context (widget);
Packit Service c6b782
      child_alloc = *alloc;
Packit Service c6b782
Packit Service c6b782
      if (gtk_widget_get_has_window (widget))
Packit Service c6b782
        {
Packit Service c6b782
          child_alloc.x = 0;
Packit Service c6b782
          child_alloc.y = 0;
Packit Service c6b782
        }
Packit Service c6b782
Packit Service c6b782
      dzl_gtk_style_context_get_borders (style_context, &borders);
Packit Service c6b782
      dzl_gtk_allocation_subtract_border (&child_alloc, &borders);
Packit Service c6b782
    }
Packit Service c6b782
Packit Service c6b782
  GTK_WIDGET_CLASS (dzl_bin_parent_class)->size_allocate (widget, alloc);
Packit Service c6b782
Packit Service c6b782
  if (child != NULL)
Packit Service c6b782
    gtk_widget_size_allocate (child, &child_alloc);
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_bin_get_preferred_width (GtkWidget *widget,
Packit Service c6b782
                             gint      *min_width,
Packit Service c6b782
                             gint      *nat_width)
Packit Service c6b782
{
Packit Service c6b782
  DzlBin *self = (DzlBin *)widget;
Packit Service c6b782
  GtkStyleContext *style_context;
Packit Service c6b782
  GtkWidget *child;
Packit Service c6b782
  GtkBorder borders;
Packit Service c6b782
Packit Service c6b782
  g_assert (DZL_IS_BIN (widget));
Packit Service c6b782
Packit Service c6b782
  *min_width = 0;
Packit Service c6b782
  *nat_width = 0;
Packit Service c6b782
Packit Service c6b782
  child = gtk_bin_get_child (GTK_BIN (self));
Packit Service c6b782
  if (child != NULL)
Packit Service c6b782
    gtk_widget_get_preferred_width (child, min_width, nat_width);
Packit Service c6b782
Packit Service c6b782
  style_context = gtk_widget_get_style_context (widget);
Packit Service c6b782
  dzl_gtk_style_context_get_borders (style_context, &borders);
Packit Service c6b782
Packit Service c6b782
  *min_width += (borders.left + borders.right);
Packit Service c6b782
  *nat_width += (borders.left + borders.right);
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_bin_get_preferred_height (GtkWidget *widget,
Packit Service c6b782
                              gint      *min_height,
Packit Service c6b782
                              gint      *nat_height)
Packit Service c6b782
{
Packit Service c6b782
  DzlBin *self = (DzlBin *)widget;
Packit Service c6b782
  GtkStyleContext *style_context;
Packit Service c6b782
  GtkWidget *child;
Packit Service c6b782
  GtkBorder borders;
Packit Service c6b782
Packit Service c6b782
  g_assert (DZL_IS_BIN (widget));
Packit Service c6b782
Packit Service c6b782
  *min_height = 0;
Packit Service c6b782
  *nat_height = 0;
Packit Service c6b782
Packit Service c6b782
  child = gtk_bin_get_child (GTK_BIN (self));
Packit Service c6b782
  if (child != NULL)
Packit Service c6b782
    gtk_widget_get_preferred_height (child, min_height, nat_height);
Packit Service c6b782
Packit Service c6b782
  style_context = gtk_widget_get_style_context (widget);
Packit Service c6b782
  dzl_gtk_style_context_get_borders (style_context, &borders);
Packit Service c6b782
Packit Service c6b782
  *min_height += (borders.top + borders.bottom);
Packit Service c6b782
  *nat_height += (borders.top + borders.bottom);
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_bin_class_init (DzlBinClass *klass)
Packit Service c6b782
{
Packit Service c6b782
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit Service c6b782
Packit Service c6b782
  widget_class->draw = dzl_bin_draw;
Packit Service c6b782
  widget_class->get_preferred_width = dzl_bin_get_preferred_width;
Packit Service c6b782
  widget_class->get_preferred_height = dzl_bin_get_preferred_height;
Packit Service c6b782
  widget_class->size_allocate = dzl_bin_size_allocate;
Packit Service c6b782
Packit Service c6b782
  gtk_widget_class_set_css_name (widget_class, "dzlbin");
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
static void
Packit Service c6b782
dzl_bin_init (DzlBin *self)
Packit Service c6b782
{
Packit Service c6b782
}
Packit Service c6b782
Packit Service c6b782
GtkWidget *
Packit Service c6b782
dzl_bin_new (void)
Packit Service c6b782
{
Packit Service c6b782
  return g_object_new (DZL_TYPE_BIN, NULL);
Packit Service c6b782
}