all repos — openbox @ 17bc51aab8be25cd44c55eb0a652c92518bd9b0f

openbox fork - make it a bit more like ryudo

let you specify the resize popup to be in a fixed place
Dana Jansens danakj@orodu.net
commit

17bc51aab8be25cd44c55eb0a652c92518bd9b0f

parent

b7e23f286a53b7beb259afac7e1a4cdf5fca47a4

6 files changed, 141 insertions(+), 13 deletions(-)

jump to
M data/rc.xmldata/rc.xml

@@ -129,7 +129,17 @@ <drawContents>yes</drawContents>

<popupShow>Nonpixel</popupShow> <!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) --> <popupPosition>Center</popupPosition> - <!-- 'Center' or 'Top' --> + <!-- 'Center', 'Top', or 'Fixed' --> + <popupFixedPosition> + <!-- these are used if popupPosition is set to 'Fixed' --> + + <x>10</x> + <!-- positive number for distance from left edge, negative number for + distance from right edge, or 'Center' --> + <y>10</y> + <!-- positive number for distance from top edge, negative number for + distance from bottom edge, or 'Center' --> + </popupFixedPosition> </resize> <!-- You can reserve a portion of your screen where windows will not cover when
M data/rc.xsddata/rc.xsd

@@ -96,6 +96,11 @@ <xsd:complexType name="resize">

<xsd:element minOccurs="0" name="drawContents" type="ob:bool"/> <xsd:element minOccurs="0" name="popupShow" type="ob:popupshow"/> <xsd:element minOccurs="0" name="popupPosition" type="ob:popupposition"/> + <xsd:element minOccurs="0" name="popupPosition" type="ob:popupfixedposition"/> + </xsd:complexType> + <xsd:complexType name="popupfixedposition"> + <xsd:element minOccurs="0" name="x" type="ob:center_or_int"/> + <xsd:element minOccurs="0" name="y" type="ob:center_or_int"/> </xsd:complexType> <xsd:complexType name="dock"> <xsd:element minOccurs="0" name="position" type="ob:dock_position"/>
M openbox/config.copenbox/config.c

@@ -60,10 +60,16 @@ GSList *config_desktops_names;

guint config_screen_firstdesk; guint config_desktop_popup_time; -gboolean config_resize_redraw; -gboolean config_resize_four_corners; -gint config_resize_popup_show; -gint config_resize_popup_pos; +gboolean config_resize_redraw; +gboolean config_resize_four_corners; +gint config_resize_popup_show; +ObResizePopupPos config_resize_popup_pos; +gboolean config_resize_popup_x_center; +gboolean config_resize_popup_y_center; +gboolean config_resize_popup_x_opposite; +gboolean config_resize_popup_y_opposite; +gint config_resize_popup_x; +gint config_resize_popup_y; ObStackingLayer config_dock_layer; gboolean config_dock_floating;

@@ -661,11 +667,46 @@ else if (parse_contains("Nonpixel", doc, n))

config_resize_popup_show = 1; } if ((n = parse_find_node("popupPosition", node))) { - config_resize_popup_pos = parse_int(doc, n); if (parse_contains("Top", doc, n)) - config_resize_popup_pos = 1; + config_resize_popup_pos = OB_RESIZE_POS_TOP; else if (parse_contains("Center", doc, n)) - config_resize_popup_pos = 0; + config_resize_popup_pos = OB_RESIZE_POS_CENTER; + else if (parse_contains("Fixed", doc, n)) { + config_resize_popup_pos = OB_RESIZE_POS_FIXED; + + if ((n = parse_find_node("popupFixedPosition", node))) { + xmlNodePtr n2; + + if ((n2 = parse_find_node("x", n->children))) { + gchar *s = parse_string(doc, n2); + if (!g_ascii_strcasecmp(s, "center")) + config_resize_popup_x_center = TRUE; + else { + if (s[0] == '-') + config_resize_popup_x_opposite = TRUE; + if (s[0] == '-' || s[0] == '+') + config_resize_popup_x = atoi(s+1); + else + config_resize_popup_x = atoi(s); + } + } + if ((n2 = parse_find_node("y", n->children))) { + gchar *s = parse_string(doc, n2); + if (!g_ascii_strcasecmp(s, "center")) + config_resize_popup_y_center = TRUE; + else { + if (s[0] == '-') + config_resize_popup_y_opposite = TRUE; + if (s[0] == '-' || s[0] == '+') + config_resize_popup_y = atoi(s+1); + else + config_resize_popup_y = atoi(s); + } + } + g_print("X %d %d %d\n", config_resize_popup_x_center, config_resize_popup_x_opposite, config_resize_popup_x); + g_print("Y %d %d %d\n", config_resize_popup_y_center, config_resize_popup_y_opposite, config_resize_popup_y); + } + } } }

