summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan.olivier@wanadoo.fr>2006-02-15 21:13:36 +0000
committerOlivier Fourdan <fourdan.olivier@wanadoo.fr>2006-02-15 21:13:36 +0000
commit7f7d946de5af17fdfd674451116eb402861e835e (patch)
treee302d597328b1534ee780c7dab957bda9e8bb448
parentc29d0d8e53959317137f901764805b274849a4a8 (diff)
downloadxfwm4-7f7d946de5af17fdfd674451116eb402861e835e.tar.gz
Merge a patch from Damon Harper <dl+xfce4-dev@usrbin.ca> that implements edge resistance instead of windows snapping
(Old svn revision: 19899)
-rw-r--r--AUTHORS1
-rw-r--r--defaults/defaults1
-rw-r--r--mcs-plugin/wmtweaks_plugin.c10
-rw-r--r--src/client.c65
-rw-r--r--src/settings.c13
-rw-r--r--src/settings.h1
6 files changed, 71 insertions, 20 deletions
diff --git a/AUTHORS b/AUTHORS
index 29db1d3a2..20f778024 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -9,6 +9,7 @@ Contributors :
Aquila Deus <aquila_deus@yahoo.co.uk>
Aurelien Foret <orelien@chez.com>
Benedikt Meurer <Benedikt.Meurer@unix-ag.uni-siegen.de>
+Damon Harper <dl+xfce4-dev@usrbin.ca>
Ian Morgan <imorgan@webcon.ca>
Jens Guballa <J.Guballa@t-online.de>
Juho Vaha-Herttua <juhovh@iki.fi>
diff --git a/defaults/defaults b/defaults/defaults
index e03b2eeca..f2b3c5742 100644
--- a/defaults/defaults
+++ b/defaults/defaults
@@ -31,6 +31,7 @@ shadow_delta_x=0
shadow_delta_y=0
snap_to_border=true
snap_to_windows=false
+snap_resist=true
snap_width=10
theme=Default
title_alignment=left
diff --git a/mcs-plugin/wmtweaks_plugin.c b/mcs-plugin/wmtweaks_plugin.c
index 240c04f1a..92c437630 100644
--- a/mcs-plugin/wmtweaks_plugin.c
+++ b/mcs-plugin/wmtweaks_plugin.c
@@ -66,6 +66,7 @@ static gboolean prevent_focus_stealing = FALSE;
static gboolean raise_with_any_button = FALSE;
static gboolean restore_on_move = TRUE;
static gboolean scroll_workspaces = TRUE;
+static gboolean snap_resist = TRUE;
static gboolean toggle_workspaces = TRUE;
static gboolean wrap_layout = FALSE;
static gboolean wrap_cycle = FALSE;
@@ -92,7 +93,8 @@ static int popup_opacity = 100;
"Xfwm/RaiseWithAnyButton"
"Xfwm/RestoreOnMove"
"Xfwm/ScrollWorkspaces"
- "Xfwm/ToggleWorkspaces"
+ "Xfwm/ScrollWorkspaces"
+ "Xfwm/SnapResist"
"Xfwm/WrapLayout"
"Xfwm/WrapCycle"
*/
@@ -361,6 +363,12 @@ create_dialog (McsPlugin * mcs_plugin)
gtk_box_pack_start (GTK_BOX (vbox), check_button, TRUE, FALSE, 0);
gtk_widget_show (check_button);
+ check_button =
+ create_gboolean_button (mcs_plugin, _("Use edge resistance instead of windows snapping"),
+ "Xfwm/SnapResist", &snap_resist);
+ gtk_box_pack_start (GTK_BOX (vbox), check_button, TRUE, FALSE, 0);
+ gtk_widget_show (check_button);
+
frame = xfce_framebox_new (_("Workspaces"), TRUE);
gtk_widget_show (frame);
gtk_box_pack_start (GTK_BOX (vbox1), frame, TRUE, FALSE, 0);
diff --git a/src/client.c b/src/client.c
index 9378d64e7..0d64100e1 100644
--- a/src/client.c
+++ b/src/client.c
@@ -2938,7 +2938,7 @@ clientDrawOutline (Client * c)
}
static void
-clientSnapPosition (Client * c)
+clientSnapPosition (Client * c, int prev_x, int prev_y)
{
Client *c2 = NULL;
ScreenInfo *screen_info = NULL;
@@ -2990,24 +2990,36 @@ clientSnapPosition (Client * c)
{
if (abs (disp_x - frame_x) < abs (disp_max_x - frame_x2))
{
- best_delta_x = abs (disp_x - frame_x);
- best_frame_x = disp_x;
+ if (!screen_info->params->snap_resist || ((frame_x <= disp_x) && (c->x < prev_x)))
+ {
+ best_delta_x = abs (disp_x - frame_x);
+ best_frame_x = disp_x;
+ }
}
else
{
- best_delta_x = abs (disp_max_x - frame_x2);
- best_frame_x = disp_max_x - frame_width;
+ if (!screen_info->params->snap_resist || ((frame_x2 >= disp_max_x) && (c->x > prev_x)))
+ {
+ best_delta_x = abs (disp_max_x - frame_x2);
+ best_frame_x = disp_max_x - frame_width;
+ }
}
if (abs (disp_y - frame_y) < abs (disp_max_y - frame_y2))
{
- best_delta_y = abs (disp_y - frame_y);
- best_frame_y = disp_y;
+ if (!screen_info->params->snap_resist || ((frame_y <= disp_y) && (c->y < prev_y)))
+ {
+ best_delta_y = abs (disp_y - frame_y);
+ best_frame_y = disp_y;
+ }
}
else
{
- best_delta_y = abs (disp_max_y - frame_y2);
- best_frame_y = disp_max_y - frame_height;
+ if (!screen_info->params->snap_resist || ((frame_y2 >= disp_max_y) && (c->y > prev_y)))
+ {
+ best_delta_y = abs (disp_max_y - frame_y2);
+ best_frame_y = disp_max_y - frame_height;
+ }
}
}
@@ -3029,15 +3041,21 @@ clientSnapPosition (Client * c)
delta = abs (c_frame_x2 - frame_x);
if (delta < best_delta_x)
{
- best_delta_x = delta;
- best_frame_x = c_frame_x2;
+ if (!screen_info->params->snap_resist || ((frame_x <= c_frame_x2) && (c->x < prev_x)))
+ {
+ best_delta_x = delta;
+ best_frame_x = c_frame_x2;
+ }
}
delta = abs (c_frame_x1 - frame_x2);
if (delta < best_delta_x)
{
- best_delta_x = delta;
- best_frame_x = c_frame_x1 - frame_width;
+ if (!screen_info->params->snap_resist || ((frame_x2 >= c_frame_x1) && (c->x > prev_x)))
+ {
+ best_delta_x = delta;
+ best_frame_x = c_frame_x1 - frame_width;
+ }
}
}
@@ -3046,15 +3064,21 @@ clientSnapPosition (Client * c)
delta = abs (c_frame_y2 - frame_y);
if (delta < best_delta_y)
{
- best_delta_y = delta;
- best_frame_y = c_frame_y2;
+ if (!screen_info->params->snap_resist || ((frame_y <= c_frame_y2) && (c->y < prev_y)))
+ {
+ best_delta_y = delta;
+ best_frame_y = c_frame_y2;
+ }
}
delta = abs (c_frame_y1 - frame_y2);
if (delta < best_delta_y)
{
- best_delta_y = delta;
- best_frame_y = c_frame_y1 - frame_height;
+ if (!screen_info->params->snap_resist || ((frame_y2 >= c_frame_y1) && (c->y > prev_y)))
+ {
+ best_delta_y = delta;
+ best_frame_y = c_frame_y1 - frame_height;
+ }
}
}
}
@@ -3085,10 +3109,13 @@ clientMove_event_filter (XEvent * xevent, gpointer data)
gboolean moving = TRUE;
gboolean warp_pointer = FALSE;
XWindowChanges wc;
+ int prev_x, prev_y;
TRACE ("entering clientMove_event_filter");
c = passdata->c;
+ prev_x=c->x;
+ prev_y=c->y;
screen_info = c->screen_info;
display_info = screen_info->display_info;
@@ -3126,7 +3153,7 @@ clientMove_event_filter (XEvent * xevent, gpointer data)
c->y = c->y + 16;
}
clientConstrainPos (c, FALSE);
- clientSnapPosition (c);
+ clientSnapPosition (c, prev_x, prev_y);
#ifdef SHOW_POSITION
if (passdata->poswin)
@@ -3347,7 +3374,7 @@ clientMove_event_filter (XEvent * xevent, gpointer data)
{
clientConstrainPos(c, FALSE);
}
- clientSnapPosition (c);
+ clientSnapPosition (c, prev_x, prev_y);
#ifdef SHOW_POSITION
if (passdata->poswin)
diff --git a/src/settings.c b/src/settings.c
index c72ac5ca4..ac88af13f 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -389,6 +389,10 @@ notify_cb (const char *name, const char *channel_name, McsAction action, McsSett
screen_info->params->show_popup_shadow = setting->data.v_int;
reloadScreenSettings (screen_info, UPDATE_FRAME);
}
+ else if (!strcmp (name, "Xfwm/SnapResist"))
+ {
+ screen_info->params->snap_resist = setting->data.v_int;
+ }
else if (!strcmp (name, "Xfwm/PreventFocusStealing"))
{
screen_info->params->prevent_focus_stealing = setting->data.v_int;
@@ -734,6 +738,12 @@ loadMcsData (ScreenInfo *screen_info, Settings *rc)
setBooleanValueFromInt ("show_popup_shadow", setting->data.v_int, rc);
mcs_setting_free (setting);
}
+ 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);
+ }
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PreventFocusStealing", CHANNEL5,
&setting) == MCS_SUCCESS)
{
@@ -1206,6 +1216,7 @@ loadSettings (ScreenInfo *screen_info)
{"raise_with_any_button", NULL, TRUE},
{"snap_to_border", NULL, TRUE},
{"snap_to_windows", NULL, TRUE},
+ {"snap_resist", NULL, TRUE},
{"snap_width", NULL, TRUE},
{"shadow_delta_x", NULL, TRUE},
{"shadow_delta_y", NULL, TRUE},
@@ -1351,6 +1362,8 @@ loadSettings (ScreenInfo *screen_info)
!g_ascii_strcasecmp ("true", getValue ("snap_to_border", rc));
screen_info->params->snap_to_windows =
!g_ascii_strcasecmp ("true", getValue ("snap_to_windows", rc));
+ screen_info->params->snap_resist =
+ !g_ascii_strcasecmp ("true", getValue ("snap_resist", rc));
screen_info->params->snap_width = abs (TOINT (getValue ("snap_width", rc)));
set_settings_margin (screen_info, LEFT, TOINT (getValue ("margin_left", rc)));
diff --git a/src/settings.h b/src/settings.h
index 2722984b3..05d15b2a0 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -181,6 +181,7 @@ struct _XfwmParams
gboolean show_popup_shadow;
gboolean snap_to_border;
gboolean snap_to_windows;
+ gboolean snap_resist;
gboolean title_vertical_offset_active;
gboolean title_vertical_offset_inactive;
gboolean toggle_workspaces;