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 *gray;
WMColor *black; WMColor *black;
WMPixmap *markerPix; WMPixmap *markerPix[LastInfo];
WMPopUpButton *typeP; WMPopUpButton *typeP;
WEditMenu *itemPad; WMWidget *itemPad[3];
int currentPad;
WEditMenu *menu; WEditMenu *menu;
char *menuPath; char *menuPath;
@@ -100,9 +101,13 @@ typedef struct _Panel {
WMFrame *paramF; WMFrame *paramF;
WMTextField *paramT; WMTextField *paramT;
WMButton *quickB;
Bool dontAsk; /* whether to comfirm submenu remove */ Bool dontAsk; /* whether to comfirm submenu remove */
Bool dontSave; Bool dontSave;
Bool capturing;
/* about the currently selected item */ /* about the currently selected item */
WEditMenuItem *currentItem; WEditMenuItem *currentItem;
InfoType currentType; InfoType currentType;
@@ -210,7 +215,7 @@ dataChanged(void *self, WMNotification *notif)
static void static void
stripClicked(WMWidget *w, void *data) buttonClicked(WMWidget *w, void *data)
{ {
_Panel *panel = (_Panel*)data; _Panel *panel = (_Panel*)data;
WEditMenuItem *item = panel->currentItem; WEditMenuItem *item = panel->currentItem;
@@ -223,16 +228,179 @@ static void
icommandLClicked(WMWidget *w, void *data) icommandLClicked(WMWidget *w, void *data)
{ {
_Panel *panel = (_Panel*)data; _Panel *panel = (_Panel*)data;
int cmd;
switch (WMGetListSelectedItemRow(w)) { cmd = WMGetListSelectedItemRow(w);
case 6: if (cmd == 3 || cmd == 4) {
WMMapWidget(panel->quickB);
} else {
WMUnmapWidget(panel->quickB);
}
if (cmd == 6) {
WMMapWidget(panel->paramF); WMMapWidget(panel->paramF);
break; } else {
default:
WMUnmapWidget(panel->paramF); 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; 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;
}
static void static void
@@ -263,10 +431,11 @@ createPanel(_Panel *p)
Pixmap pix; Pixmap pix;
Display *dpy = WMScreenDisplay(scr); Display *dpy = WMScreenDisplay(scr);
GC gc; 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, 0, 6, 3);
XDrawLine(dpy, pix, WMColorGC(black), 1, 6, 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); XDrawLine(dpy, pix, WMColorGC(black), 0, 0, 0, 6);
pix = WMGetPixmapMaskXID(panel->markerPix); pix = WMGetPixmapMaskXID(pixm);
gc = XCreateGC(dpy, pix, 0, NULL); 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, 1, 6, 3, 3);
XDrawLine(dpy, pix, gc, 0, 0, 0, 6); 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); XFreeGC(dpy, gc);
} }
@@ -301,71 +475,158 @@ createPanel(_Panel *p)
WMResizeWidget(panel->typeP, 150, 20); WMResizeWidget(panel->typeP, 150, 20);
WMMoveWidget(panel->typeP, 10, 10); WMMoveWidget(panel->typeP, 10, 10);
WMAddPopUpButtonItem(panel->typeP, _("Items")); WMAddPopUpButtonItem(panel->typeP, _("New Items"));
WMAddPopUpButtonItem(panel->typeP, _("Sample Commands")); WMAddPopUpButtonItem(panel->typeP, _("Sample Commands"));
WMAddPopUpButtonItem(panel->typeP, _("Sample Submenus")); WMAddPopUpButtonItem(panel->typeP, _("Sample Submenus"));
WMSetPopUpButtonAction(panel->typeP, changedItemPad, panel);
WMSetPopUpButtonSelectedItem(panel->typeP, 0); WMSetPopUpButtonSelectedItem(panel->typeP, 0);
{ {
WEditMenu *pad; WEditMenu *pad;
WEditMenu *tmp; WEditMenu *smenu;
WEditMenuItem *item;
ItemData *data; ItemData *data;
pad = WCreateEditMenuPad(panel->frame); pad = makeFactoryMenu(panel->frame, 150);
WMResizeWidget(pad, 150, 180);
WMMoveWidget(pad, 10, 40); 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 = putNewItem(panel, pad, ExecInfo, "Run Program");
data = NEW(ItemData); data = putNewItem(panel, pad, CommandInfo, "Internal Command");
data->type = ExecInfo; smenu = putNewSubmenu(pad, "Submenu");
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData); 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"); panel->itemPad[0] = pad;
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;
} }
{
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; width = FRAME_WIDTH - 20 - 150 - 10;
panel->optionsF = WMCreateFrame(panel->frame); panel->optionsF = WMCreateFrame(panel->frame);
@@ -494,7 +755,7 @@ createPanel(_Panel *p)
WMMoveWidget(panel->dstripB, 10, 50); WMMoveWidget(panel->dstripB, 10, 50);
WMSetButtonText(panel->dstripB, _("Strip extensions from file names")); WMSetButtonText(panel->dstripB, _("Strip extensions from file names"));
WMSetButtonAction(panel->dstripB, stripClicked, panel); WMSetButtonAction(panel->dstripB, buttonClicked, panel);
WMMapSubwidgets(panel->dpathF); WMMapSubwidgets(panel->dpathF);
@@ -518,11 +779,13 @@ createPanel(_Panel *p)
WMResizeWidget(panel->sgrabB, 80, 24); WMResizeWidget(panel->sgrabB, 80, 24);
WMMoveWidget(panel->sgrabB, width - 90, 18); WMMoveWidget(panel->sgrabB, width - 90, 18);
WMSetButtonText(panel->sgrabB, _("Capture")); WMSetButtonText(panel->sgrabB, _("Capture"));
WMSetButtonAction(panel->sgrabB, sgrabClicked, panel);
panel->sclearB = WMCreateCommandButton(panel->shortF); panel->sclearB = WMCreateCommandButton(panel->shortF);
WMResizeWidget(panel->sclearB, 80, 24); WMResizeWidget(panel->sclearB, 80, 24);
WMMoveWidget(panel->sclearB, width - 175, 18); WMMoveWidget(panel->sclearB, width - 175, 18);
WMSetButtonText(panel->sclearB, _("Clear")); WMSetButtonText(panel->sclearB, _("Clear"));
WMSetButtonAction(panel->sclearB, sgrabClicked, panel);
WMMapSubwidgets(panel->shortF); WMMapSubwidgets(panel->shortF);
@@ -563,13 +826,31 @@ createPanel(_Panel *p)
WMResizeWidget(panel->paramT, width - 20, 20); WMResizeWidget(panel->paramT, width - 20, 20);
WMMoveWidget(panel->paramT, 10, 20); WMMoveWidget(panel->paramT, 10, 20);
WMAddNotificationObserver(dataChanged, panel,
WMTextDidChangeNotification,
panel->paramT);
WMMapSubwidgets(panel->paramF); 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); WMRealizeWidget(panel->frame);
WMMapSubwidgets(panel->frame); WMMapSubwidgets(panel->frame);
WMMapWidget(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][0] = panel->commandF;
panel->sections[ExecInfo][1] = panel->shortF; panel->sections[ExecInfo][1] = panel->shortF;
@@ -655,8 +936,7 @@ parseCommand(proplist_t item)
if (p) if (p)
parameter = PLGetString(p); parameter = PLGetString(p);
if (strcmp(command, "EXEC") == 0 if (strcmp(command, "EXEC") == 0 || strcmp(command, "SHEXEC") == 0) {
|| strcmp(command, "SHEXEC") == 0) {
data->type = ExecInfo; data->type = ExecInfo;
@@ -822,6 +1102,8 @@ changeInfoType(_Panel *panel, char *title, InfoType type)
{ {
WMWidget **w; WMWidget **w;
if (panel->currentType != type) {
if (panel->currentType != NoInfo) { if (panel->currentType != NoInfo) {
w = panel->sections[panel->currentType]; w = panel->sections[panel->currentType];
@@ -829,6 +1111,8 @@ changeInfoType(_Panel *panel, char *title, InfoType type)
WMUnmapWidget(*w); WMUnmapWidget(*w);
w++; w++;
} }
WMUnmapWidget(panel->paramF);
WMUnmapWidget(panel->quickB);
} }
if (type != NoInfo) { if (type != NoInfo) {
@@ -839,6 +1123,7 @@ changeInfoType(_Panel *panel, char *title, InfoType type)
w++; w++;
} }
} }
}
updateFrameTitle(panel, title, type); updateFrameTitle(panel, title, type);
@@ -873,18 +1158,30 @@ updateMenuItem(_Panel *panel, WEditMenuItem *item, WMWidget *changedWidget)
if (changedWidget == panel->icommandL) { if (changedWidget == panel->icommandL) {
data->param.command.command = data->param.command.command =
WMGetListSelectedItemRow(panel->icommandL); 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) { if (changedWidget == panel->shortT) {
REPLACE(data->param.command.shortcut, REPLACE(data->param.command.shortcut,
WMGetTextFieldText(panel->shortT)); WMGetTextFieldText(panel->shortT));
} }
break; break;
case PipeInfo: case PipeInfo:
@@ -944,26 +1241,28 @@ menuItemCloned(WEditMenuDelegate *delegate, WEditMenu *menu,
switch (data->type) { switch (data->type) {
case ExecInfo: case ExecInfo:
data->param.exec.command = DUP(data->param.exec.command); newData->param.exec.command = DUP(data->param.exec.command);
data->param.exec.shortcut = DUP(data->param.exec.shortcut); newData->param.exec.shortcut = DUP(data->param.exec.shortcut);
break; break;
case CommandInfo: case CommandInfo:
data->param.command.parameter = DUP(data->param.command.parameter); newData->param.command.command = data->param.command.command;
data->param.command.shortcut = DUP(data->param.command.shortcut); newData->param.command.parameter = DUP(data->param.command.parameter);
newData->param.command.shortcut = DUP(data->param.command.shortcut);
break; break;
case PipeInfo: case PipeInfo:
data->param.pipe.command = DUP(data->param.pipe.command); newData->param.pipe.command = DUP(data->param.pipe.command);
break; break;
case ExternalInfo: case ExternalInfo:
data->param.external.path = DUP(data->param.external.path); newData->param.external.path = DUP(data->param.external.path);
break; break;
case DirectoryInfo: case DirectoryInfo:
data->param.directory.directory = DUP(data->param.directory.directory); newData->param.directory.directory = DUP(data->param.directory.directory);
data->param.directory.command = DUP(data->param.directory.command); newData->param.directory.command = DUP(data->param.directory.command);
newData->param.directory.stripExt = data->param.directory.stripExt;
break; break;
default: default:
@@ -1060,6 +1359,11 @@ menuItemSelected(WEditMenuDelegate *delegate, WEditMenu *menu,
WMSetTextFieldText(panel->shortT, data->param.command.shortcut); WMSetTextFieldText(panel->shortT, data->param.command.shortcut);
switch (data->param.command.command) { switch (data->param.command.command) {
case 3:
case 4:
WMSetButtonSelected(panel->quickB,
data->param.command.parameter!=NULL);
break;
case 6: case 6:
WMSetTextFieldText(panel->paramT, WMSetTextFieldText(panel->paramT,
data->param.command.parameter); data->param.command.parameter);
@@ -1095,8 +1399,9 @@ menuItemSelected(WEditMenuDelegate *delegate, WEditMenu *menu,
static WEditMenu* static WEditMenu*
buildSubmenu(WMScreen *scr, proplist_t pl) buildSubmenu(_Panel *panel, proplist_t pl)
{ {
WMScreen *scr = WMWidgetScreen(panel->win);
WEditMenu *menu; WEditMenu *menu;
WEditMenuItem *item; WEditMenuItem *item;
char *title; char *title;
@@ -1121,7 +1426,7 @@ buildSubmenu(WMScreen *scr, proplist_t pl)
if (PLIsArray(bp)) { /* it's a submenu */ if (PLIsArray(bp)) { /* it's a submenu */
WEditMenu *submenu; WEditMenu *submenu;
submenu = buildSubmenu(scr, pi); submenu = buildSubmenu(panel, pi);
item = WAddMenuItemWithTitle(menu, title); item = WAddMenuItemWithTitle(menu, title);
@@ -1133,6 +1438,8 @@ buildSubmenu(WMScreen *scr, proplist_t pl)
data = parseCommand(pi); data = parseCommand(pi);
if (panel->markerPix[data->type])
WSetEditMenuItemImage(item, panel->markerPix[data->type]);
WSetEditMenuItemData(item, data, (WMCallback*)freeItemData); WSetEditMenuItemData(item, data, (WMCallback*)freeItemData);
} }
} }
@@ -1150,7 +1457,7 @@ buildSubmenu(WMScreen *scr, proplist_t pl)
static void static void
buildMenuFromPL(_Panel *panel, proplist_t pl) buildMenuFromPL(_Panel *panel, proplist_t pl)
{ {
panel->menu = buildSubmenu(WMWidgetScreen(panel->win), pl); panel->menu = buildSubmenu(panel, pl);
WMMapWidget(panel->menu); WMMapWidget(panel->menu);
} }
@@ -1281,7 +1588,7 @@ processData(char *title, ItemData *data)
switch (data->type) { switch (data->type) {
case ExecInfo: case ExecInfo:
#if 1 #if 1
if (strpbrk(data->param.exec.command, "&$*|><?")) { if (strpbrk(data->param.exec.command, "&$*|><?`")) {
s1 = "SHEXEC"; s1 = "SHEXEC";
} else { } else {
s1 = "EXEC"; s1 = "EXEC";
@@ -1312,13 +1619,18 @@ processData(char *title, ItemData *data)
PLAppendArrayElement(item, PLMakeString(commandNames[i])); PLAppendArrayElement(item, PLMakeString(commandNames[i]));
switch (i) { switch (i) {
case 7: /* restart */ case 3:
case 4:
if (data->param.command.parameter) if (data->param.command.parameter)
PLAppendArrayElement(item, PLAppendArrayElement(item,
PLMakeString(data->param.command.parameter)); PLMakeString(data->param.command.parameter));
break; break;
/* SHUTDOWN, QUIT QUICK */ case 7: /* restart */
if (data->param.command.parameter)
PLAppendArrayElement(item,
PLMakeString(data->param.command.parameter));
break;
} }
break; break;
@@ -1458,3 +1770,4 @@ InitMenu(WMScreen *scr, WMWindow *win)
return panel; return panel;
} }

View File

@@ -69,6 +69,8 @@ typedef struct W_EditMenu {
WEditMenuDelegate *delegate; WEditMenuDelegate *delegate;
WMTextFieldDelegate *tdelegate;
/* item dragging */ /* item dragging */
int draggedItem; int draggedItem;
int dragX, dragY; int dragX, dragY;
@@ -402,7 +404,8 @@ itemSelectObserver(void *self, WMNotification *notif)
return; return;
} }
if (menu->selectedItem && !menu->selectedItem->submenu) { if (menu->selectedItem) {
if (!menu->selectedItem->submenu)
deselectItem(menu); deselectItem(menu);
if (menu->flags.isEditing) if (menu->flags.isEditing)
stopEditItem(menu, False); stopEditItem(menu, False);
@@ -829,7 +832,7 @@ selectItem(WEditMenu *menu, WEditMenuItem *item)
if (item && !item->flags.isTitle) { if (item && !item->flags.isTitle) {
highlightItem(item, True); highlightItem(item, True);
if (item->submenu) { if (item->submenu && !W_VIEW_MAPPED(item->submenu->view)) {
WMPoint pt; WMPoint pt;
XSizeHints *hints; XSizeHints *hints;
@@ -993,9 +996,13 @@ editItemLabel(WEditMenuItem *item)
WMSetTextFieldBeveled(mPtr->tfield, False); WMSetTextFieldBeveled(mPtr->tfield, False);
WMRealizeWidget(mPtr->tfield); 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; 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* static WEditMenuItem*
duplicateItem(WEditMenuItem *item) 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 static void
dragItem(WEditMenu *menu, WEditMenuItem *item) dragItem(WEditMenu *menu, WEditMenuItem *item)
{ {
@@ -1458,6 +1484,8 @@ destroyEditMenu(WEditMenu *mPtr)
WMFreeBag(mPtr->items); WMFreeBag(mPtr->items);
free(mPtr->tdelegate);
free(mPtr); free(mPtr);
} }