make a GravityPoint and GravityCoord data structures for those --x, ++y type values

This commit is contained in:
Dana Jansens 2008-01-11 20:58:03 -05:00
parent 17bc51aab8
commit c2e495c720
5 changed files with 83 additions and 119 deletions

View file

@ -64,12 +64,7 @@ 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;
GravityPoint config_resize_popup_fixed;
ObStackingLayer config_dock_layer;
gboolean config_dock_floating;
@ -143,16 +138,28 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src,
if (src->pos_given) {
dst->pos_given = TRUE;
dst->center_x = src->center_x;
dst->center_y = src->center_y;
dst->opposite_x = src->opposite_x;
dst->opposite_y = src->opposite_y;
dst->position.x = src->position.x;
dst->position.y = src->position.y;
dst->position = src->position;
dst->monitor = src->monitor;
}
}
static void config_parse_gravity_coord(xmlDocPtr doc, xmlNodePtr node,
GravityCoord *c)
{
gchar *s = parse_string(doc, node);
if (!g_ascii_strcasecmp(s, "center"))
c->center = TRUE;
else {
if (s[0] == '-')
c->opposite = TRUE;
if (s[0] == '-' || s[0] == '+')
c->pos = atoi(s+1);
else
c->pos = atoi(s);
}
g_free(s);
}
/*
<applications>
<application name="aterm">
@ -218,38 +225,16 @@ static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc,
if ((n = parse_find_node("position", app->children))) {
if ((c = parse_find_node("x", n->children)))
if (!parse_contains("default", doc, c)) {
gchar *s = parse_string(doc, c);
if (!g_ascii_strcasecmp(s, "center")) {
settings->center_x = TRUE;
x_pos_given = TRUE;
} else {
if (s[0] == '-')
settings->opposite_x = TRUE;
if (s[0] == '-' || s[0] == '+')
settings->position.x = atoi(s+1);
else
settings->position.x = atoi(s);
x_pos_given = TRUE;
}
g_free(s);
config_parse_gravity_coord(doc, c,
&settings->position.x);
settings->pos_given = TRUE;
}
if (x_pos_given && (c = parse_find_node("y", n->children)))
if (!parse_contains("default", doc, c)) {
gchar *s = parse_string(doc, c);
if (!g_ascii_strcasecmp(s, "center")) {
settings->center_y = TRUE;
settings->pos_given = TRUE;
} else {
if (s[0] == '-')
settings->opposite_y = TRUE;
if (s[0] == '-' || s[0] == '+')
settings->position.y = atoi(s+1);
else
settings->position.y = atoi(s);
settings->pos_given = TRUE;
}
g_free(s);
config_parse_gravity_coord(doc, c,
&settings->position.y);
settings->pos_given = TRUE;
}
if (settings->pos_given &&
@ -677,34 +662,12 @@ static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
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);
if ((n2 = parse_find_node("x", n->children)))
config_parse_gravity_coord(doc, n2,
&config_resize_popup_fixed.x);
if ((n2 = parse_find_node("y", n->children)))
config_parse_gravity_coord(doc, n2,
&config_resize_popup_fixed.y);
}
}
}
@ -956,12 +919,8 @@ void config_startup(ObParseInst *i)
config_resize_four_corners = FALSE;
config_resize_popup_show = 1; /* nonpixel increments */
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;
GRAVITY_COORD_SET(config_resize_popup_fixed.x, 0, FALSE, FALSE);
GRAVITY_COORD_SET(config_resize_popup_fixed.y, 0, FALSE, FALSE);
parse_register(i, "resize", parse_resize, NULL);

View file

@ -39,11 +39,7 @@ struct _ObAppSettings
GPatternSpec *name;
GPatternSpec *role;
Point position;
gboolean center_x;
gboolean center_y;
gboolean opposite_x;
gboolean opposite_y;
GravityPoint position;
gboolean pos_given;
guint desktop;
@ -95,22 +91,8 @@ extern gboolean config_resize_redraw;
extern gint config_resize_popup_show;
/*! 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;
/*! where to place the popup if it's in a fixed position */
extern GravityPoint config_resize_popup_fixed;
/*! The stacking layer the dock will reside in */
extern ObStackingLayer config_dock_layer;

View file

@ -20,6 +20,23 @@
#ifndef __geom_h
#define __geom_h
#include <glib.h>
typedef struct _GravityCoord {
int pos;
gboolean center;
gboolean opposite;
} GravityCoord;
typedef struct _GravityPoint {
GravityCoord x;
GravityCoord y;
} GravityPoint;
#define GRAVITY_COORD_SET(c, p, cen, opp) \
(c).pos = (p), (c).center = (cen), (c).opposite = (opp)
typedef struct _Point {
int x;
int y;

View file

@ -116,36 +116,42 @@ static void popup_coords(ObClient *c, const gchar *format, gint a, gint b)
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;
x = config_resize_popup_fixed.x.pos;
if (config_resize_popup_fixed.x.center)
x = area->x + area->width/2;
else if (config_resize_popup_fixed.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;
y = config_resize_popup_fixed.y.pos;
if (config_resize_popup_fixed.y.center)
y = area->y + area->width/2;
else if (config_resize_popup_fixed.y.opposite)
y = RECT_RIGHT(*area) - y;
else
y = area->y + y;
if (config_resize_popup_x_center) {
if (config_resize_popup_y_center)
if (config_resize_popup_fixed.x.center) {
if (config_resize_popup_fixed.y.center)
gravity = CenterGravity;
else if (config_resize_popup_y_opposite)
else if (config_resize_popup_fixed.y.opposite)
gravity = SouthGravity;
else
gravity = NorthGravity;
}
else if (config_resize_popup_x_opposite) {
if (config_resize_popup_y_center)
else if (config_resize_popup_fixed.x.opposite) {
if (config_resize_popup_fixed.y.center)
gravity = EastGravity;
else if (config_resize_popup_y_opposite)
else if (config_resize_popup_fixed.y.opposite)
gravity = SouthEastGravity;
else
gravity = NorthEastGravity;
}
else {
if (config_resize_popup_y_center)
if (config_resize_popup_fixed.y.center)
gravity = WestGravity;
else if (config_resize_popup_y_opposite)
else if (config_resize_popup_fixed.y.opposite)
gravity = SouthWestGravity;
else
gravity = NorthWestGravity;

View file

@ -407,21 +407,21 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
g_free(areas);
}
if (settings->center_x)
if (settings->position.x.center)
*x = screen->x + screen->width / 2 - client->area.width / 2;
else if (settings->opposite_x)
else if (settings->position.x.opposite)
*x = screen->x + screen->width - client->frame->area.width -
settings->position.x;
settings->position.x.pos;
else
*x = screen->x + settings->position.x;
*x = screen->x + settings->position.x.pos;
if (settings->center_y)
if (settings->position.y.center)
*y = screen->y + screen->height / 2 - client->area.height / 2;
else if (settings->opposite_y)
else if (settings->position.y.opposite)
*y = screen->y + screen->height - client->frame->area.height -
settings->position.y;
settings->position.y.pos;
else
*y = screen->y + settings->position.y;
*y = screen->y + settings->position.y.pos;
g_free(screen);
return TRUE;