Skip to content
Snippets Groups Projects
settings.c 67.3 KiB
Newer Older
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation; either version 2, or (at your option)
        any later version.
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Olivier Fourdan's avatar
Olivier Fourdan committed
        xfwm4    - (c) 2002-2005 Olivier Fourdan
Olivier Fourdan's avatar
Olivier Fourdan committed
 */

#ifdef HAVE_CONFIG_H
Olivier Fourdan's avatar
Olivier Fourdan committed
#endif

#include <glib.h>
#include <pango/pango.h>
Olivier Fourdan's avatar
Olivier Fourdan committed
#include <gtk/gtk.h>
#include <libxfce4util/libxfce4util.h> 
#include <libxfcegui4/libxfcegui4.h>
Olivier Fourdan's avatar
Olivier Fourdan committed
#include "parserc.h"
#include "client.h"
Olivier Fourdan's avatar
Olivier Fourdan committed
#include "workspaces.h"
#include "compositor.h"
Olivier Fourdan's avatar
Olivier Fourdan committed

#define CHANNEL1 "xfwm4"
Olivier Fourdan's avatar
Olivier Fourdan committed
#define CHANNEL2 "margins"
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
#define CHANNEL3 "workspaces"
#define CHANNEL4 "xfwm4_keys"
#define TOINT(x) (x ? atoi(x) : 0)
#define DEFAULT_KEYTHEME "Default"
#define KEYTHEMERC "keythemerc"
#define THEMERC    "themerc"
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
#define WS_SEP ';'
#define WS_SEP_S ";"
/* Forward static decls. */

static void              check_for_grabs      (ScreenInfo *);
static void              set_settings_margin  (ScreenInfo *, 
                                               int , 
                                               int);
static void              notify_cb            (const char *,
                                               const char *,
                                               McsAction, 
                                               McsSetting *,
                                               void *);
static GdkFilterReturn   client_event_filter  (GdkXEvent *,
                                               GdkEvent *, 
                                               gpointer);
static void              watch_cb             (Window, 
                                               Bool, 
                                               long, 
                                               void *);
static void              loadRcData           (ScreenInfo *, 
Olivier Fourdan's avatar
Olivier Fourdan committed
                                               Settings *);
static void              loadMcsData          (ScreenInfo *,
Olivier Fourdan's avatar
Olivier Fourdan committed
                                               Settings *);
static void              loadTheme            (ScreenInfo *, 
Olivier Fourdan's avatar
Olivier Fourdan committed
                                               Settings *);
static void              loadShortcutCmd      (ScreenInfo *, 
Olivier Fourdan's avatar
Olivier Fourdan committed
                                               Settings *);
static gboolean          loadKeyBindings      (ScreenInfo *, 
Olivier Fourdan's avatar
Olivier Fourdan committed
                                               Settings *);
static void              unloadTheme          (ScreenInfo *);
static void              unloadSettings       (ScreenInfo *);
static gboolean          reloadScreenSettings (ScreenInfo *, 
                                               int);
Olivier Fourdan's avatar
Olivier Fourdan committed

