X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fmenuframe.c;h=6cfcd6173461603a45dbc729c9781149ea8cf1aa;hb=de1559a09497ae4ead44a6e70b556123a5bab35c;hp=0d04c7a8976e139c71d261e8e44c90ceec9e4ff7;hpb=335e8acbfc5d2824f1fd2cb67a5add8e1ed40b06;p=chaz%2Fopenbox diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 0d04c7a8..6cfcd617 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -1,6 +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) 2003 Ben Jansens This program is free software; you can redistribute it and/or modify @@ -22,6 +23,7 @@ #include "screen.h" #include "grab.h" #include "openbox.h" +#include "config.h" #include "render/theme.h" #define PADDING 2 @@ -41,6 +43,7 @@ static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry, static void menu_entry_frame_free(ObMenuEntryFrame *self); static void menu_frame_render(ObMenuFrame *self); static void menu_frame_update(ObMenuFrame *self); +static gboolean menu_entry_frame_submenu_timeout(gpointer data); static Window createWindow(Window parent, gulong mask, XSetWindowAttributes *attrib) @@ -189,12 +192,7 @@ void menu_frame_move_on_screen(ObMenuFrame *self) gint dx = 0, dy = 0; gint pos, half; - for (i = 0; i < screen_num_monitors; ++i) { - a = screen_physical_area_monitor(i); - if (RECT_INTERSECTS_RECT(*a, self->area)) - break; - } - if (!a) a = screen_physical_area_monitor(0); + a = screen_physical_area_monitor(self->monitor); half = g_list_length(self->entries) / 2; pos = g_list_index(self->entries, self->selected); @@ -608,6 +606,7 @@ gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent) } if (parent) { + self->monitor = parent->monitor; if (parent->child) menu_frame_hide(parent->child); parent->child = self; @@ -665,6 +664,11 @@ void menu_frame_hide(ObMenuFrame *self) void menu_frame_hide_all() { + 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) menu_frame_hide(it->data); @@ -719,6 +723,12 @@ ObMenuEntryFrame* menu_entry_frame_under(gint x, gint y) return ret; } +static gboolean menu_entry_frame_submenu_timeout(gpointer data) +{ + menu_entry_frame_show_submenu((ObMenuEntryFrame*)data); + return FALSE; +} + void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) { ObMenuEntryFrame *old = self->selected; @@ -728,6 +738,12 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) entry = old; if (old == entry) return; + + if (config_submenu_show_delay) { + /* remove any submenu open requests */ + ob_main_loop_timeout_remove(ob_main_loop, + menu_entry_frame_submenu_timeout); + } self->selected = entry; @@ -739,8 +755,18 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) if (self->selected) { menu_entry_frame_render(self->selected); - if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) - menu_entry_frame_show_submenu(self->selected); + if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) { + if (config_submenu_show_delay) { + /* initiate a new submenu open request */ + ob_main_loop_timeout_add(ob_main_loop, + config_submenu_show_delay * 1000, + menu_entry_frame_submenu_timeout, + self->selected, + NULL); + } else { + menu_entry_frame_show_submenu(self->selected); + } + } } }