summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--defaults/defaults1
-rw-r--r--mcs-plugin/wmtweaks_plugin.c17
-rw-r--r--src/placement.c19
-rw-r--r--src/settings.c30
-rw-r--r--src/settings.h7
5 files changed, 73 insertions, 1 deletions
diff --git a/defaults/defaults b/defaults/defaults
index bb46a344a..33f4b0acd 100644
--- a/defaults/defaults
+++ b/defaults/defaults
@@ -22,6 +22,7 @@ keytheme=Default
maximized_offset=0
move_opacity=100
placement_ratio=20
+placement_mode=center
popup_opacity=100
prevent_focus_stealing=false
raise_delay=250
diff --git a/mcs-plugin/wmtweaks_plugin.c b/mcs-plugin/wmtweaks_plugin.c
index 3cce70b2d..8cfa160ec 100644
--- a/mcs-plugin/wmtweaks_plugin.c
+++ b/mcs-plugin/wmtweaks_plugin.c
@@ -90,6 +90,9 @@ static int frame_opacity = 100;
static char *easy_click = "Alt";
static char *activate_action = "bring";
+static char *placement_mode = "center";
+
+
/*
"Xfwm/ActivateAction"
"Xfwm/BorderlessMaximize"
@@ -102,6 +105,7 @@ static char *activate_action = "bring";
"Xfwm/InactiveOpacity"
"Xfwm/MoveOpacity"
"Xfwm/PlacementRatio"
+ "Xfwm/Placementmode"
"Xfwm/PopupOpacity"
"Xfwm/PreventFocusStealing"
"Xfwm/RaiseWithAnyButton"
@@ -468,6 +472,12 @@ create_dialog (McsPlugin * mcs_plugin)
{NULL, NULL}
};
+ static const ValuePair placement_list[] = {
+ {N_("Place window under the mouse"), "mouse"},
+ {N_("Place window in the center"), "center"},
+ {NULL, NULL}
+ };
+
dialog = g_new (Itf, 1);
dialog->mcs_plugin = mcs_plugin;
@@ -637,6 +647,12 @@ create_dialog (McsPlugin * mcs_plugin)
gtk_box_pack_start (GTK_BOX (vbox), range, FALSE, TRUE, 0);
gtk_widget_show (range);
+ radio_buttons =
+ create_string_radio_button (mcs_plugin, placement_list, _("Default positionning of windows without smart placement:"),
+ "Xfwm/PlacementMode", &placement_mode);
+ gtk_box_pack_start (GTK_BOX (vbox), radio_buttons, FALSE, TRUE, 0);
+ gtk_widget_show (radio_buttons);
+
label = gtk_label_new (_("Placement"));
gtk_widget_show (label);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook),
@@ -873,6 +889,7 @@ xfwm4_create_channel (McsPlugin * mcs_plugin)
init_int_setting (mcs_plugin, "Xfwm/PopupOpacity", &popup_opacity);
init_string_setting (mcs_plugin, "Xfwm/ActivateAction", &activate_action);
+ init_string_setting (mcs_plugin, "Xfwm/PlacementMode", &placement_mode);
init_string_setting (mcs_plugin, "Xfwm/EasyClick", &easy_click);
}
diff --git a/src/placement.c b/src/placement.c
index ff48277da..638f4411f 100644
--- a/src/placement.c
+++ b/src/placement.c
@@ -617,6 +617,16 @@ centerPlacement (Client * c, int full_x, int full_y, int full_w, int full_h)
c->y = MAX (full_y + frameTop(c) + (full_h - frameHeight(c)) / 2, full_y + frameTop(c));
}
+static void
+mousePlacement (Client * c, int full_x, int full_y, int full_w, int full_h, int mx, int my)
+{
+ g_return_if_fail (c != NULL);
+ TRACE ("entering centerPlacement");
+
+ c->x = CLAMP (mx + frameLeft(c) - frameWidth(c) / 2, full_x + frameLeft(c), full_w - frameWidth(c) + frameLeft(c));
+ c->y = CLAMP (my + frameTop(c) - frameHeight(c) / 2, full_y + frameTop(c), full_h - frameHeight(c) + frameTop(c));
+}
+
void
clientInitPosition (Client * c)
{
@@ -693,7 +703,14 @@ clientInitPosition (Client * c)
((frameWidth(c) >= full_w) && (frameHeight(c) >= full_h)) ||
(100 * frameWidth(c) * frameHeight(c)) < (screen_info->params->placement_ratio * full_w * full_h))
{
- centerPlacement (c, full_x, full_y, full_w, full_h);
+ if (screen_info->params->placement_mode == PLACE_MOUSE)
+ {
+ mousePlacement (c, full_x, full_y, full_w, full_h, msx, msy);
+ }
+ else
+ {
+ centerPlacement (c, full_x, full_y, full_w, full_h);
+ }
}
else
{
diff --git a/src/settings.c b/src/settings.c
index 3eb89f707..8dce640c7 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -177,6 +177,22 @@ set_activate_action (ScreenInfo *screen_info, const char *value)
}
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;
+ }
+}
+
+static void
notify_cb (const char *name, const char *channel_name, McsAction action, McsSetting * setting, void *data)
{
ScreenInfo *screen_info;
@@ -502,6 +518,10 @@ notify_cb (const char *name, const char *channel_name, McsAction action, McsSett
{
set_activate_action (screen_info, setting->data.v_string);
}
+ else if (!strcmp (name, "Xfwm/PlacementMode"))
+ {
+ set_placement_mode (screen_info, setting->data.v_string);
+ }
}
break;
case MCS_ACTION_DELETED:
@@ -810,6 +830,12 @@ loadMcsData (ScreenInfo *screen_info, Settings *rc)
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);
+ }
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/PlacementRatio", CHANNEL5,
&setting) == MCS_SUCCESS)
{
@@ -1370,6 +1396,7 @@ loadSettings (ScreenInfo *screen_info)
{"maximized_offset", NULL, TRUE},
{"move_opacity", NULL, TRUE},
{"placement_ratio", NULL, TRUE},
+ {"placement_mode", NULL, TRUE},
{"popup_opacity", NULL, TRUE},
{"prevent_focus_stealing", NULL, TRUE},
{"raise_delay", NULL, TRUE},
@@ -1552,6 +1579,9 @@ loadSettings (ScreenInfo *screen_info)
set_easy_click (screen_info, getValue ("easy_click", rc));
+ value = getValue ("placement_mode", rc);
+ set_placement_mode (screen_info, value);
+
value = getValue ("activate_action", rc);
set_activate_action (screen_info, value);
diff --git a/src/settings.h b/src/settings.h
index 1a2479885..ec0875582 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -160,6 +160,12 @@ enum
DBL_CLICK_ACTION_HIDE
};
+enum
+{
+ PLACE_MOUSE,
+ PLACE_CENTER
+};
+
struct _XfwmColor
{
GdkColor col;
@@ -189,6 +195,7 @@ struct _XfwmParams
int maximized_offset;
int move_opacity;
int placement_ratio;
+ int placement_mode;
int popup_opacity;
int raise_delay;
int focus_delay;