@@ -914,7 +955,13 @@

config_resize_redraw = TRUE; config_resize_four_corners = FALSE; config_resize_popup_show = 1; /* nonpixel increments */ - config_resize_popup_pos = 0; /* center of client */ + config_resize_popup_pos = OB_RESIZE_POS_CENTER; + config_resize_popup_x_center = FALSE; + config_resize_popup_x_opposite = FALSE; + config_resize_popup_x = 0; + config_resize_popup_y_center = FALSE; + config_resize_popup_y_opposite = FALSE; + config_resize_popup_y = 0; parse_register(i, "resize", parse_resize, NULL);
M openbox/config.hopenbox/config.h

@@ -24,6 +24,7 @@ #include "misc.h"

#include "stacking.h" #include "place.h" #include "geom.h" +#include "moveresize.h" #include "render/render.h" #include <glib.h>

@@ -92,8 +93,24 @@ extern gboolean config_resize_redraw;

/*! show move/resize popups? 0 = no, 1 = always, 2 = only resizing !1 increments */ extern gint config_resize_popup_show; -/*! where to show the popup, currently above the window or centered */ -extern gint config_resize_popup_pos; +/*! where to show the resize popup */ +extern ObResizePopupPos config_resize_popup_pos; +/*! if the resize popup should be centered horizontally if it is being + placed in a fixed position */ +extern gboolean config_resize_popup_x_center; +/*! if the resize popup should be centered vertically if it is being + placed in a fixed position */ +extern gboolean config_resize_popup_y_center; +/*! if the resize popup should be placed from the right side of the screen when + placed in a fixed position */ +extern gboolean config_resize_popup_x_opposite; +/*! if the resize popup should be placed from the bottom side of the screen + when placed in a fixed position */ +extern gboolean config_resize_popup_y_opposite; +/*! where the resize popup should be if it is placed in a fixed position */ +extern gint config_resize_popup_x; +/*! where the resize popup should be if it is placed in a fixed position */ +extern gint config_resize_popup_y; /*! The stacking layer the dock will reside in */ extern ObStackingLayer config_dock_layer;
M openbox/moveresize.copenbox/moveresize.c

@@ -101,17 +101,60 @@ {

gchar *text; text = g_strdup_printf(format, a, b); - if (config_resize_popup_pos == 1) /* == "Top" */ + if (config_resize_popup_pos == OB_RESIZE_POS_TOP) popup_position(popup, SouthGravity, c->frame->area.x + c->frame->area.width/2, c->frame->area.y - ob_rr_theme->fbwidth); - else /* == "Center" */ + else if (config_resize_popup_pos == OB_RESIZE_POS_CENTER) popup_position(popup, CenterGravity, c->frame->area.x + c->frame->size.left + c->area.width / 2, c->frame->area.y + c->frame->size.top + c->area.height / 2); + else /* Fixed */ { + Rect *area = screen_physical_area_active(); + gint gravity, x, y; + + x = config_resize_popup_x; + if (config_resize_popup_x_center) x = area->x + area->width/2; + else if (config_resize_popup_x_opposite) x = RECT_RIGHT(*area) - x; + else x = area->x + x; + + y = config_resize_popup_y; + if (config_resize_popup_y_center) y = area->y + area->height/2; + else if (config_resize_popup_y_opposite) y = RECT_BOTTOM(*area) - y; + else y = area->y + y; + + if (config_resize_popup_x_center) { + if (config_resize_popup_y_center) + gravity = CenterGravity; + else if (config_resize_popup_y_opposite) + gravity = SouthGravity; + else + gravity = NorthGravity; + } + else if (config_resize_popup_x_opposite) { + if (config_resize_popup_y_center) + gravity = EastGravity; + else if (config_resize_popup_y_opposite) + gravity = SouthEastGravity; + else + gravity = NorthEastGravity; + } + else { + if (config_resize_popup_y_center) + gravity = WestGravity; + else if (config_resize_popup_y_opposite) + gravity = SouthWestGravity; + else + gravity = NorthWestGravity; + } + + popup_position(popup, gravity, x, y); + + g_free(area); + } popup_show(popup, text); g_free(text); }
M openbox/moveresize.hopenbox/moveresize.h

@@ -27,6 +27,12 @@ #endif

struct _ObClient; +typedef enum { + OB_RESIZE_POS_CENTER, + OB_RESIZE_POS_TOP, + OB_RESIZE_POS_FIXED +} ObResizePopupPos; + extern gboolean moveresize_in_progress; extern struct _ObClient *moveresize_client; #ifdef SYNC