/* * Window Maker window manager * * Copyright (c) 1997, 1998 Alfredo K. Kojima * * 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #ifndef WMMENU_H_ #define WMMENU_H_ #include "wcore.h" #define MI_DIAMOND 0 #define MI_CHECK 1 #define MI_MINIWINDOW 2 #define MI_HIDDEN 3 #define MI_SHADED 4 typedef struct WMenuEntry { int order; char *text; /* entry text */ char *rtext; /* text to show in the right part */ void (*callback)(struct WMenu *menu, struct WMenuEntry *entry); void (*free_cdata)(void *data); /* proc to be used to free clientdata */ void *clientdata; /* data to pass to callback */ int cascade; /* cascade menu index */ #ifdef USER_MENU proplist_t instances; /* allowed instances */ #endif /* USER_MENU */ struct { unsigned int enabled:1; /* entry is selectable */ unsigned int indicator:1; /* left indicator */ unsigned int indicator_on:1; unsigned int indicator_type:3; unsigned int editable:1; } flags; } WMenuEntry; typedef struct WMenu { struct WMenu *parent; struct WMenu *brother; time_t timestamp; /* for the root menu. Last time * menu was reloaded */ /* decorations */ struct WFrameWindow *frame; WCoreWindow *menu; /* the window menu */ Pixmap menu_texture_data; int frame_x, frame_y; /* position of the frame in root*/ WMenuEntry **entries; /* array of entries. This is shared * by the menu and it's "brother" */ short alloced_entries; /* number of entries allocated in * entry array */ struct WMenu **cascades; /* array of cascades */ short cascade_no; short entry_no; /* number of entries */ short selected_entry; short entry_height; /* height of each entry */ WMHandlerID timer; /* timer for the autoscroll */ void *jump_back; /* jump back data */ /* to be called when some entry is edited */ void (*on_edit)(struct WMenu *menu, struct WMenuEntry *entry); /* to be called when destroyed */ void (*on_destroy)(struct WMenu *menu); struct { unsigned int titled:1; unsigned int realized:1; /* whether the window was configured */ unsigned int app_menu:1; /* this is a application or root menu */ unsigned int mapped:1; /* if menu is already mapped on screen*/ unsigned int buttoned:1; /* if the close button is visible * (menu was torn off) */ unsigned int open_to_left:1; /* direction to open submenus */ unsigned int lowered:1; unsigned int brother:1; /* if this is a copy of the menu*/ unsigned int editing:1; unsigned int jump_back_pending:1; unsigned int inside_handler:1; } flags; } WMenu; void wMenuPaint(WMenu *menu); void wMenuDestroy(WMenu *menu, int recurse); void wMenuRealize(WMenu *menu); WMenuEntry *wMenuInsertCascade(WMenu *menu, int index, char *text, WMenu *cascade); WMenuEntry *wMenuInsertCallback(WMenu *menu, int index, char *text, void (*callback)(WMenu *menu, WMenuEntry *entry), void *clientdata); void wMenuEntrySetCascade(WMenu *menu, WMenuEntry *entry, WMenu *cascade); #define wMenuAddCallback(menu, text, callback, data) \ wMenuInsertCallback(menu, -1, text, callback, data) void wMenuRemoveItem(WMenu *menu, int index); WMenu *wMenuCreate(WScreen *screen, char *title, int main_menu); WMenu *wMenuCreateForApp(WScreen *screen, char *title, int main_menu); void wMenuMap(WMenu *menu); void wMenuMapAt(WMenu *menu, int x, int y, int keyboard); #define wMenuMapCopyAt(menu, x, y) wMenuMapAt((menu)->brother, (x), (y), False) void wMenuUnmap(WMenu *menu); void wMenuSetEnabled(WMenu *menu, int index, int enable); void wMenuMove(WMenu *menu, int x, int y, int submenus); void wMenuEntryRemoveCascade(WMenu *menu, WMenuEntry *entry); void wMenuScroll(WMenu *menu, XEvent *event); WMenu *wMenuUnderPointer(WScreen *screen); void wMenuSaveState(WScreen *scr); void wMenuRestoreState(WScreen *scr); #endif