Blame libmetacity/meta-theme-impl.c

Packit 5e0819
/*
Packit 5e0819
 * Copyright (C) 2016 Alberts Muktupāvels
Packit 5e0819
 *
Packit 5e0819
 * This program is free software: you can redistribute it and/or modify
Packit 5e0819
 * it under the terms of the GNU General Public License as published by
Packit 5e0819
 * the Free Software Foundation, either version 2 of the License, or
Packit 5e0819
 * (at your option) any later version.
Packit 5e0819
 *
Packit 5e0819
 * This program is distributed in the hope that it will be useful,
Packit 5e0819
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5e0819
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Packit 5e0819
 * GNU General Public License for more details.
Packit 5e0819
 *
Packit 5e0819
 * You should have received a copy of the GNU General Public License
Packit 5e0819
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Packit 5e0819
 */
Packit 5e0819
Packit 5e0819
#include "config.h"
Packit 5e0819
Packit 5e0819
#include <glib/gi18n.h>
Packit 5e0819
Packit 5e0819
#include "meta-theme-impl-private.h"
Packit 5e0819
#include "meta-theme.h"
Packit 5e0819
Packit 5e0819
typedef struct
Packit 5e0819
{
Packit 5e0819
  gboolean composited;
Packit 5e0819
  gint     scale;
Packit 5e0819
} MetaThemeImplPrivate;
Packit 5e0819
Packit 5e0819
G_DEFINE_TYPE_WITH_PRIVATE (MetaThemeImpl, meta_theme_impl, G_TYPE_OBJECT)
Packit 5e0819
Packit 5e0819
static gboolean
Packit 5e0819
meta_theme_impl_real_load (MetaThemeImpl  *impl,
Packit 5e0819
                           const gchar    *name,
Packit 5e0819
                           GError        **error)