static void
check_for_grabs (ScreenInfo *screen_info)
{
    if ((screen_info->params->raise_on_click) || (screen_info->params->click_to_focus))
    {
        clientGrabMouseButtonForAll (screen_info);
    }
    else if (!(screen_info->params->raise_on_click) && !(screen_info->params->click_to_focus))
    {
        clientUngrabMouseButtonForAll (screen_info);
    }
}
set_settings_margin (ScreenInfo *screen_info, int idx, int value)
    int val;
    switch (idx)
    {
            else if (value > gdk_screen_get_width (screen_info->gscr) / 4)
                val = gdk_screen_get_width (screen_info->gscr) / 4;
            screen_info->params->xfwm_margins[idx] = val;
            else if (value > gdk_screen_get_height (screen_info->gscr) / 4)
                val = gdk_screen_get_height (screen_info->gscr) / 4;
            screen_info->params->xfwm_margins[idx] = val;
notify_cb (const char *name, const char *channel_name, McsAction action, McsSetting * setting, void *data)
    ScreenInfo *screen_info = (ScreenInfo *) data;
    
    g_return_if_fail (screen_info != NULL);
    if (!g_ascii_strcasecmp (CHANNEL1, channel_name))
                /* The following is to reduce initial startup time and reload */
                if (!screen_info->mcs_initted)
                {
                    return;
                }
            case MCS_ACTION_CHANGED:
                if (setting->type == MCS_TYPE_INT)
                {
                    if (!strcmp (name, "Xfwm/ClickToFocus"))
                    {
                        screen_info->params->click_to_focus = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/FocusNewWindow"))
                    {
                        screen_info->params->focus_new = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/FocusRaise"))
                    {
                        screen_info->params->raise_on_focus = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/RaiseDelay"))
                    {
                        screen_info->params->raise_delay = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/RaiseOnClick"))
                    {
                        screen_info->params->raise_on_click = setting->data.v_int;
                    else if (!strcmp (name, "Xfwm/SnapToBorder"))
                    {
                        screen_info->params->snap_to_border = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/SnapToWindows"))
                    {
                        screen_info->params->snap_to_windows = setting->data.v_int;
                        screen_info->params->snap_width = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/WrapWorkspaces"))
                    {
                        screen_info->params->wrap_workspaces = setting->data.v_int;
                        placeSidewalks (screen_info, screen_info->params->wrap_workspaces);
                    }
                    else if (!strcmp (name, "Xfwm/WrapWindows"))
                    {
                        screen_info->params->wrap_windows = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/WrapResistance"))
                    {
                        screen_info->params->wrap_resistance = setting->data.v_int;
                        screen_info->params->box_move = setting->data.v_int;
                        screen_info->params->box_resize = setting->data.v_int;
                    }
                }
                else if (setting->type == MCS_TYPE_STRING)
                {
                    if (!strcmp (name, "Xfwm/DblClickAction"))
                    {
                        reloadScreenSettings (screen_info, NO_UPDATE_FLAG);
                        reloadScreenSettings (screen_info, UPDATE_GRAVITY | UPDATE_CACHE);
                    }
                    else if (!strcmp (name, "Xfwm/ButtonLayout"))
                    {
                        reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
                        reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
                        reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
    else if (!g_ascii_strcasecmp (CHANNEL2, channel_name))
                /* The following is to reduce initial startup time and reloads */
                if (!screen_info->mcs_initted)
                {
                    return;
                }
            case MCS_ACTION_CHANGED:
                if (setting->type == MCS_TYPE_INT)
                {
                    if (!strcmp (name, "Xfwm/LeftMargin"))
                    {
                        set_settings_margin (screen_info, LEFT, setting->data.v_int);
                    }
                    else if (!strcmp (name, "Xfwm/RightMargin"))
                    {
                        set_settings_margin (screen_info, RIGHT, setting->data.v_int);
                    }
                    else if (!strcmp (name, "Xfwm/BottomMargin"))
                    {
                        set_settings_margin (screen_info, BOTTOM, setting->data.v_int);
                        set_settings_margin (screen_info, TOP, setting->data.v_int);
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
    else if (!g_ascii_strcasecmp (CHANNEL3, channel_name))
    {
                /* The following is to reduce initial startup time and reloads */
                if (!screen_info->mcs_initted)
                {
                    return;
                }
            case MCS_ACTION_CHANGED:
                if (setting->type == MCS_TYPE_INT)
                {
                    if (!strcmp (name, "Xfwm/WorkspaceCount"))
                    {
                        workspaceSetCount(screen_info, setting->data.v_int);
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
    }
    else if (!g_ascii_strcasecmp (CHANNEL4, channel_name))
    {
        switch (action)
        {
            case MCS_ACTION_NEW:
                /* The following is to reduce initial startup time and reloads */
                if (!screen_info->mcs_initted)
                {
                    return;
                }
            case MCS_ACTION_CHANGED:
                if (setting->type == MCS_TYPE_STRING)
                {
                    if (!strcmp (name, "Xfwm/KeyThemeName"))
                    {
                        reloadScreenSettings (screen_info, UPDATE_KEY_GRABS);
                    }
                }
                break;
            case MCS_ACTION_DELETED:
            default:
                break;
        }
    }
    else if (!g_ascii_strcasecmp (CHANNEL5, channel_name))
    {
        switch (action)
        {
            case MCS_ACTION_NEW:
                /* The following is to reduce initial startup time and reloads */
                if (!screen_info->mcs_initted)
                {
                    return;
                }
            case MCS_ACTION_CHANGED:
                if (setting->type == MCS_TYPE_INT)
                {
                    if (!strcmp (name, "Xfwm/CycleMinimum"))
                    {
                        screen_info->params->cycle_minimum = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/CycleHidden"))
                    {
                        screen_info->params->cycle_hidden = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/EasyClick"))
                    {
                        screen_info->params->easy_click = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/FocusHint"))
                    {
                        screen_info->params->focus_hint = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/MoveOpacity"))
                    {
                        screen_info->params->move_opacity = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/ResizeOpacity"))
                    {
                        screen_info->params->resize_opacity = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/PopupOpacity"))
                    {
                        screen_info->params->popup_opacity = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/PlacementRatio"))
                    {
                        screen_info->params->placement_ratio = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/ShowFrameShadow"))
                    {
                        screen_info->params->show_frame_shadow = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/ShowPopupShadow"))
                    {
                        screen_info->params->show_popup_shadow = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/PreventFocusStealing"))
                    {
                        screen_info->params->prevent_focus_stealing = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/RaiseWithAnyButton"))
                    {
                        screen_info->params->raise_with_any_button = setting->data.v_int;
                        check_for_grabs (screen_info);
                    }
                    else if (!strcmp (name, "Xfwm/ScrollWorkspaces"))
                    {
                        screen_info->params->scroll_workspaces = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/ToggleWorkspaces"))
                    {
                        screen_info->params->toggle_workspaces = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/WrapLayout"))
                    {
                        screen_info->params->wrap_layout = setting->data.v_int;
                    }
                    else if (!strcmp (name, "Xfwm/WrapCycle"))
                    {
                        screen_info->params->wrap_cycle = setting->data.v_int;
                    }
                }
                break;
            case MCS_ACTION_DELETED:
            default:
                break;
        }
    }
static GdkFilterReturn
client_event_filter (GdkXEvent * xevent, GdkEvent * event, gpointer data)
    ScreenInfo *screen_info = (ScreenInfo *) data;
    
    if (mcs_client_process_event (screen_info->mcs_client, (XEvent *) xevent))
static void
watch_cb (Window window, Bool is_start, long mask, void *cb_data)
    gdkwin = gdk_window_lookup (window);
        if (!gdkwin)
        {
            gdkwin = gdk_window_foreign_new (window);
        }
        else
        {
            g_object_ref (gdkwin);
        }
        gdk_window_add_filter (gdkwin, client_event_filter, cb_data);
        g_assert (gdkwin);
        gdk_window_remove_filter (gdkwin, client_event_filter, cb_data);
        g_object_unref (gdkwin);
Olivier Fourdan's avatar
Olivier Fourdan committed
loadRcData (ScreenInfo *screen_info, Settings *rc)
    gchar *homedir;
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
    gchar *keythemevalue;
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed

Olivier Fourdan's avatar
Olivier Fourdan committed
        g_warning ("Missing defaults file");
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
    keythemevalue = getValue ("keytheme", rc);
    if (keythemevalue)
    {
        system_keytheme = getSystemThemeDir ();
        parseRc (KEYTHEMERC, system_keytheme, rc);
        
        keytheme = getThemeDir (keythemevalue, KEYTHEMERC);
        if (keytheme)
        {
            /* If there is a custom key theme, merge it with system defaults */
            parseRc (KEYTHEMERC, keytheme, rc);
            g_free (keytheme);
Jasper Huijsmans's avatar
 
Jasper Huijsmans committed
    }
    homedir = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, 
                                           "xfce4" G_DIR_SEPARATOR_S "xfwm4",
                                           FALSE);
    parseRc ("xfwm4rc", homedir, rc);
    g_free (homedir);
Olivier Fourdan's avatar
Olivier Fourdan committed
loadMcsData (ScreenInfo *screen_info, Settings *rc)
    if (screen_info->mcs_client)
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ClickToFocus", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("click_to_focus", setting->data.v_int, rc);
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusNewWindow", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("focus_new", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusRaise", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("raise_on_focus", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseDelay", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("raise_delay", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseOnClick", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("raise_on_click", setting->data.v_int, rc);
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapToBorder", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("snap_to_border", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapToWindows", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("snap_to_windows", setting->data.v_int,
                rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapWidth", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("snap_width", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapWorkspaces", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("wrap_workspaces", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapWindows", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("wrap_windows", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapResistance", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("wrap_resistance", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BoxMove", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("box_move", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BoxResize", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("box_resize", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/DblClickAction", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setValue ("double_click_action", setting->data.v_string, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ThemeName", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setValue ("theme", setting->data.v_string, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ButtonLayout", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setValue ("button_layout", setting->data.v_string, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/TitleAlign", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setValue ("title_alignment", setting->data.v_string, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/TitleFont", CHANNEL1,
                &setting) == MCS_SUCCESS)
        {
            setValue ("title_font", setting->data.v_string, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/LeftMargin", CHANNEL2,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("margin_left", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RightMargin", CHANNEL2,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("margin_right", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BottomMargin", CHANNEL2,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("margin_bottom", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/TopMargin", CHANNEL2,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("margin_top", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WorkspaceCount", CHANNEL3,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("workspace_count", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/KeyThemeName", CHANNEL4,
                &setting) == MCS_SUCCESS)
        {
            setValue ("keytheme", setting->data.v_string, rc);
            mcs_setting_free (setting);
        }

        /* Tweaks channel */
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleMinimum", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("cycle_minimum", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleHidden", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("cycle_hidden", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/EasyClick", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("easy_click", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusHint", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("focus_hint", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PlacementRatio", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("placement_ratio", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/MoveOpacity", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("move_opacity", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ResizeOpacity", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("resize_opacity", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PopupOpacity", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setIntValueFromInt ("popup_opacity", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShowFrameShadow", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("show_frame_shadow", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ShowPopupShadow", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("show_popup_shadow", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PreventFocusStealing", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("prevent_focus_stealing", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseWithAnyButton", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("raise_with_any_button", setting->data.v_int, rc);
            check_for_grabs (screen_info);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ScrollWorkspaces", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("scroll_workspaces", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ToggleWorkspaces", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("toggle_workspaces", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapLayout", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("wrap_layout", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WrapCycle", CHANNEL5,
                &setting) == MCS_SUCCESS)
        {
            setBooleanValueFromInt ("wrap_cycle", setting->data.v_int, rc);
            mcs_setting_free (setting);
        }
Olivier Fourdan's avatar
Olivier Fourdan committed
loadTheme (ScreenInfo *screen_info, Settings *rc)
Olivier Fourdan's avatar
Olivier Fourdan committed
{
Olivier Fourdan's avatar
Olivier Fourdan committed
    GtkWidget *widget = NULL;
    DisplayInfo *display_info = NULL;
    gchar *font;
    PangoFontDescription *desc = NULL;
    GValue tmp_val = { 0, };
Olivier Fourdan's avatar
Olivier Fourdan committed
    widget = myScreenGetGtkWidget (screen_info);
    display_info = screen_info->display_info;

    rc[0].value  = get_style (widget, "fg",    "selected");
    rc[1].value  = get_style (widget, "fg",    "insensitive");
    rc[2].value  = get_style (widget, "fg",    "normal");
    rc[3].value  = get_style (widget, "fg",    "normal");
    rc[4].value  = get_style (widget, "bg",    "selected");
    rc[5].value  = get_style (widget, "light", "selected");
    rc[6].value  = get_style (widget, "dark",  "selected");
    rc[7].value  = get_style (widget, "mid",   "selected");
    rc[8].value  = get_style (widget, "bg",    "normal");
    rc[9].value  = get_style (widget, "light", "normal");
    rc[10].value = get_style (widget, "dark",  "normal");
    rc[11].value = get_style (widget, "mid",   "normal");
    rc[12].value = get_style (widget, "bg",    "insensitive");
    rc[13].value = get_style (widget, "light", "insensitive");
    rc[14].value = get_style (widget, "dark",  "insensitive");
    rc[15].value = get_style (widget, "mid",   "insensitive");
    rc[16].value = get_style (widget, "bg",    "normal");
    rc[17].value = get_style (widget, "light", "normal");
    rc[18].value = get_style (widget, "dark",  "normal");
    rc[19].value = get_style (widget, "mid",   "normal");
Olivier Fourdan's avatar
Olivier Fourdan committed

    theme = getThemeDir (getValue ("theme", rc), THEMERC);
    parseRc (THEMERC, theme, rc);
    screen_info->params->shadow_delta_x = 
        abs (TOINT (getValue ("shadow_delta_x", rc)));
    screen_info->params->shadow_delta_y = 
        abs (TOINT (getValue ("shadow_delta_y", rc)));
    screen_info->params->shadow_delta_width = 
        abs (TOINT (getValue ("shadow_delta_width", rc)));
    screen_info->params->shadow_delta_height = 
        abs (TOINT (getValue ("shadow_delta_height", rc)));

        colsym[i].name = rc[i].option;
        colsym[i].value = rc[i].value;
    display_info->dbl_click_time = abs (TOINT (getValue ("dbl_click_time", rc)));
    if (gdk_setting_get ("gtk-double-click-time", &tmp_val))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        display_info->dbl_click_time = abs (g_value_get_int (&tmp_val));
Olivier Fourdan's avatar
Olivier Fourdan committed
    }

    font = getValue ("title_font", rc);
    if (font && strlen (font))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        desc = pango_font_description_from_string (font);
        if (desc)
            gtk_widget_modify_font (widget, desc);
            pango_font_description_free (desc);
        }
    }
 
    if (screen_info->title_colors[ACTIVE].allocated)
    {
        gdk_colormap_free_colors (gdk_screen_get_rgb_colormap (screen_info->gscr),
            &screen_info->title_colors[ACTIVE].col, 1);
        screen_info->title_colors[ACTIVE].allocated = FALSE;
    }
    if (gdk_color_parse (rc[0].value, &screen_info->title_colors[ACTIVE].col))
    {
        if (gdk_colormap_alloc_color (gdk_screen_get_rgb_colormap (screen_info->gscr),
                &screen_info->title_colors[ACTIVE].col, FALSE, FALSE))
        {
            screen_info->title_colors[ACTIVE].allocated = TRUE;
            if (screen_info->title_colors[ACTIVE].gc)
                g_object_unref (G_OBJECT (screen_info->title_colors[ACTIVE].gc));
            screen_info->title_colors[ACTIVE].gc =
                gdk_gc_new (myScreenGetGdkWindow (screen_info));
            gdk_gc_copy (screen_info->title_colors[ACTIVE].gc, get_style_gc (widget,
            gdk_gc_set_foreground (screen_info->title_colors[ACTIVE].gc,
                &screen_info->title_colors[ACTIVE].col);
            g_message (_("%s: Cannot allocate active color %s\n"), g_get_prgname (), rc[0].value);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    else
    {
        g_message (_("%s: Cannot parse active color %s\n"), g_get_prgname (), rc[0].value);
    if (screen_info->black_gc)
        g_object_unref (G_OBJECT (screen_info->black_gc));
    screen_info->black_gc = widget->style->black_gc;
    g_object_ref (G_OBJECT (widget->style->black_gc));
    if (screen_info->white_gc)
        g_object_unref (G_OBJECT (screen_info->white_gc));
    screen_info->white_gc = widget->style->white_gc;
    g_object_ref (G_OBJECT (widget->style->white_gc));
    if (screen_info->title_colors[INACTIVE].allocated)
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        gdk_colormap_free_colors (gdk_screen_get_rgb_colormap (screen_info->gscr),
            &screen_info->title_colors[INACTIVE].col, 1);
        screen_info->title_colors[INACTIVE].allocated = FALSE;
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    if (gdk_color_parse (rc[1].value, &screen_info->title_colors[INACTIVE].col))
Olivier Fourdan's avatar
Olivier Fourdan committed
    {
        if (gdk_colormap_alloc_color (gdk_screen_get_rgb_colormap (screen_info->gscr),
                &screen_info->title_colors[INACTIVE].col, FALSE, FALSE))
            screen_info->title_colors[INACTIVE].allocated = TRUE;
            if (screen_info->title_colors[INACTIVE].gc)
                g_object_unref (G_OBJECT (screen_info->title_colors[INACTIVE].gc));
            screen_info->title_colors[INACTIVE].gc =
                gdk_gc_new (myScreenGetGdkWindow (screen_info));
            gdk_gc_copy (screen_info->title_colors[INACTIVE].gc,
                get_style_gc (widget, "text", "normal"));
            gdk_gc_set_foreground (screen_info->title_colors[INACTIVE].gc,
                &screen_info->title_colors[INACTIVE].col);
            g_message (_("%s: Cannot allocate inactive color %s\n"), g_get_prgname (), rc[1].value);
Olivier Fourdan's avatar
Olivier Fourdan committed
    }
    else
    {
        g_message (_("%s: Cannot parse inactive color %s\n"), g_get_prgname (), rc[1].value);
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_LEFT][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_LEFT][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_RIGHT][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_RIGHT][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_BOTTOM][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->sides[SIDE_BOTTOM][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_LEFT][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_LEFT][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_RIGHT][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_TOP_RIGHT][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_LEFT][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_LEFT][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_RIGHT][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->corners[CORNER_BOTTOM_RIGHT][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[HIDE_BUTTON][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[HIDE_BUTTON][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[HIDE_BUTTON][PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[CLOSE_BUTTON][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[CLOSE_BUTTON][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[CLOSE_BUTTON][PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MENU_BUTTON][ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MENU_BUTTON][INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MENU_BUTTON][PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][T_ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][T_INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[SHADE_BUTTON][T_PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][T_ACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][T_INACTIVE], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[STICK_BUTTON][T_PRESSED], theme,
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][T_ACTIVE], theme,
        "maximize-toggled-active", colsym, 20);
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][T_INACTIVE], theme,
        "maximize-toggled-inactive", colsym, 20);
    xfwmPixmapLoad (screen_info, &screen_info->buttons[MAXIMIZE_BUTTON][T_PRESSED], theme,
        "maximize-toggled-pressed", colsym, 20);
    xfwmPixmapLoad (screen_info, &screen_info->title[TITLE_1][ACTIVE], theme,