summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-09-10 18:00:08 +0000
committerDana Jansens <danakj@orodu.net>2003-09-10 18:00:08 +0000
commit00f6dea058927ce2045676cd3bd85de3c0533a87 (patch)
tree2aaddcf803820aa4859656d58d9b871a1992a5b8 /openbox
parent32c3e07fed42e040591640dbb611d9cbb37feeed (diff)
keep menus taller than the screen from jittering. also keep the half of the menu you're in visible. more precision would be nicer but meh for now (ever) i guess.
Diffstat (limited to 'openbox')
-rw-r--r--openbox/menuframe.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index 5ece36c7..3a52be8c 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -169,6 +169,7 @@ void menu_frame_move_on_screen(ObMenuFrame *self)
Rect *a;
guint i;
gint dx = 0, dy = 0;
+ gint pos, half;
for (i = 0; i < screen_num_monitors; ++i) {
a = screen_physical_area_monitor(i);
@@ -177,10 +178,23 @@ void menu_frame_move_on_screen(ObMenuFrame *self)
}
if (!a) a = screen_physical_area_monitor(0);
- dx = MIN(0, (a->x + a->width) - (self->area.x + self->area.width));
- dy = MIN(0, (a->y + a->height) - (self->area.y + self->area.height));
- if (!dx) dx = MAX(0, a->x - self->area.x);
- if (!dy) dy = MAX(0, a->y - self->area.y);
+ half = g_list_length(self->entries) / 2;
+ pos = g_list_index(self->entries, self->selected);
+
+ /* if in the bottom half then check this shit first, will keep the bottom
+ edge of the menu visible */
+ if (pos > half) {
+ dx = MAX(dx, a->x - self->area.x);
+ dy = MAX(dy, a->y - self->area.y);
+ }
+ dx = MIN(dx, (a->x + a->width) - (self->area.x + self->area.width));
+ dy = MIN(dy, (a->y + a->height) - (self->area.y + self->area.height));
+ /* if in the top half then check this shit last, will keep the top
+ edge of the menu visible */
+ if (pos <= half) {
+ dx = MAX(dx, a->x - self->area.x);
+ dy = MAX(dy, a->y - self->area.y);
+ }
if (dx || dy) {
ObMenuFrame *f;