summaryrefslogtreecommitdiff
path: root/src/manage.c
diff options
context:
space:
mode:
authorsabetts <sabetts>2006-01-05 04:36:07 +0000
committersabetts <sabetts>2006-01-05 04:36:07 +0000
commita83f0a57448524b489e94e06e945e1a551543d94 (patch)
treec8d9ca53c112579aac06720db704ac55f0a94f0b /src/manage.c
parent1d3b753b428842fc9c0bdc6d9ccc9e2289239ffa (diff)
downloadratpoison-a83f0a57448524b489e94e06e945e1a551543d94.zip
* src/conf.h (ASPECT_WINDOWS_ARE_TRANSIENTS): new define
* src/manage.c (window_is_transient): new function (maximize_normal): honour aspect ratio hint * src/window.c (update_window_gravity): use maxsize_gravity for windows with aspect hints. (set_active_window_body): call window_is_transient * src/split.c (cleanup_frame): call window_is_transient
Diffstat (limited to 'src/manage.c')
-rw-r--r--src/manage.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/manage.c b/src/manage.c
index 36bb973..364c6c9 100644
--- a/src/manage.c
+++ b/src/manage.c
@@ -375,6 +375,23 @@ send_configure (Window w, int x, int y, int width, int height, int border)
XSendEvent (dpy, w, False, StructureNotifyMask, (XEvent*)&ce);
}
+/* This function is used to determine if the window should be treated
+ as a transient. */
+int
+window_is_transient (rp_window *win)
+{
+ return win->transient
+#ifdef ASPECT_WINDOWS_ARE_TRANSIENTS
+ || win->hints->flags & PAspect
+#endif
+#ifdef MAXSIZE_WINDOWS_ARE_TRANSIENTS
+|| (win->hints->flags & PMaxSize
+ && (win->hints->max_width < win->scr->width
+ || win->hints->max_height < win->scr->height))
+#endif
+ ;
+}
+
void
update_window_information (rp_window *win)
{
@@ -395,7 +412,7 @@ update_window_information (rp_window *win)
win->border = attr.border_width;
/* Transient status */
- win->transient = XGetTransientForHint (dpy, win->w, &win->transient_for);
+ win->transient = XGetTransientForHint (dpy, win->w, &win->transient_for);
update_window_gravity (win);
}
@@ -680,6 +697,25 @@ maximize_normal (rp_window *win)
maxy = frame->height - win->border * 2;
}
+ /* Honour the window's aspect ratio. */
+ PRINT_DEBUG (("aspect: %ld\n", win->hints->flags & PAspect));
+ if (win->hints->flags & PAspect)
+ {
+ float ratio = (float)maxx / maxy;
+ float min_ratio = (float)win->hints->min_aspect.x / win->hints->min_aspect.y;
+ float max_ratio = (float)win->hints->max_aspect.x / win->hints->max_aspect.y;
+ PRINT_DEBUG (("ratio=%f min_ratio=%f max_ratio=%f\n",
+ ratio,min_ratio,max_ratio));
+ if (ratio < min_ratio)
+ {
+ maxy = (int) (maxx / min_ratio);
+ }
+ else if (ratio > max_ratio)
+ {
+ maxx = (int) (maxy * max_ratio);
+ }
+ }
+
/* Fit the window inside its frame (if it has one) */
if (frame)
{