Newer
Older
Olivier Fourdan
committed
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.
Olivier Fourdan
committed
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.
Olivier Fourdan
committed
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., Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
Olivier Fourdan
committed
oroborus - (c) 2001 Ken Lynch
#endif
#include <glib.h>
#include <pango/pango.h>
Olivier Fourdan
committed
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <libxfce4util/libxfce4util.h>
Olivier Fourdan
committed
#include <libxfce4mcs/mcs-client.h>
#include "screen.h"
#include "focus.h"
#include "ui_style.h"
#define CHANNEL1 "xfwm4"
#define CHANNEL2 "margins"
#define CHANNEL3 "workspaces"
#define CHANNEL4 "xfwm4_keys"
#define DEFAULT_KEYTHEME "Default"
#define KEYTHEMERC "keythemerc"
#define THEMERC "themerc"
#define TOINT(x) (x ? atoi(x) : 0)
#define XPM_COLOR_SYMBOL_SIZE 22
Olivier Fourdan
committed
static void update_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 *,
static void watch_cb (Window,
Bool,
long,
static void loadRcData (ScreenInfo *,
static void loadTheme (ScreenInfo *,
static gboolean loadKeyBindings (ScreenInfo *,
static void unloadTheme (ScreenInfo *);
static void unloadSettings (ScreenInfo *);
static gboolean reloadScreenSettings (ScreenInfo *,
static void
Olivier Fourdan
committed
update_grabs (ScreenInfo *screen_info)
{
Olivier Fourdan
committed
clientUngrabMouseButtonForAll (screen_info);
if ((screen_info->params->raise_on_click) || (screen_info->params->click_to_focus))
{
clientGrabMouseButtonForAll (screen_info);
}
}
Olivier Fourdan
committed
set_settings_margin (ScreenInfo *screen_info, int idx, int value)
Olivier Fourdan
committed
{
Olivier Fourdan
committed
case STRUTS_LEFT:
case STRUTS_RIGHT:
Olivier Fourdan
committed
if (value < 0)
{
val = 0;
}
else if (value > screen_info->width / 4)
Olivier Fourdan
committed
{
val = screen_info->width / 4;
Olivier Fourdan
committed
}
else
{
val = value;
}
screen_info->params->xfwm_margins[idx] = val;
Olivier Fourdan
committed
break;
Olivier Fourdan
committed
case STRUTS_TOP:
case STRUTS_BOTTOM:
Olivier Fourdan
committed
if (value < 0)
{
val = 0;
}
else if (value > screen_info->height / 4)
Olivier Fourdan
committed
{
val = screen_info->height / 4;
Olivier Fourdan
committed
}
else
{
val = value;
}
screen_info->params->xfwm_margins[idx] = val;
Olivier Fourdan
committed
break;
default:
break;
Olivier Fourdan
committed
Olivier Fourdan
committed
static void
set_easy_click (ScreenInfo *screen_info, char *modifier)
{
g_return_if_fail (screen_info != NULL);
g_return_if_fail (modifier != NULL);
if (!g_ascii_strcasecmp (modifier, "true"))
{
screen_info->params->easy_click = AltMask;
}
else
{
screen_info->params->easy_click = getModifierMap (modifier);
}
}
Olivier Fourdan
committed
static void
set_activate_action (ScreenInfo *screen_info, const char *value)
{
g_return_if_fail (screen_info != NULL);
g_return_if_fail (value != NULL);
if (!g_ascii_strcasecmp ("bring", value))
{
screen_info->params->activate_action = ACTIVATE_ACTION_BRING;
}
else if (!g_ascii_strcasecmp ("switch", value))
{
screen_info->params->activate_action = ACTIVATE_ACTION_SWITCH;
}
else
{
screen_info->params->activate_action = ACTIVATE_ACTION_NONE;
}
}
static void
set_placement_mode (ScreenInfo *screen_info, const char *value)
{
g_return_if_fail (screen_info != NULL);
g_return_if_fail (value != NULL);
if (!g_ascii_strcasecmp ("mouse", value))
{
screen_info->params->placement_mode = PLACE_MOUSE;
}
else
{
screen_info->params->placement_mode = PLACE_CENTER;
}
}
notify_cb (const char *name, const char *channel_name, McsAction action, McsSetting * setting, void *data)
ScreenInfo *screen_info;
screen_info = (ScreenInfo *) data;
if (!g_ascii_strcasecmp (CHANNEL1, channel_name))
Olivier Fourdan
committed
switch (action)
{
case MCS_ACTION_NEW:
/* The following is to reduce initial startup time and reload */
Olivier Fourdan
committed
{
return;
}
case MCS_ACTION_CHANGED:
if (setting->type == MCS_TYPE_INT)
{
if (!strcmp (name, "Xfwm/BoxMove"))
{
screen_info->params->box_move = setting->data.v_int;
}
else if (!strcmp (name, "Xfwm/BoxResize"))
{
screen_info->params->box_resize = setting->data.v_int;
}
else if (!strcmp (name, "Xfwm/ClickToFocus"))
Olivier Fourdan
committed
{
screen_info->params->click_to_focus = setting->data.v_int;
Olivier Fourdan
committed
update_grabs (screen_info);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/FocusNewWindow"))
{
screen_info->params->focus_new = setting->data.v_int;
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/FocusRaise"))
{
screen_info->params->raise_on_focus = setting->data.v_int;
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/RaiseDelay"))
{
screen_info->params->raise_delay = setting->data.v_int;
Olivier Fourdan
committed
}
Olivier Fourdan
committed
{
screen_info->params->focus_delay = setting->data.v_int;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/RaiseOnClick"))
{
screen_info->params->raise_on_click = setting->data.v_int;
Olivier Fourdan
committed
update_grabs (screen_info);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/SnapToBorder"))
{
screen_info->params->snap_to_border = setting->data.v_int;
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/SnapToWindows"))
{
screen_info->params->snap_to_windows = setting->data.v_int;
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/SnapWidth"))
{
screen_info->params->snap_width = setting->data.v_int;
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/WrapWorkspaces"))
{
screen_info->params->wrap_workspaces = setting->data.v_int;
placeSidewalks (screen_info, screen_info->params->wrap_workspaces);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/WrapWindows"))
{
screen_info->params->wrap_windows = setting->data.v_int;
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/WrapResistance"))
{
screen_info->params->wrap_resistance = setting->data.v_int;
Olivier Fourdan
committed
}
}
else if (setting->type == MCS_TYPE_STRING)
{
if (!strcmp (name, "Xfwm/DblClickAction"))
{
reloadScreenSettings (screen_info, NO_UPDATE_FLAG);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/ThemeName"))
{
Olivier Fourdan
committed
reloadScreenSettings (screen_info, UPDATE_MAXIMIZE | UPDATE_GRAVITY | UPDATE_CACHE);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/ButtonLayout"))
{
reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
Olivier Fourdan
committed
}
if (!strcmp (name, "Xfwm/TitleAlign"))
{
reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
Olivier Fourdan
committed
}
if (!strcmp (name, "Xfwm/TitleFont"))
{
reloadScreenSettings (screen_info, UPDATE_FRAME | UPDATE_CACHE);
Olivier Fourdan
committed
}
}
break;
case MCS_ACTION_DELETED:
default:
break;
}
else if (!g_ascii_strcasecmp (CHANNEL2, channel_name))
Olivier Fourdan
committed
switch (action)
{
case MCS_ACTION_NEW:
/* The following is to reduce initial startup time and reloads */
Olivier Fourdan
committed
{
return;
}
case MCS_ACTION_CHANGED:
if (setting->type == MCS_TYPE_INT)
{
if (!strcmp (name, "Xfwm/LeftMargin"))
{
Olivier Fourdan
committed
set_settings_margin (screen_info, STRUTS_LEFT, setting->data.v_int);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/RightMargin"))
{
Olivier Fourdan
committed
set_settings_margin (screen_info, STRUTS_RIGHT, setting->data.v_int);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/BottomMargin"))
{
Olivier Fourdan
committed
set_settings_margin (screen_info, STRUTS_BOTTOM, setting->data.v_int);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/TopMargin"))
{
Olivier Fourdan
committed
set_settings_margin (screen_info, STRUTS_TOP, setting->data.v_int);
Olivier Fourdan
committed
}
}
break;
case MCS_ACTION_DELETED:
default:
break;
}
Olivier Fourdan
committed
}
Olivier Fourdan
committed
switch (action)
{
case MCS_ACTION_NEW:
/* The following is to reduce initial startup time and reloads */
Olivier Fourdan
committed
{
return;
}
case MCS_ACTION_CHANGED:
if (setting->type == MCS_TYPE_INT)
{
if (!strcmp (name, "Xfwm/WorkspaceCount"))
{
workspaceSetCount(screen_info, setting->data.v_int);
Olivier Fourdan
committed
}
}
break;
case MCS_ACTION_DELETED:
default:
break;
}
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"))
{
Olivier Fourdan
committed
reloadScreenSettings (screen_info, NO_UPDATE_FLAG);
}
}
break;
case MCS_ACTION_DELETED:
default:
break;
}
}
Olivier Fourdan
committed
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/BorderlessMaximize"))
{
screen_info->params->borderless_maximize = setting->data.v_int;
Olivier Fourdan
committed
reloadScreenSettings (screen_info, UPDATE_MAXIMIZE);
}
else if (!strcmp (name, "Xfwm/CycleMinimum"))
Olivier Fourdan
committed
{
screen_info->params->cycle_minimum = setting->data.v_int;
}
else if (!strcmp (name, "Xfwm/CycleHidden"))
{
screen_info->params->cycle_hidden = setting->data.v_int;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/CycleWorkspaces"))
{
screen_info->params->cycle_workspaces = setting->data.v_int;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/FocusHint"))
{
screen_info->params->focus_hint = setting->data.v_int;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/FrameOpacity"))
{
screen_info->params->frame_opacity = setting->data.v_int;
reloadScreenSettings (screen_info, UPDATE_FRAME);
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/InactiveOpacity"))
{
screen_info->params->inactive_opacity = setting->data.v_int;
reloadScreenSettings (screen_info, UPDATE_FRAME);
clientUpdateOpacity (screen_info, clientGetFocus ());
}
Olivier Fourdan
committed
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;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/PopupOpacity"))
{
screen_info->params->popup_opacity = setting->data.v_int;
Olivier Fourdan
committed
reloadScreenSettings (screen_info, UPDATE_FRAME);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/PlacementRatio"))
{
screen_info->params->placement_ratio = setting->data.v_int;
}
else if (!strcmp (name, "Xfwm/ShowDockShadow"))
{
screen_info->params->show_dock_shadow = setting->data.v_int;
reloadScreenSettings (screen_info, UPDATE_FRAME);
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/ShowFrameShadow"))
{
screen_info->params->show_frame_shadow = setting->data.v_int;
Olivier Fourdan
committed
reloadScreenSettings (screen_info, UPDATE_FRAME);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/ShowPopupShadow"))
{
screen_info->params->show_popup_shadow = setting->data.v_int;
Olivier Fourdan
committed
reloadScreenSettings (screen_info, UPDATE_FRAME);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/SnapResist"))
{
screen_info->params->snap_resist = setting->data.v_int;
}
Olivier Fourdan
committed
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;
Olivier Fourdan
committed
update_grabs (screen_info);
Olivier Fourdan
committed
}
else if (!strcmp (name, "Xfwm/RestoreOnMove"))
{
screen_info->params->restore_on_move = setting->data.v_int;
}
Olivier Fourdan
committed
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;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/UnredirectOverlays"))
{
screen_info->params->unredirect_overlays = setting->data.v_int;
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/UseCompositing"))
{
screen_info->params->use_compositing = setting->data.v_int;
compositorActivateScreen (screen_info,
Olivier Fourdan
committed
screen_info->params->use_compositing);
}
Olivier Fourdan
committed
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;
}
}
Olivier Fourdan
committed
else if (setting->type == MCS_TYPE_STRING)
{
if (!strcmp (name, "Xfwm/EasyClick"))
{
reloadScreenSettings (screen_info, UPDATE_BUTTON_GRABS);
}
Olivier Fourdan
committed
else if (!strcmp (name, "Xfwm/ActivateAction"))
{
set_activate_action (screen_info, setting->data.v_string);
}
else if (!strcmp (name, "Xfwm/PlacementMode"))
{
set_placement_mode (screen_info, setting->data.v_string);
}
Olivier Fourdan
committed
}
Olivier Fourdan
committed
break;
case MCS_ACTION_DELETED:
default:
break;
}
}
Olivier Fourdan
committed
}
static GdkFilterReturn
client_event_filter (GdkXEvent * xevent, GdkEvent * event, gpointer data)
Olivier Fourdan
committed
{
ScreenInfo *screen_info;
screen_info = (ScreenInfo *) data;
g_return_val_if_fail (screen_info != NULL, GDK_FILTER_CONTINUE);
if (mcs_client_process_event (screen_info->mcs_client, (XEvent *) xevent))
{
Olivier Fourdan
committed
return GDK_FILTER_REMOVE;
}
Olivier Fourdan
committed
else
{
Olivier Fourdan
committed
return GDK_FILTER_CONTINUE;
}
Olivier Fourdan
committed
}
static void
watch_cb (Window window, Bool is_start, long mask, void *cb_data)
Olivier Fourdan
committed
{
GdkWindow *gdkwin;
gdkwin = gdk_window_lookup (window);
Olivier Fourdan
committed
Olivier Fourdan
committed
{
Olivier Fourdan
committed
if (!gdkwin)
{
gdkwin = gdk_window_foreign_new (window);
}
else
{
g_object_ref (gdkwin);
}
gdk_window_add_filter (gdkwin, client_event_filter, cb_data);
Olivier Fourdan
committed
}
else
{
Olivier Fourdan
committed
g_assert (gdkwin);
gdk_window_remove_filter (gdkwin, client_event_filter, cb_data);
g_object_unref (gdkwin);
Olivier Fourdan
committed
}
}
Olivier Fourdan
committed
{
Olivier Fourdan
committed
gchar *keytheme;
gchar *system_keytheme;
Olivier Fourdan
committed
if (!parseRc ("defaults", PACKAGE_DATADIR, rc))
Olivier Fourdan
committed
{
Olivier Fourdan
committed
exit (1);
Olivier Fourdan
committed
}
keythemevalue = getValue ("keytheme", rc);
if (keythemevalue)
{
Olivier Fourdan
committed
system_keytheme = getSystemThemeDir ();
parseRc (KEYTHEMERC, system_keytheme, rc);
Olivier Fourdan
committed
keytheme = getThemeDir (keythemevalue, KEYTHEMERC);
Olivier Fourdan
committed
{
/* If there is a custom key theme, merge it with system defaults */
parseRc (KEYTHEMERC, keytheme, rc);
Olivier Fourdan
committed
}
g_free (system_keytheme);
homedir = xfce_resource_save_location (XFCE_RESOURCE_CONFIG,
"xfce4" G_DIR_SEPARATOR_S "xfwm4",
FALSE);
parseRc ("xfwm4rc", homedir, rc);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
{
McsSetting *setting;
Olivier Fourdan
committed
{
Olivier Fourdan
committed
/* "Regular" channel */
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ClickToFocus", CHANNEL1,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("click_to_focus", setting->data.v_int, rc);
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusNewWindow", CHANNEL1,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
setIntValueFromInt ("raise_delay", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FocusDelay", CHANNEL1,
&setting) == MCS_SUCCESS)
{
setIntValueFromInt ("focus_delay", setting->data.v_int, rc);
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RaiseOnClick", CHANNEL1,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("raise_on_click", setting->data.v_int, rc);
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapToBorder", CHANNEL1,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
Olivier Fourdan
committed
setBooleanValueFromInt ("snap_to_windows", setting->data.v_int, rc);
Olivier Fourdan
committed
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapWidth", CHANNEL1,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
setValue ("title_font", setting->data.v_string, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
/* Margins channel */
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/LeftMargin", CHANNEL2,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&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,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
setIntValueFromInt ("margin_top", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
/* Workspaces channel */
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/WorkspaceCount", CHANNEL3,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
setIntValueFromInt ("workspace_count", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
/* Keyboard theme channel */
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);
}
Olivier Fourdan
committed
/* Tweaks channel */
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ActivateAction", CHANNEL5,
&setting) == MCS_SUCCESS)
{
Olivier Fourdan
committed
setValue ("activate_action", setting->data.v_string, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BorderlessMaximize", CHANNEL5,
Olivier Fourdan
committed
&setting) == MCS_SUCCESS)
{
Olivier Fourdan
committed
setBooleanValueFromInt ("borderless_maximize", setting->data.v_int, rc);
Olivier Fourdan
committed
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleWorkspaces", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("cycle_workspaces", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/EasyClick", CHANNEL5,
&setting) == MCS_SUCCESS)
{
Olivier Fourdan
committed
setValue ("easy_click", setting->data.v_string, rc);
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/FrameOpacity", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setIntValueFromInt ("frame_opacity", setting->data.v_int, rc);
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PlacementMode", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setValue ("placement_mode", setting->data.v_string, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/InactiveOpacity", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setIntValueFromInt ("inactive_opacity", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
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/ShowDockShadow", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("show_dock_shadow", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/SnapResist", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("snap_resist", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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);
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/RestoreOnMove", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("restore_on_move", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/UnredirectOverlays", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("unredirect_overlays", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/UseCompositing", CHANNEL5,
&setting) == MCS_SUCCESS)
{
setBooleanValueFromInt ("use_compositing", setting->data.v_int, rc);
mcs_setting_free (setting);
}
Olivier Fourdan
committed
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
committed
}
}
/* Simple helper function to avoid copy/paste of code */
static void
setXfwmColor (ScreenInfo *screen_info, XfwmColor *color, Settings *rc, int id, const gchar * name, const gchar * state)
{
if (color->allocated)
{
gdk_colormap_free_colors (gdk_screen_get_rgb_colormap (screen_info->gscr), &color->col, 1);
color->allocated = FALSE;
}
if (gdk_color_parse (rc[id].value, &color->col))
{
if (gdk_colormap_alloc_color (gdk_screen_get_rgb_colormap (screen_info->gscr),
&color->col, FALSE, FALSE))
{
color->allocated = TRUE;
if (color->gc)
{
g_object_unref (G_OBJECT (color->gc));
}
color->gc = gdk_gc_new (myScreenGetGdkWindow (screen_info));
gdk_gc_copy (color->gc, getUIStyle_gc (myScreenGetGtkWidget (screen_info), name, state));
gdk_gc_set_foreground (color->gc, &color->col);
}
else
{
gdk_beep ();
g_message (_("%s: Cannot allocate color %s\n"), g_get_prgname (), rc[id].value);
}
}
else
{
gdk_beep ();
g_message (_("%s: Cannot parse color %s\n"), g_get_prgname (), rc[id].value);
}
}
static int
getTitleShadow (Settings *rc, const gchar * name)
{
const gchar *val;
val = getValue (name, rc);
if (!g_ascii_strcasecmp ("true", val) || !g_ascii_strcasecmp ("under", val))
{
return TITLE_SHADOW_UNDER;
}
else if (!g_ascii_strcasecmp ("frame", val))
}
return TITLE_SHADOW_NONE;
}
Olivier Fourdan
committed
static int
getFontHeight (const PangoFontDescription *desc, PangoContext *context)
{
PangoFontMetrics *metrics;