Packit 5e0819
{
Packit 5e0819
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
Packit 5e0819
Packit 5e0819
  g_set_error (error, META_THEME_ERROR, META_THEME_ERROR_FAILED,
Packit 5e0819
               _("MetaThemeImplClass::load not implemented for '%s'"),
Packit 5e0819
               g_type_name (G_TYPE_FROM_INSTANCE (impl)));
Packit 5e0819
Packit 5e0819
  return FALSE;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
static void
Packit 5e0819
meta_theme_impl_class_init (MetaThemeImplClass *impl_class)
Packit 5e0819
{
Packit 5e0819
  impl_class->load = meta_theme_impl_real_load;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
static void
Packit 5e0819
meta_theme_impl_init (MetaThemeImpl *impl)
Packit 5e0819
{
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
void
Packit 5e0819
meta_theme_impl_set_composited (MetaThemeImpl *impl,
Packit 5e0819
                                gboolean       composited)
Packit 5e0819
{
Packit 5e0819
  MetaThemeImplPrivate *priv;
Packit 5e0819
Packit 5e0819
  priv = meta_theme_impl_get_instance_private (impl);
Packit 5e0819
Packit 5e0819
  priv->composited = composited;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
gboolean
Packit 5e0819
meta_theme_impl_get_composited (MetaThemeImpl *impl)
Packit 5e0819
{
Packit 5e0819
  MetaThemeImplPrivate *priv;
Packit 5e0819
Packit 5e0819
  priv = meta_theme_impl_get_instance_private (impl);
Packit 5e0819
Packit 5e0819
  return priv->composited;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
void
Packit 5e0819
meta_theme_impl_set_scale (MetaThemeImpl *impl,
Packit 5e0819
                           gint           scale)
Packit 5e0819
{
Packit 5e0819
  MetaThemeImplPrivate *priv;
Packit 5e0819
Packit 5e0819
  priv = meta_theme_impl_get_instance_private (impl);
Packit 5e0819
Packit 5e0819
  priv->scale = scale;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
gint
Packit 5e0819
meta_theme_impl_get_scale (MetaThemeImpl *impl)
Packit 5e0819
{
Packit 5e0819
  MetaThemeImplPrivate *priv;
Packit 5e0819
Packit 5e0819
  priv = meta_theme_impl_get_instance_private (impl);
Packit 5e0819
Packit 5e0819
  return priv->scale;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
void
Packit 5e0819
scale_border (GtkBorder *border,
Packit 5e0819
              double     factor)
Packit 5e0819
{
Packit 5e0819
  border->left *= factor;
Packit 5e0819
  border->right *= factor;
Packit 5e0819
  border->top *= factor;
Packit 5e0819
  border->bottom *= factor;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
gboolean
Packit 5e0819
is_button_visible (MetaButton     *button,
Packit 5e0819
                   MetaFrameFlags  flags)
Packit 5e0819
{
Packit 5e0819
  gboolean visible;
Packit 5e0819
Packit 5e0819
  visible = FALSE;
Packit 5e0819
Packit 5e0819
  switch (button->type)
Packit 5e0819
    {
Packit 5e0819
      case META_BUTTON_TYPE_MENU:
Packit 5e0819
        if (flags & META_FRAME_ALLOWS_MENU)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_APPMENU:
Packit 5e0819
        if (flags & META_FRAME_ALLOWS_APPMENU)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_MINIMIZE:
Packit 5e0819
        if (flags & META_FRAME_ALLOWS_MINIMIZE)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_MAXIMIZE:
Packit 5e0819
        if (flags & META_FRAME_ALLOWS_MAXIMIZE)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_CLOSE:
Packit 5e0819
        if (flags & META_FRAME_ALLOWS_DELETE)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_SHADE:
Packit 5e0819
        if ((flags & META_FRAME_ALLOWS_SHADE) && !(flags & META_FRAME_SHADED))
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_ABOVE:
Packit 5e0819
        if (!(flags & META_FRAME_ABOVE))
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_STICK:
Packit 5e0819
        if (!(flags & META_FRAME_STUCK))
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_UNSHADE:
Packit 5e0819
        if ((flags & META_FRAME_ALLOWS_SHADE) && (flags & META_FRAME_SHADED))
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_UNABOVE:
Packit 5e0819
        if (flags & META_FRAME_ABOVE)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_UNSTICK:
Packit 5e0819
        if (flags & META_FRAME_STUCK)
Packit 5e0819
          visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_SPACER:
Packit 5e0819
        visible = TRUE;
Packit 5e0819
        break;
Packit 5e0819
Packit 5e0819
      case META_BUTTON_TYPE_LAST:
Packit 5e0819
      default:
Packit 5e0819
        break;
Packit 5e0819
    }
Packit 5e0819
Packit 5e0819
  return visible;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
gboolean
Packit 5e0819
strip_button (MetaButton     *buttons,
Packit 5e0819
              gint            n_buttons,
Packit 5e0819
              MetaButtonType  type)
Packit 5e0819
{
Packit 5e0819
  gint i;
Packit 5e0819
Packit 5e0819
  for (i = 0; i < n_buttons; i++)
Packit 5e0819
    {
Packit 5e0819
      if (buttons[i].type == type && buttons[i].visible)
Packit 5e0819
        {
Packit 5e0819
          buttons[i].visible = FALSE;
Packit 5e0819
          return TRUE;
Packit 5e0819
        }
Packit 5e0819
    }
Packit 5e0819
Packit 5e0819
  return FALSE;
Packit 5e0819
}
Packit 5e0819
Packit 5e0819
gboolean
Packit 5e0819
strip_buttons (MetaButtonLayout *layout,
Packit 5e0819
               gint             *n_left,
Packit 5e0819
               gint             *n_right)
Packit 5e0819
{
Packit 5e0819
  gint count;
Packit 5e0819
  MetaButtonType types[META_BUTTON_TYPE_LAST];
Packit 5e0819
  gint i;
Packit 5e0819
Packit 5e0819
  count = 0;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_ABOVE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_UNABOVE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_STICK;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_UNSTICK;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_SHADE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_UNSHADE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_MINIMIZE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_MAXIMIZE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_CLOSE;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_MENU;
Packit 5e0819
  types[count++] = META_BUTTON_TYPE_APPMENU;
Packit 5e0819
Packit 5e0819
  for (i = 0; i < count; i++)
Packit 5e0819
    {
Packit 5e0819
      if (strip_button (layout->left_buttons, layout->n_left_buttons,
Packit 5e0819
                        types[i]))
Packit 5e0819
        {
Packit 5e0819
          *n_left -= 1;
Packit 5e0819
          return TRUE;
Packit 5e0819
        }
Packit 5e0819
      else if (strip_button (layout->right_buttons, layout->n_right_buttons,
Packit 5e0819
                             types[i]))
Packit 5e0819
        {
Packit 5e0819
          *n_right -= 1;
Packit 5e0819
          return TRUE;
Packit 5e0819
        }
Packit 5e0819
    }
Packit 5e0819
Packit 5e0819
  return FALSE;
Packit 5e0819
}