]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
add copyright headers, adjust --version output to include copyright, and --help outpu...
[chaz/openbox] / openbox / menuframe.c
index 4e8236908ecb0e85e627f35ac44c82cbd7f9ebcc..5184f835906570ada62ed73d1cd320fbdf1c1457 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*-
+
+   menuframe.c for the Openbox window manager
+   Copyright (c) 2003        Ben Jansens
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
 #include "menuframe.h"
 #include "client.h"
 #include "menu.h"
@@ -169,6 +187,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 +196,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;
@@ -361,6 +393,8 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
         XMapWindow(ob_display, self->bullet);
     } else
         XUnmapWindow(ob_display, self->bullet);
+
+    XFlush(ob_display);
 }
 
 static void menu_frame_render(ObMenuFrame *self)
@@ -382,10 +416,10 @@ static void menu_frame_render(ObMenuFrame *self)
 
         self->a_title->texture[0].data.text.string = self->menu->title;
         RrMinsize(self->a_title, &tw, &th);
-        tw = MIN(tw, MAX_MENU_WIDTH);
-        tw += 2*PADDING;
-        th += 2*PADDING;
+        tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->padding * 2;
         w = MAX(w, tw);
+
+        th = ob_rr_theme->menu_title_height;
         h += (self->title_h = th + ob_rr_theme->bwidth);
 
         XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->bwidth);
@@ -581,9 +615,10 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
             self->menu->update_func(self, self->menu->data);
     }
 
-    menu_frame_visible = g_list_prepend(menu_frame_visible, self);
     menu_frame_update(self);
 
+    menu_frame_visible = g_list_prepend(menu_frame_visible, self);
+
     menu_frame_move_on_screen(self);
 
     XMapWindow(ob_display, self->window);
This page took 0.023 seconds and 4 git commands to generate.