|
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 |
}
|