diff options
-rw-r--r-- | defaults/defaults | 1 | ||||
-rw-r--r-- | mcs-plugin/wmtweaks_plugin.c | 17 | ||||
-rw-r--r-- | src/placement.c | 19 | ||||
-rw-r--r-- | src/settings.c | 30 | ||||
-rw-r--r-- | src/settings.h | 7 |
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; |