X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenuframe.c;h=108864679e88319a7a949dcadab8d767809f9a7a;hb=baa4a878cda78cf7ef9a894b8937c72fa50c897a;hp=6cfcd6173461603a45dbc729c9781149ea8cf1aa;hpb=310d268bf0b3fbc065e754b9dc25862a60efcaae;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 6cfcd617..10886467 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- menuframe.c for the Openbox window manager - Copyright (c) 2004 Mikael Magnusson + Copyright (c) 2006 Mikael Magnusson Copyright (c) 2003 Ben Jansens This program is free software; you can redistribute it and/or modify @@ -23,6 +23,7 @@ #include "screen.h" #include "grab.h" #include "openbox.h" +#include "mainloop.h" #include "config.h" #include "render/theme.h" @@ -67,7 +68,7 @@ ObMenuFrame* menu_frame_new(ObMenu *menu, ObClient *client) attr.event_mask = FRAME_EVENTMASK; self->window = createWindow(RootWindow(ob_display, ob_screen), - CWEventMask, &attr); + CWEventMask, &attr); attr.event_mask = TITLE_EVENTMASK; self->title = createWindow(self->window, CWEventMask, &attr); self->items = createWindow(self->window, 0, NULL); @@ -188,7 +189,6 @@ void menu_frame_move(ObMenuFrame *self, gint x, gint y) void menu_frame_move_on_screen(ObMenuFrame *self) { Rect *a = NULL; - guint i; gint dx = 0, dy = 0; gint pos, half; @@ -250,6 +250,8 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self) case OB_MENU_ENTRY_TYPE_SEPARATOR: th = SEPARATOR_HEIGHT + 2*PADDING; break; + default: + g_assert_not_reached(); } RECT_SET_SIZE(self->area, self->frame->inner_w, th); XResizeWindow(ob_display, self->window, @@ -410,25 +412,25 @@ static void menu_frame_render(ObMenuFrame *self) gboolean has_icon = FALSE; ObMenu *sub; - XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->bwidth); + XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth); XSetWindowBorder(ob_display, self->window, - RrColorPixel(ob_rr_theme->b_color)); + RrColorPixel(ob_rr_theme->menu_b_color)); if (!self->parent && self->show_title) { XMoveWindow(ob_display, self->title, - -ob_rr_theme->bwidth, h - ob_rr_theme->bwidth); + -ob_rr_theme->mbwidth, h - ob_rr_theme->mbwidth); self->a_title->texture[0].data.text.string = self->menu->title; RrMinsize(self->a_title, &tw, &th); - tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->padding * 2; + tw = MIN(tw, MAX_MENU_WIDTH) + ob_rr_theme->paddingx * 2; w = MAX(w, tw); th = ob_rr_theme->menu_title_height; - h += (self->title_h = th + ob_rr_theme->bwidth); + h += (self->title_h = th + ob_rr_theme->mbwidth); - XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->bwidth); + XSetWindowBorderWidth(ob_display, self->title, ob_rr_theme->mbwidth); XSetWindowBorder(ob_display, self->title, - RrColorPixel(ob_rr_theme->b_color)); + RrColorPixel(ob_rr_theme->menu_b_color)); } XMoveWindow(ob_display, self->items, 0, h); @@ -536,9 +538,9 @@ static void menu_frame_render(ObMenuFrame *self) if (!self->parent && self->show_title) { XResizeWindow(ob_display, self->title, - w, self->title_h - ob_rr_theme->bwidth); + w, self->title_h - ob_rr_theme->mbwidth); RrPaint(self->a_title, self->title, - w, self->title_h - ob_rr_theme->bwidth); + w, self->title_h - ob_rr_theme->mbwidth); XMapWindow(ob_display, self->title); } else XUnmapWindow(ob_display, self->title); @@ -548,8 +550,8 @@ static void menu_frame_render(ObMenuFrame *self) for (it = self->entries; it; it = g_list_next(it)) menu_entry_frame_render(it->data); - w += ob_rr_theme->bwidth * 2; - h += ob_rr_theme->bwidth * 2; + w += ob_rr_theme->mbwidth * 2; + h += ob_rr_theme->mbwidth * 2; RECT_SET_SIZE(self->area, w, h); @@ -627,6 +629,16 @@ gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent) menu_frame_update(self); menu_frame_visible = g_list_prepend(menu_frame_visible, self); + + if (config_menu_middle) { + if (self->parent) + menu_frame_move(self, self->area.x, self->area.y + - self->area.height/2 + + self->item_h/2); + else if (self->show_title) + menu_frame_move(self, self->area.x - self->area.width/2, + self->area.y - self->title_h*3/4); + } menu_frame_move_on_screen(self); @@ -664,13 +676,14 @@ void menu_frame_hide(ObMenuFrame *self) void menu_frame_hide_all() { + GList *it; + if (config_submenu_show_delay) { /* remove any submenu open requests */ ob_main_loop_timeout_remove(ob_main_loop, menu_entry_frame_submenu_timeout); } - GList *it = g_list_last(menu_frame_visible); - if (it) + if ((it = g_list_last(menu_frame_visible))) menu_frame_hide(it->data); } @@ -708,8 +721,8 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y) GList *it; if ((frame = menu_frame_under(x, y))) { - x -= ob_rr_theme->bwidth + frame->area.x; - y -= frame->title_h + ob_rr_theme->bwidth + frame->area.y; + x -= ob_rr_theme->mbwidth + frame->area.x; + y -= frame->title_h + ob_rr_theme->mbwidth + frame->area.y; for (it = frame->entries; it; it = g_list_next(it)) { ObMenuEntryFrame *e = it->data; @@ -779,14 +792,18 @@ void menu_entry_frame_show_submenu(ObMenuEntryFrame *self) f = menu_frame_new(self->entry->data.submenu.submenu, self->frame->client); menu_frame_move(f, - self->frame->area.x + self->frame->area.width - - ob_rr_theme->menu_overlap - ob_rr_theme->bwidth, - self->frame->area.y + self->frame->title_h + - self->area.y + ob_rr_theme->menu_overlap); + self->frame->area.x + + self->frame->area.width + - ob_rr_theme->menu_overlap + - ob_rr_theme->mbwidth, + self->frame->area.y + + self->frame->title_h + + self->area.y + + (config_menu_middle ? 1 : ob_rr_theme->menu_overlap)); menu_frame_show(f, self->frame); } -void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state) +void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state, Time time) { if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL && self->entry->data.normal.enabled) @@ -804,9 +821,9 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state) menu_frame_hide_all(); if (func) - func(entry, state, data); + func(entry, state, data, time); else - action_run(acts, client, state); + action_run(acts, client, state, time); } }