1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-23 06:38:05 +01:00

"finished" new menu editor

This commit is contained in:
kojima
2000-07-16 04:05:49 +00:00
parent ca837d793f
commit 1a7c397d57
2 changed files with 481 additions and 140 deletions

View File

@@ -61,11 +61,12 @@ typedef struct _Panel {
WMColor *gray;
WMColor *black;
WMPixmap *markerPix;
WMPixmap *markerPix[LastInfo];
WMPopUpButton *typeP;
WEditMenu *itemPad;
WMWidget *itemPad[3];
int currentPad;
WEditMenu *menu;
char *menuPath;
@@ -100,9 +101,13 @@ typedef struct _Panel {
WMFrame *paramF;
WMTextField *paramT;
WMButton *quickB;
Bool dontAsk; /* whether to comfirm submenu remove */
Bool dontSave;
Bool capturing;
/* about the currently selected item */
WEditMenuItem *currentItem;
InfoType currentType;
@@ -210,7 +215,7 @@ dataChanged(void *self, WMNotification *notif)
static void
stripClicked(WMWidget *w, void *data)
buttonClicked(WMWidget *w, void *data)
{
_Panel *panel = (_Panel*)data;
WEditMenuItem *item = panel->currentItem;
@@ -223,15 +228,178 @@ static void
icommandLClicked(WMWidget *w, void *data)
{
_Panel *panel = (_Panel*)data;
int cmd;
switch (WMGetListSelectedItemRow(w)) {
case 6:
WMMapWidget(panel->paramF);
break;
default:
WMUnmapWidget(panel->paramF);
break;
cmd = WMGetListSelectedItemRow(w);
if (cmd == 3 || cmd == 4) {
WMMapWidget(panel->quickB);
} else {
WMUnmapWidget(panel->quickB);
}
if (cmd == 6) {
WMMapWidget(panel->paramF);
} else {
WMUnmapWidget(panel->paramF);
}
}
static char*
captureShortcut(Display *dpy, _Panel *panel)
{
XEvent ev;
KeySym ksym;
char buffer[64];
char *key = NULL;
while (panel->capturing) {
XAllowEvents(dpy, AsyncKeyboard, CurrentTime);
WMNextEvent(dpy, &ev);
if (ev.type==KeyPress && ev.xkey.keycode!=0) {
ksym = XKeycodeToKeysym(dpy, ev.xkey.keycode, 0);
if (!IsModifierKey(ksym)) {
key=XKeysymToString(ksym);
panel->capturing = 0;
break;
}
}
WMHandleEvent(&ev);
}
if (!key)
return NULL;
buffer[0] = 0;
if (ev.xkey.state & ControlMask) {
strcat(buffer, "Control+");
}
if (ev.xkey.state & ShiftMask) {
strcat(buffer, "Shift+");
}
if (ev.xkey.state & Mod1Mask) {
strcat(buffer, "Mod1+");
}
if (ev.xkey.state & Mod2Mask) {
strcat(buffer, "Mod2+");
}
if (ev.xkey.state & Mod3Mask) {
strcat(buffer, "Mod3+");
}
if (ev.xkey.state & Mod4Mask) {
strcat(buffer, "Mod4+");
}
if (ev.xkey.state & Mod5Mask) {
strcat(buffer, "Mod5+");
}
strcat(buffer, key);
return wstrdup(buffer);
}
static void
sgrabClicked(WMWidget *w, void *data)
{
_Panel *panel = (_Panel*)data;
Display *dpy = WMScreenDisplay(WMWidgetScreen(panel->win));
char *shortcut;
if (w == panel->sclearB) {
WMSetTextFieldText(panel->shortT, "");
updateMenuItem(panel, panel->currentItem, panel->shortT);
return;
}
if (!panel->capturing) {
panel->capturing = 1;
WMSetButtonText(w, _("Cancel"));
XGrabKeyboard(dpy, WMWidgetXID(panel->win), True, GrabModeAsync,
GrabModeAsync, CurrentTime);
shortcut = captureShortcut(dpy, panel);
if (shortcut) {
WMSetTextFieldText(panel->shortT, shortcut);
updateMenuItem(panel, panel->currentItem, panel->shortT);
free(shortcut);
}
}
panel->capturing = 0;
WMSetButtonText(w, _("Capture"));
XUngrabKeyboard(dpy, CurrentTime);
}
static void
changedItemPad(WMWidget *w, void *data)
{
_Panel *panel = (_Panel*)data;
int padn = WMGetPopUpButtonSelectedItem(w);
WMUnmapWidget(panel->itemPad[panel->currentPad]);
WMMapWidget(panel->itemPad[padn]);
panel->currentPad = padn;
}
static WEditMenu*
putNewSubmenu(WEditMenu *menu, char *title)
{
WEditMenu *tmp;
WEditMenuItem *item;
item = WAddMenuItemWithTitle(menu, title);
tmp = WCreateEditMenu(WMWidgetScreen(menu), title);
WSetEditMenuAcceptsDrop(tmp, True);
WSetEditMenuDelegate(tmp, &menuDelegate);
WSetEditMenuSubmenu(menu, item, tmp);
return tmp;
}
static ItemData*
putNewItem(_Panel *panel, WEditMenu *menu, int type, char *title)
{
WEditMenuItem *item;
ItemData *data;
item = WAddMenuItemWithTitle(menu, title);
data = NEW(ItemData);
data->type = type;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
WSetEditMenuItemImage(item, panel->markerPix[type]);
return data;
}
static WEditMenu*
makeFactoryMenu(WMWidget *parent, int width)
{
WEditMenu *pad;
pad = WCreateEditMenuPad(parent);
WMResizeWidget(pad, width, 10);
WSetEditMenuMinSize(pad, wmksize(width, 0));
WSetEditMenuMaxSize(pad, wmksize(width, 0));
WSetEditMenuSelectable(pad, False);
WSetEditMenuEditable(pad, False);
WSetEditMenuIsFactory(pad, True);
WSetEditMenuDelegate(pad, &menuDelegate);
return pad;
}
@@ -263,10 +431,11 @@ createPanel(_Panel *p)
Pixmap pix;
Display *dpy = WMScreenDisplay(scr);
GC gc;
WMPixmap *pixm;
panel->markerPix = WMCreatePixmap(scr, 7, 7, WMScreenDepth(scr), True);
pixm = WMCreatePixmap(scr, 7, 7, WMScreenDepth(scr), True);
pix = WMGetPixmapXID(panel->markerPix);
pix = WMGetPixmapXID(pixm);
XDrawLine(dpy, pix, WMColorGC(black), 1, 0, 6, 3);
XDrawLine(dpy, pix, WMColorGC(black), 1, 6, 6, 3);
@@ -275,7 +444,7 @@ createPanel(_Panel *p)
XDrawLine(dpy, pix, WMColorGC(black), 0, 0, 0, 6);
pix = WMGetPixmapMaskXID(panel->markerPix);
pix = WMGetPixmapMaskXID(pixm);
gc = XCreateGC(dpy, pix, 0, NULL);
@@ -289,6 +458,11 @@ createPanel(_Panel *p)
XDrawLine(dpy, pix, gc, 1, 6, 3, 3);
XDrawLine(dpy, pix, gc, 0, 0, 0, 6);
panel->markerPix[ExternalInfo] = pixm;
panel->markerPix[PipeInfo] = pixm;
panel->markerPix[DirectoryInfo] = pixm;
panel->markerPix[WSMenuInfo] = pixm;
XFreeGC(dpy, gc);
}
@@ -301,71 +475,158 @@ createPanel(_Panel *p)
WMResizeWidget(panel->typeP, 150, 20);
WMMoveWidget(panel->typeP, 10, 10);
WMAddPopUpButtonItem(panel->typeP, _("Items"));
WMAddPopUpButtonItem(panel->typeP, _("New Items"));
WMAddPopUpButtonItem(panel->typeP, _("Sample Commands"));
WMAddPopUpButtonItem(panel->typeP, _("Sample Submenus"));
WMSetPopUpButtonAction(panel->typeP, changedItemPad, panel);
WMSetPopUpButtonSelectedItem(panel->typeP, 0);
{
WEditMenu *pad;
WEditMenu *tmp;
WEditMenuItem *item;
WEditMenu *smenu;
ItemData *data;
pad = WCreateEditMenuPad(panel->frame);
WMResizeWidget(pad, 150, 180);
pad = makeFactoryMenu(panel->frame, 150);
WMMoveWidget(pad, 10, 40);
WSetEditMenuMinSize(pad, wmksize(150, 180));
WSetEditMenuMaxSize(pad, wmksize(150, 180));
WSetEditMenuSelectable(pad, False);
WSetEditMenuEditable(pad, False);
WSetEditMenuIsFactory(pad, True);
WSetEditMenuDelegate(pad, &menuDelegate);
item = WInsertMenuItemWithTitle(pad, 0, "Run Program");
data = NEW(ItemData);
data->type = ExecInfo;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
data = putNewItem(panel, pad, ExecInfo, "Run Program");
data = putNewItem(panel, pad, CommandInfo, "Internal Command");
smenu = putNewSubmenu(pad, "Submenu");
data = putNewItem(panel, pad, ExternalInfo, "External Submenu");
data = putNewItem(panel, pad, PipeInfo, "Generated Submenu");
data = putNewItem(panel, pad, DirectoryInfo, "Directory Contents");
data = putNewItem(panel, pad, WSMenuInfo, "Workspace Menu");
item = WInsertMenuItemWithTitle(pad, 1, "Internal Command");
data = NEW(ItemData);
data->type = CommandInfo;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
item = WInsertMenuItemWithTitle(pad, 2, "Submenu");
tmp = WCreateEditMenu(scr, "Submenu");
WSetEditMenuAcceptsDrop(tmp, True);
WSetEditMenuDelegate(tmp, &menuDelegate);
WSetEditMenuSubmenu(pad, item, tmp);
item = WInsertMenuItemWithTitle(pad, 3, "External Submenu");
WSetEditMenuItemImage(item, panel->markerPix);
data = NEW(ItemData);
data->type = ExternalInfo;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
item = WInsertMenuItemWithTitle(pad, 4, "Generated Submenu");
WSetEditMenuItemImage(item, panel->markerPix);
data = NEW(ItemData);
data->type = PipeInfo;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
item = WInsertMenuItemWithTitle(pad, 5, "Directory Contents");
WSetEditMenuItemImage(item, panel->markerPix);
data = NEW(ItemData);
data->type = DirectoryInfo;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
item = WInsertMenuItemWithTitle(pad, 6, "Workspace Menu");
WSetEditMenuItemImage(item, panel->markerPix);
data = NEW(ItemData);
data->type = WSMenuInfo;
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
panel->itemPad = pad;
panel->itemPad[0] = pad;
}
{
WEditMenu *pad;
ItemData *data;
WMScrollView *sview;
sview = WMCreateScrollView(panel->frame);
WMResizeWidget(sview, 150, 180);
WMMoveWidget(sview, 10, 40);
WMSetScrollViewHasVerticalScroller(sview, True);
pad = makeFactoryMenu(panel->frame, 130);
WMSetScrollViewContentView(sview, WMWidgetView(pad));
data = putNewItem(panel, pad, ExecInfo, _("XTerm"));
data->param.exec.command = "xterm -sb -sl 2000 -bg black -fg white";
data = putNewItem(panel, pad, ExecInfo, _("rxvt"));
data->param.exec.command = "rxvt";
data = putNewItem(panel, pad, ExecInfo, _("ETerm"));
data->param.exec.command = "eterm";
data = putNewItem(panel, pad, ExecInfo, _("Run..."));
data->param.exec.command = "%a(Run,Type command to run)";
data = putNewItem(panel, pad, ExecInfo, _("Netscape"));
data->param.exec.command = "netscape";
data = putNewItem(panel, pad, ExecInfo, _("gimp"));
data->param.exec.command = "gimp";
data = putNewItem(panel, pad, ExecInfo, _("epic"));
data->param.exec.command = "xterm -e epic";
data = putNewItem(panel, pad, ExecInfo, _("ee"));
data->param.exec.command = "ee";
data = putNewItem(panel, pad, ExecInfo, _("xv"));
data->param.exec.command = "xv";
data = putNewItem(panel, pad, ExecInfo, _("Acrobat Reader"));
data->param.exec.command = "acroread || /usr/local/Acrobat4/bin/acroread";
data = putNewItem(panel, pad, ExecInfo, _("ghostview"));
data->param.exec.command = "gv";
data = putNewItem(panel, pad, CommandInfo, _("Exit Window Maker"));
data->param.command.command = 3;
WMMapWidget(pad);
panel->itemPad[1] = sview;
}
{
WEditMenu *pad, *smenu;
ItemData *data;
WMScrollView *sview;
sview = WMCreateScrollView(panel->frame);
WMResizeWidget(sview, 150, 180);
WMMoveWidget(sview, 10, 40);
WMSetScrollViewHasVerticalScroller(sview, True);
pad = makeFactoryMenu(panel->frame, 130);
WMSetScrollViewContentView(sview, WMWidgetView(pad));
/* data = putNewItem(panel, pad, ExternalInfo, _("Debian Menu"));
data->param.pipe.command = "/etc/X11/WindowMaker/menu.hook";
*/
data = putNewItem(panel, pad, PipeInfo, _("RedHat Menu"));
data->param.pipe.command = "wmconfig --output wmaker";
data = putNewItem(panel, pad, PipeInfo, _("Menu Conectiva"));
data->param.pipe.command = "wmconfig --output wmaker";
data = putNewItem(panel, pad, DirectoryInfo, _("Themes"));
data->param.directory.directory = "/usr/share/WindowMaker/Themes /usr/local/share/WindowMaker/Themes $HOME/GNUstep/Library/WindowMaker/Themes";
data->param.directory.stripExt = 1;
data = putNewItem(panel, pad, DirectoryInfo, _("Bg Images (scale)"));
data->param.directory.command = "wmsetbg -u -s";
data->param.directory.directory = "/opt/kde2/share/wallpapers /usr/share/WindowMaker/Backgrounds $HOME/GNUstep/Library/WindowMaker/Backgrounds";
data->param.directory.stripExt = 1;
data = putNewItem(panel, pad, DirectoryInfo, _("Bg Images (tile)"));
data->param.directory.command = "wmsetbg -u -t";
data->param.directory.directory = "/opt/kde2/share/wallpapers /usr/share/WindowMaker/Backgrounds $HOME/GNUstep/Library/WindowMaker/Backgrounds";
data->param.directory.stripExt = 1;
smenu = putNewSubmenu(pad, _("Assorted XTerms"));
data = putNewItem(panel, smenu, ExecInfo, _("XTerm Yellow on Blue"));
data->param.exec.command = "xterm -sb -sl 2000 -bg midnightblue -fg yellow";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm White on Black"));
data->param.exec.command = "xterm -sb -sl 2000 -bg black -fg white";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm Black on White"));
data->param.exec.command = "xterm -sb -sl 2000 -bg white -fg black";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm Black on Beige"));
data->param.exec.command = "xterm -sb -sl 2000 -bg '#bbbb99' -fg black";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm White on Green"));
data->param.exec.command = "xterm -sb -sl 2000 -bg '#228822' -fg white";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm White on Olive"));
data->param.exec.command = "xterm -sb -sl 2000 -bg '#335533' -fg white";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm Blue on Blue"));
data->param.exec.command = "xterm -sb -sl 2000 -bg '#112244' -fg '#88aabb'";
data = putNewItem(panel, smenu, ExecInfo, _("XTerm BIG FONTS"));
data->param.exec.command = "xterm -sb -sl 2000 -bg black -fg white -fn 10x20";
WMMapWidget(pad);
panel->itemPad[2] = sview;
}
width = FRAME_WIDTH - 20 - 150 - 10;
panel->optionsF = WMCreateFrame(panel->frame);
@@ -494,7 +755,7 @@ createPanel(_Panel *p)
WMMoveWidget(panel->dstripB, 10, 50);
WMSetButtonText(panel->dstripB, _("Strip extensions from file names"));
WMSetButtonAction(panel->dstripB, stripClicked, panel);
WMSetButtonAction(panel->dstripB, buttonClicked, panel);
WMMapSubwidgets(panel->dpathF);
@@ -518,11 +779,13 @@ createPanel(_Panel *p)
WMResizeWidget(panel->sgrabB, 80, 24);
WMMoveWidget(panel->sgrabB, width - 90, 18);
WMSetButtonText(panel->sgrabB, _("Capture"));
WMSetButtonAction(panel->sgrabB, sgrabClicked, panel);
panel->sclearB = WMCreateCommandButton(panel->shortF);
WMResizeWidget(panel->sclearB, 80, 24);
WMMoveWidget(panel->sclearB, width - 175, 18);
WMSetButtonText(panel->sclearB, _("Clear"));
WMSetButtonAction(panel->sclearB, sgrabClicked, panel);
WMMapSubwidgets(panel->shortF);
@@ -563,13 +826,31 @@ createPanel(_Panel *p)
WMResizeWidget(panel->paramT, width - 20, 20);
WMMoveWidget(panel->paramT, 10, 20);
WMAddNotificationObserver(dataChanged, panel,
WMTextDidChangeNotification,
panel->paramT);
WMMapSubwidgets(panel->paramF);
panel->quickB = WMCreateSwitchButton(panel->optionsF);
WMResizeWidget(panel->quickB, width, 20);
WMMoveWidget(panel->quickB, 10, 120);
WMSetButtonText(panel->quickB, _("Do not confirm action."));
WMSetButtonAction(panel->quickB, buttonClicked, panel);
WMRealizeWidget(panel->frame);
WMMapSubwidgets(panel->frame);
WMMapWidget(panel->frame);
{
int i;
for (i = 0; i < 3; i++)
WMUnmapWidget(panel->itemPad[i]);
}
changedItemPad(panel->typeP, panel);
panel->sections[ExecInfo][0] = panel->commandF;
panel->sections[ExecInfo][1] = panel->shortF;
@@ -655,8 +936,7 @@ parseCommand(proplist_t item)
if (p)
parameter = PLGetString(p);
if (strcmp(command, "EXEC") == 0
|| strcmp(command, "SHEXEC") == 0) {
if (strcmp(command, "EXEC") == 0 || strcmp(command, "SHEXEC") == 0) {
data->type = ExecInfo;
@@ -822,21 +1102,26 @@ changeInfoType(_Panel *panel, char *title, InfoType type)
{
WMWidget **w;
if (panel->currentType != NoInfo) {
w = panel->sections[panel->currentType];
if (panel->currentType != type) {
while (*w) {
WMUnmapWidget(*w);
w++;
if (panel->currentType != NoInfo) {
w = panel->sections[panel->currentType];
while (*w) {
WMUnmapWidget(*w);
w++;
}
WMUnmapWidget(panel->paramF);
WMUnmapWidget(panel->quickB);
}
}
if (type != NoInfo) {
w = panel->sections[type];
if (type != NoInfo) {
w = panel->sections[type];
while (*w) {
WMMapWidget(*w);
w++;
while (*w) {
WMMapWidget(*w);
w++;
}
}
}
@@ -873,18 +1158,30 @@ updateMenuItem(_Panel *panel, WEditMenuItem *item, WMWidget *changedWidget)
if (changedWidget == panel->icommandL) {
data->param.command.command =
WMGetListSelectedItemRow(panel->icommandL);
switch (data->param.command.command) {
case 6:
data->param.command.parameter =
WMGetTextFieldText(panel->paramT);
break;
}
switch (data->param.command.command) {
case 3:
case 4:
if (changedWidget == panel->quickB) {
REPLACE(data->param.command.parameter,
WMGetButtonSelected(panel->quickB)
? wstrdup("QUICK") : NULL);
}
break;
case 6:
if (changedWidget == panel->paramT) {
REPLACE(data->param.command.parameter,
WMGetTextFieldText(panel->paramT));
}
break;
}
if (changedWidget == panel->shortT) {
REPLACE(data->param.command.shortcut,
WMGetTextFieldText(panel->shortT));
}
break;
case PipeInfo:
@@ -944,26 +1241,28 @@ menuItemCloned(WEditMenuDelegate *delegate, WEditMenu *menu,
switch (data->type) {
case ExecInfo:
data->param.exec.command = DUP(data->param.exec.command);
data->param.exec.shortcut = DUP(data->param.exec.shortcut);
newData->param.exec.command = DUP(data->param.exec.command);
newData->param.exec.shortcut = DUP(data->param.exec.shortcut);
break;
case CommandInfo:
data->param.command.parameter = DUP(data->param.command.parameter);
data->param.command.shortcut = DUP(data->param.command.shortcut);
newData->param.command.command = data->param.command.command;
newData->param.command.parameter = DUP(data->param.command.parameter);
newData->param.command.shortcut = DUP(data->param.command.shortcut);
break;
case PipeInfo:
data->param.pipe.command = DUP(data->param.pipe.command);
newData->param.pipe.command = DUP(data->param.pipe.command);
break;
case ExternalInfo:
data->param.external.path = DUP(data->param.external.path);
newData->param.external.path = DUP(data->param.external.path);
break;
case DirectoryInfo:
data->param.directory.directory = DUP(data->param.directory.directory);
data->param.directory.command = DUP(data->param.directory.command);
newData->param.directory.directory = DUP(data->param.directory.directory);
newData->param.directory.command = DUP(data->param.directory.command);
newData->param.directory.stripExt = data->param.directory.stripExt;
break;
default:
@@ -1060,6 +1359,11 @@ menuItemSelected(WEditMenuDelegate *delegate, WEditMenu *menu,
WMSetTextFieldText(panel->shortT, data->param.command.shortcut);
switch (data->param.command.command) {
case 3:
case 4:
WMSetButtonSelected(panel->quickB,
data->param.command.parameter!=NULL);
break;
case 6:
WMSetTextFieldText(panel->paramT,
data->param.command.parameter);
@@ -1095,8 +1399,9 @@ menuItemSelected(WEditMenuDelegate *delegate, WEditMenu *menu,
static WEditMenu*
buildSubmenu(WMScreen *scr, proplist_t pl)
buildSubmenu(_Panel *panel, proplist_t pl)
{
WMScreen *scr = WMWidgetScreen(panel->win);
WEditMenu *menu;
WEditMenuItem *item;
char *title;
@@ -1121,7 +1426,7 @@ buildSubmenu(WMScreen *scr, proplist_t pl)
if (PLIsArray(bp)) { /* it's a submenu */
WEditMenu *submenu;
submenu = buildSubmenu(scr, pi);
submenu = buildSubmenu(panel, pi);
item = WAddMenuItemWithTitle(menu, title);
@@ -1133,6 +1438,8 @@ buildSubmenu(WMScreen *scr, proplist_t pl)
data = parseCommand(pi);
if (panel->markerPix[data->type])
WSetEditMenuItemImage(item, panel->markerPix[data->type]);
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
}
}
@@ -1150,7 +1457,7 @@ buildSubmenu(WMScreen *scr, proplist_t pl)
static void
buildMenuFromPL(_Panel *panel, proplist_t pl)
{
panel->menu = buildSubmenu(WMWidgetScreen(panel->win), pl);
panel->menu = buildSubmenu(panel, pl);
WMMapWidget(panel->menu);
}
@@ -1281,7 +1588,7 @@ processData(char *title, ItemData *data)
switch (data->type) {
case ExecInfo:
#if 1
if (strpbrk(data->param.exec.command, "&$*|><?")) {
if (strpbrk(data->param.exec.command, "&$*|><?`")) {
s1 = "SHEXEC";
} else {
s1 = "EXEC";
@@ -1312,13 +1619,18 @@ processData(char *title, ItemData *data)
PLAppendArrayElement(item, PLMakeString(commandNames[i]));
switch (i) {
case 7: /* restart */
case 3:
case 4:
if (data->param.command.parameter)
PLAppendArrayElement(item,
PLMakeString(data->param.command.parameter));
break;
/* SHUTDOWN, QUIT QUICK */
case 7: /* restart */
if (data->param.command.parameter)
PLAppendArrayElement(item,
PLMakeString(data->param.command.parameter));
break;
}
break;
@@ -1458,3 +1770,4 @@ InitMenu(WMScreen *scr, WMWindow *win)
return panel;
}

View File

@@ -69,6 +69,8 @@ typedef struct W_EditMenu {
WEditMenuDelegate *delegate;
WMTextFieldDelegate *tdelegate;
/* item dragging */
int draggedItem;
int dragX, dragY;
@@ -402,8 +404,9 @@ itemSelectObserver(void *self, WMNotification *notif)
return;
}
if (menu->selectedItem && !menu->selectedItem->submenu) {
deselectItem(menu);
if (menu->selectedItem) {
if (!menu->selectedItem->submenu)
deselectItem(menu);
if (menu->flags.isEditing)
stopEditItem(menu, False);
}
@@ -829,7 +832,7 @@ selectItem(WEditMenu *menu, WEditMenuItem *item)
if (item && !item->flags.isTitle) {
highlightItem(item, True);
if (item->submenu) {
if (item->submenu && !W_VIEW_MAPPED(item->submenu->view)) {
WMPoint pt;
XSizeHints *hints;
@@ -993,9 +996,13 @@ editItemLabel(WEditMenuItem *item)
WMSetTextFieldBeveled(mPtr->tfield, False);
WMRealizeWidget(mPtr->tfield);
textFieldDelegate.data = mPtr;
mPtr->tdelegate = wmalloc(sizeof(WMTextFieldDelegate));
memcpy(mPtr->tdelegate, &textFieldDelegate,
sizeof(WMTextFieldDelegate));
WMSetTextFieldDelegate(mPtr->tfield, &textFieldDelegate);
mPtr->tdelegate->data = mPtr;
WMSetTextFieldDelegate(mPtr->tfield, mPtr->tdelegate);
}
tf = mPtr->tfield;
@@ -1219,27 +1226,6 @@ dragMenu(WEditMenu *menu)
}
static WEditMenu*
duplicateMenu(WEditMenu *menu)
{
WEditMenu *nmenu;
WEditMenuItem *title;
if (menu->flags.isTitled) {
title = WMGetFromBag(menu->items, 0);
}
nmenu = WCreateEditMenu(WMWidgetScreen(menu), title->label);
memcpy(&nmenu->flags, &menu->flags, sizeof(menu->flags));
nmenu->delegate = menu->delegate;
WMRealizeWidget(nmenu);
return nmenu;
}
static WEditMenuItem*
duplicateItem(WEditMenuItem *item)
@@ -1254,6 +1240,46 @@ duplicateItem(WEditMenuItem *item)
}
static WEditMenu*
duplicateMenu(WEditMenu *menu)
{
WEditMenu *nmenu;
WEditMenuItem *item;
WMBagIterator iter;
Bool first = menu->flags.isTitled;
nmenu = WCreateEditMenu(WMWidgetScreen(menu), WGetEditMenuTitle(menu));
memcpy(&nmenu->flags, &menu->flags, sizeof(menu->flags));
nmenu->delegate = menu->delegate;
WM_ITERATE_BAG(menu->items, item, iter) {
WEditMenuItem *nitem;
if (first) {
first = False;
continue;
}
nitem = WAddMenuItemWithTitle(nmenu, item->label);
if (item->pixmap)
WSetEditMenuItemImage(nitem, item->pixmap);
if (menu->delegate && menu->delegate->itemCloned) {
(*menu->delegate->itemCloned)(menu->delegate, menu,
item, nitem);
}
}
WMRealizeWidget(nmenu);
return nmenu;
}
static void
dragItem(WEditMenu *menu, WEditMenuItem *item)
{
@@ -1458,6 +1484,8 @@ destroyEditMenu(WEditMenu *mPtr)
WMFreeBag(mPtr->items);
free(mPtr->tdelegate);
free(mPtr);
}