1 /* Menu.c- menu definition
3 * WPrefs - Window Maker Preferences Program
5 * Copyright (c) 1998 Alfredo K. Kojima
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
28 #include <X11/keysym.h>
30 typedef struct _Panel
{
34 CallbackRec callbacks
;
69 proplist_t editedItem
;
71 proplist_t itemClipboard
; /* for copy/paste */
73 char capturing
; /* shortcut capture */
74 char unsaved
; /* if there are unsaved changes */
80 #define ICON_FILE "menus"
84 extern char *OpenMenuGuru(WMWindow
*mainWindow
);
86 extern Bool
AskMenuCopy(WMWindow
*wwin
);
89 /* must match the indexes of the commands popup */
131 static void showData(_Panel
*panel
);
135 isMenu(proplist_t item
)
137 if (PLGetNumberOfElements(item
)==1)
140 return PLIsArray(PLGetArrayElement(item
, 1));
145 splitOpenMenuParameter(char *str
, char **dirs
, char **prog
)
149 if (!(p
= strstr(str
, " WITH "))) {
150 *dirs
= wstrdup(str
);
157 *dirs
= wmalloc(i
-j
+1);
158 strncpy(*dirs
, str
, i
-j
+1);
162 while (isspace(*p
)) p
++;
174 changeItemTitle(proplist_t item
, char *title
)
178 tmp
= PLGetArrayElement(item
, 0);
180 PLRemoveArrayElement(item
, 0);
181 PLInsertArrayElement(item
, title
?PLMakeString(title
):PLMakeString(""), 0);
186 removeParameter(proplist_t item
)
191 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
196 tmp
= PLGetArrayElement(item
, index
);
197 PLRemoveArrayElement(item
, index
);
204 changeItemParameter(proplist_t item
, char *param
)
209 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
214 tmp
= PLGetArrayElement(item
, index
);
215 PLRemoveArrayElement(item
, index
);
217 tmp
= param
?PLMakeString(param
):PLMakeString("");
218 PLInsertArrayElement(item
, tmp
, index
);
223 changeItemShortcut(proplist_t item
, char *shortcut
)
227 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
229 tmp
= PLGetArrayElement(item
, 2);
230 PLRemoveArrayElement(item
, 2);
232 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
234 /* remove SHORTCUT keyword */
235 tmp
= PLGetArrayElement(item
, 1);
236 PLRemoveArrayElement(item
, 1);
238 /* remove the shortcut */
239 tmp
= PLGetArrayElement(item
, 1);
240 PLRemoveArrayElement(item
, 1);
245 PLInsertArrayElement(item
, PLMakeString("SHORTCUT"), 1);
246 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
255 changeItemCommand(proplist_t item
, char *command
)
259 tmp
= PLGetArrayElement(item
, 1);
260 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
262 PLRemoveArrayElement(item
, 3);
263 PLInsertArrayElement(item
, PLMakeString(command
), 3);
266 PLRemoveArrayElement(item
, 1);
267 PLInsertArrayElement(item
, PLMakeString(command
), 1);
273 getItemTitle(proplist_t item
)
275 return PLGetString(PLGetArrayElement(item
, 0));
280 getItemParameter(proplist_t item
)
284 tmp
= PLGetArrayElement(item
, 1);
285 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
286 tmp
= PLGetArrayElement(item
, 4);
287 return tmp
? PLGetString(tmp
) : NULL
;
289 tmp
= PLGetArrayElement(item
, 2);
290 return tmp
? PLGetString(tmp
) : NULL
;
297 getItemShortcut(proplist_t item
)
301 tmp
= PLGetArrayElement(item
, 1);
302 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
303 return PLGetString(PLGetArrayElement(item
, 2));
312 getItemCommand(proplist_t item
)
317 tmp
= PLGetArrayElement(item
, 1);
320 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
321 str
= PLGetString(PLGetArrayElement(item
,3));
323 str
= PLGetString(tmp
);
330 updateForItemType(_Panel
*panel
, int type
)
332 if (type
==TNothing
) {
333 WMUnmapWidget(panel
->labF
);
335 WMMapWidget(panel
->labF
);
337 if (type
==TExternalMenu
|| type
==TNothing
) {
338 WMUnmapWidget(panel
->cmdF
);
340 WMMapWidget(panel
->cmdF
);
342 if (type
==TNothing
|| type
==TWSMenu
|| type
==TExternalMenu
) {
343 WMUnmapWidget(panel
->shoF
);
345 WMMapWidget(panel
->shoF
);
347 if (type
==TExec
|| type
==TRestart
|| type
==TExternalMenu
) {
348 WMMapWidget(panel
->proF
);
350 WMUnmapWidget(panel
->proF
);
352 if (type
==TExternalMenu
) {
353 WMMapWidget(panel
->pathF
);
355 WMUnmapWidget(panel
->pathF
);
358 WMMapWidget(panel
->noconfirmB
);
360 WMUnmapWidget(panel
->noconfirmB
);
363 WMMapWidget(panel
->infoL
);
365 WMUnmapWidget(panel
->infoL
);
367 if (type
==TExternalMenu
) {
368 WMMapWidget(panel
->guruB
);
370 WMUnmapWidget(panel
->guruB
);
372 if (type
== TRestart
) {
373 WMSetFrameTitle(panel
->proF
, _("Window Manager"));
374 } else if (type
== TExternalMenu
) {
375 WMSetFrameTitle(panel
->proF
, _("Program to open files"));
377 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
383 getItemOfSelectedEntry(WMBrowser
*bPtr
)
389 i
= WMGetBrowserSelectedColumn(bPtr
);
390 menu
= (proplist_t
)WMGetHangedData(WMGetBrowserListInColumn(bPtr
, i
));
392 i
= WMGetBrowserSelectedRowInColumn(bPtr
, i
);
393 item
= PLGetArrayElement(menu
, i
+1);
400 performCommand(WMWidget
*w
, void *data
)
402 _Panel
*panel
= (_Panel
*)data
;
403 WMPopUpButton
*pop
= (WMPopUpButton
*)w
;
404 proplist_t menuItem
= NULL
;
408 static int cmdIndex
=0;
412 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
413 if (pop
== panel
->cmd2P
) {
417 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
420 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
421 menu
= WMGetHangedData(list
);
423 row
= WMGetBrowserSelectedRowInColumn(panel
->browser
, column
);
425 switch (WMGetPopUpButtonSelectedItem(pop
)) {
427 title
= wmalloc(strlen(_("New Command %i"))+6);
428 sprintf(title
, _("New Command %i"), cmdIndex
++);
429 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
430 PLMakeString("EXEC"),
435 title
= wstrdup(_("New Submenu"));
436 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
440 title
= wstrdup(_("External Menu"));
441 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
442 PLMakeString("OPEN_MENU"),
447 title
= wstrdup(_("Workspaces"));
448 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
449 PLMakeString("WORKSPACE_MENU"),
451 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
452 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
457 WMRemoveBrowserItem(panel
->browser
, column
, row
);
458 menuItem
= PLGetArrayElement(menu
, row
+1);
459 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0) {
460 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
461 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
463 PLRemoveArrayElement(menu
, row
+1);
465 updateForItemType(panel
, TNothing
);
466 panel
->editedItem
= NULL
;
472 if (panel
->itemClipboard
473 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
474 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
475 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
477 if (panel
->itemClipboard
)
478 PLRelease(panel
->itemClipboard
);
480 WMRemoveBrowserItem(panel
->browser
, column
, row
);
481 menuItem
= PLGetArrayElement(menu
, row
+1);
482 PLRemoveArrayElement(menu
, row
+1);
483 updateForItemType(panel
, TNothing
);
485 panel
->itemClipboard
= menuItem
;
487 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
488 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
494 if (panel
->itemClipboard
495 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
496 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
497 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
499 if (panel
->itemClipboard
)
500 PLRelease(panel
->itemClipboard
);
501 panel
->itemClipboard
= NULL
;
502 menuItem
= PLGetArrayElement(menu
, row
+1);
503 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0)
505 panel
->itemClipboard
= PLDeepCopy(menuItem
);
507 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
508 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
511 menuItem
= panel
->itemClipboard
;
512 title
= wstrdup(getItemTitle(menuItem
));
513 panel
->itemClipboard
= NULL
;
514 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
515 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
520 WMInsertBrowserItem(panel
->browser
, column
, row
, title
, isMenu(menuItem
));
522 PLAppendArrayElement(menu
, menuItem
);
524 PLInsertArrayElement(menu
, menuItem
, row
+1);
531 browserClick(WMWidget
*w
, void *data
)
533 _Panel
*panel
= (_Panel
*)data
;
537 /* stop shortcut capture */
538 panel
->capturing
= 0;
540 item
= getItemOfSelectedEntry(panel
->browser
);
542 panel
->editedItem
= item
;
545 WMSetTextFieldText(panel
->labT
, getItemTitle(item
));
548 updateForItemType(panel
, TNothing
);
550 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
553 int column
= WMGetBrowserSelectedColumn(panel
->browser
);
555 if (column
== WMGetBrowserNumberOfColumns(panel
->browser
)-1
557 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
559 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
561 if (column
==WMGetBrowserFirstVisibleColumn(panel
->browser
)) {
562 /* second column is empty, because selected item is not a submenu */
563 WMSetTextFieldText(panel
->tit2T
, NULL
);
567 command
= getItemCommand(item
);
569 WMSetTextFieldText(panel
->shoT
, getItemShortcut(item
));
571 if (strcmp(command
, "OPEN_MENU")==0) {
574 splitOpenMenuParameter(getItemParameter(item
), &p
, &c
);
575 WMSetTextFieldText(panel
->pathT
, p
);
576 WMSetTextFieldText(panel
->proT
, c
);
581 updateForItemType(panel
, TExternalMenu
);
582 } else if (strcmp(command
, "EXEC")==0) {
583 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
584 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExec
);
585 updateForItemType(panel
, TExec
);
586 } else if (strcmp(command
, "WORKSPACE_MENU")==0) {
587 updateForItemType(panel
, TWSMenu
);
588 } else if (strcmp(command
, "EXIT")==0) {
589 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExit
);
590 updateForItemType(panel
, TExit
);
591 } else if (strcmp(command
, "SHUTDOWN")==0) {
592 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShutdown
);
593 updateForItemType(panel
, TExit
);
594 } else if (strcmp(command
, "RESTARTW")==0) {
595 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestartWM
);
596 updateForItemType(panel
, TRestartWM
);
597 } else if (strcmp(command
, "RESTART")==0) {
598 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestart
);
599 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
600 updateForItemType(panel
, TRestart
);
602 /* simple commands */
603 if (strcmp(command
, "ARRANGE_ICONS")==0)
604 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpArrange
);
605 else if (strcmp(command
, "HIDE_OTHERS")==0)
606 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpHide
);
607 else if (strcmp(command
, "SHOW_ALL")==0)
608 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShow
);
609 else if (strcmp(command
, "SAVE_SESSION")==0)
610 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpSaveSession
);
611 else if (strcmp(command
, "CLEAR_SESSION")==0)
612 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpClearSession
);
613 else if (strcmp(command
, "REFRESH")==0)
614 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRefresh
);
615 else if (strcmp(command
, "INFO_PANEL")==0)
616 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpInfo
);
617 else if (strcmp(command
, "LEGAL_PANEL")==0)
618 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpLegal
);
619 updateForItemType(panel
, TSimpleCommand
);
625 fillBrowserColumn(WMBrowser
*bPtr
, int column
)
627 _Panel
*panel
= (_Panel
*)WMGetHangedData(bPtr
);
629 proplist_t menuList
= NULL
;
633 menuList
= getItemOfSelectedEntry(panel
->browser
);
635 WMHangData(WMGetBrowserListInColumn(bPtr
, column
), menuList
);
637 if (column
> WMGetBrowserFirstVisibleColumn(bPtr
))
638 WMSetTextFieldText(panel
->tit2T
, getItemTitle(menuList
));
640 WMSetTextFieldText(panel
->tit1T
, getItemTitle(menuList
));
642 menuList
= panel
->menu
;
644 WMHangData(WMGetBrowserListInColumn(bPtr
, column
), menuList
);
646 WMSetTextFieldText(panel
->tit1T
, getItemTitle(panel
->menu
));
649 for (i
=1; i
<PLGetNumberOfElements(menuList
); i
++) {
650 menuItem
= PLGetArrayElement(menuList
, i
);
651 WMInsertBrowserItem(bPtr
, column
, -1, getItemTitle(menuItem
),
660 changedItem(void *observerData
, WMNotification
*notification
)
662 _Panel
*panel
= (_Panel
*)observerData
;
663 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
664 proplist_t item
= panel
->editedItem
;
675 command
= getItemCommand(item
);
677 if (t
== panel
->shoT
) {
678 str
= WMGetTextFieldText(t
);
679 if (strlen(str
)==0) {
683 changeItemShortcut(item
, str
);
686 } else if (t
== panel
->labT
) {
689 str
= WMGetTextFieldText(t
);
692 changeItemTitle(item
, str
);
693 column
= WMGetBrowserSelectedColumn(panel
->browser
);
694 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
695 litem
= WMGetListSelectedItem(list
);
700 WMRedisplayWidget(list
);
701 } else if (strcmp(command
, "EXEC")==0
702 || strcmp(command
, "RESTART")==0) {
703 if (t
== panel
->proT
) {
704 str
= WMGetTextFieldText(t
);
706 changeItemParameter(item
, str
);
710 } else if (strcmp(command
, "OPEN_MENU")==0) {
714 str
= WMGetTextFieldText(panel
->pathT
);
715 str2
= WMGetTextFieldText(panel
->proT
);
716 text
= wmalloc(strlen(str
)+strlen(str2
)+16);
719 if (strlen(str2
)>0) {
720 strcat(text
, " WITH ");
724 changeItemParameter(item
, text
);
732 changedTitle(void *observerData
, WMNotification
*notification
)
734 _Panel
*panel
= (_Panel
*)observerData
;
735 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
741 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
742 if (panel
->tit2T
== t
)
745 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
750 menu
= (proplist_t
)WMGetHangedData(list
);
754 txt
= WMGetTextFieldText(t
);
755 changeItemTitle(menu
, txt
);
760 list
= WMGetBrowserListInColumn(panel
->browser
, column
-1);
761 litem
= WMGetListSelectedItem(list
);
766 WMRedisplayWidget(list
);
775 changedCommand(WMWidget
*w
, void *data
)
777 _Panel
*panel
= (_Panel
*)data
;
782 i
= WMGetPopUpButtonSelectedItem(panel
->cmdP
);
783 changeItemParameter(panel
->editedItem
, "");
786 if (strcmp(getItemCommand(panel
->editedItem
), "EXEC")!=0) {
787 changeItemCommand(panel
->editedItem
, "EXEC");
788 tmp
= WMGetTextFieldText(panel
->proT
);
789 changeItemParameter(panel
->editedItem
, tmp
);
791 updateForItemType(panel
, TExec
);
795 if (strcmp(getItemCommand(panel
->editedItem
), "ARRANGE_ICONS")!=0) {
796 changeItemCommand(panel
->editedItem
, "ARRANGE_ICONS");
797 updateForItemType(panel
, TSimpleCommand
);
801 if (strcmp(getItemCommand(panel
->editedItem
), "HIDE_OTHERS")!=0) {
802 changeItemCommand(panel
->editedItem
, "HIDE_OTHERS");
803 updateForItemType(panel
, TSimpleCommand
);
807 if (strcmp(getItemCommand(panel
->editedItem
), "SHOW_ALL")!=0) {
808 changeItemCommand(panel
->editedItem
, "SHOW_ALL");
809 updateForItemType(panel
, TSimpleCommand
);
813 if (strcmp(getItemCommand(panel
->editedItem
), "EXIT")!=0) {
814 changeItemCommand(panel
->editedItem
, "EXIT");
815 updateForItemType(panel
, TExit
);
819 if (strcmp(getItemCommand(panel
->editedItem
), "SHUTDOWN")!=0) {
820 changeItemCommand(panel
->editedItem
, "SHUTDOWN");
821 updateForItemType(panel
, TExit
);
823 if (WMGetButtonSelected(panel
->noconfirmB
))
824 changeItemParameter(panel
->editedItem
, "QUICK");
826 changeItemParameter(panel
->editedItem
, "");
829 changeItemCommand(panel
->editedItem
, "RESTARTW");
830 updateForItemType(panel
, TRestartWM
);
833 changeItemCommand(panel
->editedItem
, "RESTART");
834 updateForItemType(panel
, TRestart
);
835 tmp
= WMGetTextFieldText(panel
->proT
);
836 changeItemParameter(panel
->editedItem
, tmp
);
840 if (strcmp(getItemCommand(panel
->editedItem
), "SAVE_SESSION")!=0) {
841 changeItemCommand(panel
->editedItem
, "SAVE_SESSION");
842 updateForItemType(panel
, TSimpleCommand
);
846 if (strcmp(getItemCommand(panel
->editedItem
), "CLEAR_SESSION")!=0) {
847 changeItemCommand(panel
->editedItem
, "CLEAR_SESSION");
848 updateForItemType(panel
, TSimpleCommand
);
852 if (strcmp(getItemCommand(panel
->editedItem
), "REFRESH")!=0) {
853 changeItemCommand(panel
->editedItem
, "REFRESH");
854 updateForItemType(panel
, TSimpleCommand
);
858 if (strcmp(getItemCommand(panel
->editedItem
), "INFO_PANEL")!=0) {
859 changeItemCommand(panel
->editedItem
, "INFO_PANEL");
860 updateForItemType(panel
, TSimpleCommand
);
864 if (strcmp(getItemCommand(panel
->editedItem
), "LEGAL_PANEL")!=0) {
865 changeItemCommand(panel
->editedItem
, "LEGAL_PANEL");
866 updateForItemType(panel
, TSimpleCommand
);
877 captureShortcut(Display
*dpy
, _Panel
*panel
)
884 while (panel
->capturing
) {
885 XAllowEvents(dpy
, AsyncKeyboard
, CurrentTime
);
886 WMNextEvent(dpy
, &ev
);
887 if (ev
.type
==KeyPress
&& ev
.xkey
.keycode
!=0) {
888 ksym
= XKeycodeToKeysym(dpy
, ev
.xkey
.keycode
, 0);
889 if (!IsModifierKey(ksym
)) {
890 key
=XKeysymToString(ksym
);
891 panel
->capturing
= 0;
903 if (ev
.xkey
.state
& ControlMask
) {
904 strcat(buffer
, "Control+");
906 if (ev
.xkey
.state
& ShiftMask
) {
907 strcat(buffer
, "Shift+");
909 if (ev
.xkey
.state
& Mod1Mask
) {
910 strcat(buffer
, "Mod1+");
912 if (ev
.xkey
.state
& Mod2Mask
) {
913 strcat(buffer
, "Mod2+");
915 if (ev
.xkey
.state
& Mod3Mask
) {
916 strcat(buffer
, "Mod3+");
918 if (ev
.xkey
.state
& Mod4Mask
) {
919 strcat(buffer
, "Mod4+");
921 if (ev
.xkey
.state
& Mod5Mask
) {
922 strcat(buffer
, "Mod5+");
926 return wstrdup(buffer
);
931 captureClick(WMWidget
*w
, void *data
)
933 _Panel
*panel
= (_Panel
*)data
;
934 Display
*dpy
= WMScreenDisplay(WMWidgetScreen(panel
->win
));
937 if (!panel
->capturing
) {
938 panel
->capturing
= 1;
939 WMSetButtonText(w
, _("Cancel"));
940 XGrabKeyboard(dpy
, WMWidgetXID(panel
->win
), True
, GrabModeAsync
,
941 GrabModeAsync
, CurrentTime
);
942 shortcut
= captureShortcut(dpy
, panel
);
944 WMSetTextFieldText(panel
->shoT
, shortcut
);
945 changeItemShortcut(panel
->editedItem
, shortcut
);
950 panel
->capturing
= 0;
951 WMSetButtonText(w
, _("Capture"));
952 XUngrabKeyboard(dpy
, CurrentTime
);
958 scrolledBrowser(void *observerData
, WMNotification
*notification
)
960 _Panel
*panel
= (_Panel
*)observerData
;
965 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
967 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
968 item
= WMGetHangedData(list
);
969 WMSetTextFieldText(panel
->tit1T
, getItemTitle(item
));
971 list
= WMGetBrowserListInColumn(panel
->browser
, column
+1);
973 item
= WMGetHangedData(list
);
974 WMSetTextFieldText(panel
->tit2T
, getItemTitle(item
));
980 confirmClicked(WMWidget
*w
, void *data
)
982 _Panel
*panel
= (_Panel
*)data
;
984 if (WMGetButtonSelected(panel
->noconfirmB
)) {
985 changeItemParameter(panel
->editedItem
, "QUICK");
987 changeItemParameter(panel
->editedItem
, "");
995 openGuru(WMWidget
*w
, void *data
)
997 _Panel
*panel
= (_Panel
*)data
;
1001 def
= OpenMenuGuru(GetWindow(panel
));
1003 changeItemParameter(panel
->editedItem
, def
);
1004 splitOpenMenuParameter(def
, &path
, &cmd
);
1006 WMSetTextFieldText(panel
->pathT
, path
);
1010 WMSetTextFieldText(panel
->proT
, cmd
);
1019 createPanel(_Panel
*p
)
1021 _Panel
*panel
= (_Panel
*)p
;
1024 panel
->frame
= WMCreateFrame(panel
->win
);
1025 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
1026 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
1028 panel
->cmd1P
= WMCreatePopUpButton(panel
->frame
);
1029 WMSetPopUpButtonAction(panel
->cmd1P
, performCommand
, panel
);
1030 WMResizeWidget(panel
->cmd1P
, 144, 20);
1031 WMMoveWidget(panel
->cmd1P
, 15, 15);
1032 WMSetPopUpButtonPullsDown(panel
->cmd1P
, True
);
1033 WMSetPopUpButtonText(panel
->cmd1P
, _("Commands"));
1034 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Command"));
1035 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Submenu"));
1036 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add External Menu"));
1037 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Workspace Menu"));
1038 WMAddPopUpButtonItem(panel
->cmd1P
, _("Remove Item"));
1039 WMAddPopUpButtonItem(panel
->cmd1P
, _("Cut Item"));
1040 WMAddPopUpButtonItem(panel
->cmd1P
, _("Copy Item"));
1041 WMAddPopUpButtonItem(panel
->cmd1P
, _("Paste Item"));
1043 panel
->cmd2P
= WMCreatePopUpButton(panel
->frame
);
1044 WMSetPopUpButtonAction(panel
->cmd2P
, performCommand
, panel
);
1045 WMResizeWidget(panel
->cmd2P
, 144, 20);
1046 WMMoveWidget(panel
->cmd2P
, 164, 15);
1047 WMSetPopUpButtonPullsDown(panel
->cmd2P
, True
);
1048 WMSetPopUpButtonText(panel
->cmd2P
, _("Commands"));
1049 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Command"));
1050 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Submenu"));
1051 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add External Menu"));
1052 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Workspace Menu"));
1053 WMAddPopUpButtonItem(panel
->cmd2P
, _("Remove Item"));
1054 WMAddPopUpButtonItem(panel
->cmd2P
, _("Cut Item"));
1055 WMAddPopUpButtonItem(panel
->cmd2P
, _("Copy Item"));
1056 WMAddPopUpButtonItem(panel
->cmd2P
, _("Paste Item"));
1058 panel
->tit1T
= WMCreateTextField(panel
->frame
);
1059 WMResizeWidget(panel
->tit1T
, 144, 20);
1060 WMMoveWidget(panel
->tit1T
, 15, 40);
1061 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1064 panel
->tit2T
= WMCreateTextField(panel
->frame
);
1065 WMResizeWidget(panel
->tit2T
, 144, 20);
1066 WMMoveWidget(panel
->tit2T
, 164, 40);
1067 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1070 panel
->browser
= WMCreateBrowser(panel
->frame
);
1071 WMSetBrowserTitled(panel
->browser
, False
);
1072 WMResizeWidget(panel
->browser
, 295, 160);
1073 WMMoveWidget(panel
->browser
, 15, 65);
1074 WMSetBrowserFillColumnProc(panel
->browser
, fillBrowserColumn
);
1075 WMHangData(panel
->browser
, panel
);
1076 WMSetBrowserPathSeparator(panel
->browser
, "\r");
1077 WMSetBrowserAction(panel
->browser
, browserClick
, panel
);
1078 WMAddNotificationObserver(scrolledBrowser
, panel
,
1079 WMBrowserDidScrollNotification
, panel
->browser
);
1082 panel
->labF
= WMCreateFrame(panel
->frame
);
1083 WMResizeWidget(panel
->labF
, 190, 50);
1084 WMMoveWidget(panel
->labF
, 320, 10);
1085 WMSetFrameTitle(panel
->labF
, _("Label"));
1087 panel
->labT
= WMCreateTextField(panel
->labF
);
1088 WMResizeWidget(panel
->labT
, 170, 20);
1089 WMMoveWidget(panel
->labT
, 10, 20);
1090 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1093 WMMapSubwidgets(panel
->labF
);
1095 panel
->cmdF
= WMCreateFrame(panel
->frame
);
1096 WMResizeWidget(panel
->cmdF
, 190, 50);
1097 WMMoveWidget(panel
->cmdF
, 320, 65);
1098 WMSetFrameTitle(panel
->cmdF
, _("Command"));
1100 panel
->cmdP
= WMCreatePopUpButton(panel
->cmdF
);
1101 WMResizeWidget(panel
->cmdP
, 170, 20);
1102 WMMoveWidget(panel
->cmdP
, 10, 20);
1103 WMAddPopUpButtonItem(panel
->cmdP
, _("Run Program"));
1104 WMAddPopUpButtonItem(panel
->cmdP
, _("Arrange Icons"));
1105 WMAddPopUpButtonItem(panel
->cmdP
, _("Hide Others"));
1106 WMAddPopUpButtonItem(panel
->cmdP
, _("Show All Windows"));
1107 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit WindowMaker"));
1108 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit X Session"));
1109 WMAddPopUpButtonItem(panel
->cmdP
, _("Start window manager"));
1110 WMAddPopUpButtonItem(panel
->cmdP
, _("Restart WindowMaker"));
1111 WMAddPopUpButtonItem(panel
->cmdP
, _("Save Session"));
1112 WMAddPopUpButtonItem(panel
->cmdP
, _("Clear Session"));
1113 WMAddPopUpButtonItem(panel
->cmdP
, _("Refresh Screen"));
1114 WMAddPopUpButtonItem(panel
->cmdP
, _("Info Panel"));
1115 WMAddPopUpButtonItem(panel
->cmdP
, _("Legal Panel"));
1116 WMSetPopUpButtonAction(panel
->cmdP
, changedCommand
, panel
);
1118 WMMapSubwidgets(panel
->cmdF
);
1120 panel
->infoL
= WMCreateLabel(panel
->frame
);
1121 WMResizeWidget(panel
->infoL
, 190, 50);
1122 WMMoveWidget(panel
->infoL
, 320, 65);
1123 WMSetLabelText(panel
->infoL
, _("Open workspace menu"));
1124 WMSetLabelRelief(panel
->infoL
, WRGroove
);
1125 WMSetLabelTextAlignment(panel
->infoL
, WACenter
);
1127 panel
->noconfirmB
= WMCreateSwitchButton(panel
->frame
);
1128 WMResizeWidget(panel
->noconfirmB
, 190, 50);
1129 WMMoveWidget(panel
->noconfirmB
, 320, 120);
1130 WMSetButtonText(panel
->noconfirmB
, _("No confirmation panel"));
1131 WMSetButtonAction(panel
->noconfirmB
, confirmClicked
, panel
);
1133 panel
->pathF
= WMCreateFrame(panel
->frame
);
1134 WMResizeWidget(panel
->pathF
, 190, 50);
1135 WMMoveWidget(panel
->pathF
, 320, 65);
1136 WMSetFrameTitle(panel
->pathF
, _("Menu Path/Directory List"));
1138 panel
->pathT
= WMCreateTextField(panel
->pathF
);
1139 WMResizeWidget(panel
->pathT
, 170, 20);
1140 WMMoveWidget(panel
->pathT
, 10, 20);
1141 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1144 WMMapSubwidgets(panel
->pathF
);
1146 panel
->proF
= WMCreateFrame(panel
->frame
);
1147 WMResizeWidget(panel
->proF
, 190, 50);
1148 WMMoveWidget(panel
->proF
, 320, 120);
1149 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
1151 panel
->proT
= WMCreateTextField(panel
->proF
);
1152 WMResizeWidget(panel
->proT
, 170, 20);
1153 WMMoveWidget(panel
->proT
, 10, 20);
1154 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1157 WMMapSubwidgets(panel
->proF
);
1159 panel
->shoF
= WMCreateFrame(panel
->frame
);
1160 WMResizeWidget(panel
->shoF
, 190, 50);
1161 WMMoveWidget(panel
->shoF
, 320, 175);
1162 WMSetFrameTitle(panel
->shoF
, _("Shortcut"));
1164 panel
->shoT
= WMCreateTextField(panel
->shoF
);
1165 WMResizeWidget(panel
->shoT
, 95, 20);
1166 WMMoveWidget(panel
->shoT
, 10, 20);
1167 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1170 panel
->shoB
= WMCreateCommandButton(panel
->shoF
);
1171 WMResizeWidget(panel
->shoB
, 70, 24);
1172 WMMoveWidget(panel
->shoB
, 110, 18);
1173 WMSetButtonText(panel
->shoB
, _("Capture"));
1174 WMSetButtonAction(panel
->shoB
, captureClick
, panel
);
1176 WMMapSubwidgets(panel
->shoF
);
1178 panel
->guruB
= WMCreateCommandButton(panel
->frame
);
1179 WMResizeWidget(panel
->guruB
, 180, 24);
1180 WMMoveWidget(panel
->guruB
, 325, 190);
1181 WMSetButtonText(panel
->guruB
, _("Ask help to the Guru"));
1182 WMSetButtonAction(panel
->guruB
, openGuru
, panel
);
1184 WMRealizeWidget(panel
->frame
);
1185 WMMapSubwidgets(panel
->frame
);
1194 preProcessMenu(proplist_t menu
, int *hasWSMenu
)
1200 pmenu
= PLDeepCopy(menu
);
1201 if (PLGetNumberOfElements(pmenu
)==1) {
1204 for (i
=1; i
<PLGetNumberOfElements(pmenu
); i
++) {
1205 item
= PLGetArrayElement(pmenu
, i
);
1207 PLInsertArrayElement(pmenu
, preProcessMenu(item
, hasWSMenu
), i
);
1208 PLRemoveArrayElement(pmenu
, i
+1);
1210 } else if (strcmp(getItemCommand(item
), "RESTART")==0) {
1211 if (getItemShortcut(item
)) {
1212 if (PLGetNumberOfElements(item
) == 4) {
1213 changeItemCommand(item
, "RESTARTW");
1214 PLAppendArrayElement(item
, PLMakeString(""));
1217 if (PLGetNumberOfElements(item
) == 2) {
1218 changeItemCommand(item
, "RESTARTW");
1219 PLAppendArrayElement(item
, PLMakeString(""));
1223 if (strcmp(getItemCommand(item
),"WORKSPACE_MENU")==0)
1225 if (getItemShortcut(item
)) {
1226 if (PLGetNumberOfElements(item
) == 4)
1227 PLAppendArrayElement(item
, PLMakeString(""));
1229 if (PLGetNumberOfElements(item
) == 2)
1230 PLAppendArrayElement(item
, PLMakeString(""));
1241 postProcessMenu(proplist_t menu
)
1248 pmenu
= PLDeepCopy(menu
);
1249 if (PLGetNumberOfElements(pmenu
)==1) {
1252 count
= PLGetNumberOfElements(pmenu
);
1253 for (i
=1; i
<count
; i
++) {
1255 item
= PLGetArrayElement(pmenu
, i
);
1257 PLInsertArrayElement(pmenu
, postProcessMenu(item
), i
);
1258 PLRemoveArrayElement(pmenu
, i
+1);
1261 cmd
= getItemCommand(item
);
1262 if (strcmp(cmd
, "RESTARTW")==0) {
1263 changeItemCommand(item
, "RESTART");
1264 removeParameter(item
);
1265 } else if (strcmp(cmd
, "EXEC")==0 || strcmp(cmd
, "OPEN_MENU")==0) {
1267 } else if (strcmp(cmd
, "RESTART")==0 || strcmp(cmd
, "SHUTDOWN")==0
1268 || strcmp(cmd
, "EXIT")==0) {
1269 char *tmp
= getItemParameter(item
);
1270 if (tmp
&& strlen(tmp
)==0)
1271 removeParameter(item
);
1273 removeParameter(item
);
1283 getDefaultMenu(_Panel
*panel
, int *hasWSMenu
)
1285 proplist_t menu
, pmenu
;
1286 char *menuPath
, *gspath
;
1288 gspath
= wusergnusteppath();
1290 menuPath
= wmalloc(strlen(gspath
)+128);
1291 /* if there is a localized plmenu for the tongue put it's filename here */
1292 sprintf(menuPath
, _("%s/Library/WindowMaker/plmenu"), gspath
);
1294 menu
= PLGetProplistWithPath(menuPath
);
1296 wwarning("%s:could not read property list menu", menuPath
);
1298 if (strcmp("%s/Library/WindowMaker/plmenu",
1299 _("%s/Library/WindowMaker/plmenu"))!=0) {
1301 sprintf(menuPath
, "%s/Library/WindowMaker/plmenu", gspath
);
1302 menu
= PLGetProplistWithPath(menuPath
);
1303 wwarning("%s:could not read property list menu", menuPath
);
1308 sprintf(buffer
, _("Could not open default menu from '%s'"),
1310 WMRunAlertPanel(WMWidgetScreen(panel
->win
), panel
->win
,
1311 _("Error"), buffer
, _("OK"), NULL
, NULL
);
1319 pmenu
= preProcessMenu(menu
, hasWSMenu
);
1330 showData(_Panel
*panel
)
1334 proplist_t menu
, pmenu
, plPath
;
1337 gspath
= wusergnusteppath();
1339 menuPath
= wmalloc(strlen(gspath
)+32);
1340 strcpy(menuPath
, gspath
);
1342 strcat(menuPath
, "/Defaults/WMRootMenu");
1344 menu
= PLGetProplistWithPath(menuPath
);
1347 if (!menu
|| !PLIsArray(menu
)) {
1348 if (AskMenuCopy(panel
->win
)) {
1349 panel
->dontSave
= 0;
1351 pmenu
= getDefaultMenu(panel
, &hasWSMenu
);
1353 WMSetPopUpButtonEnabled(panel
->cmd1P
, False
);
1354 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
1355 panel
->dontSave
= 1;
1358 pmenu
= PLMakeArrayFromElements(PLMakeString("Applications"),
1362 pmenu
= preProcessMenu(menu
, &hasWSMenu
);
1364 plPath
= PLMakeString(menuPath
);
1366 PLSetFilename(pmenu
, plPath
);
1372 if (panel
->itemClipboard
) {
1373 PLRelease(panel
->itemClipboard
);
1374 panel
->itemClipboard
= NULL
;
1376 panel
->menu
= pmenu
;
1377 panel
->editedItem
= NULL
;
1378 panel
->capturing
= 0;
1380 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
1381 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
1383 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
1384 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
1386 WMLoadBrowserColumnZero(panel
->browser
);
1388 updateForItemType(panel
, TNothing
);
1393 storeData(_Panel
*panel
)
1397 if (!panel
->unsaved
|| panel
->dontSave
)
1401 menu
= postProcessMenu(panel
->menu
);
1403 PLSetFilename(menu
, PLGetFilename(panel
->menu
));
1412 InitMenu(WMScreen
*scr
, WMWindow
*win
)
1416 panel
= wmalloc(sizeof(_Panel
));
1417 memset(panel
, 0, sizeof(_Panel
));
1419 panel
->sectionName
= _("Applications Menu Definition");
1423 panel
->callbacks
.createWidgets
= createPanel
;
1424 panel
->callbacks
.updateDomain
= storeData
;
1426 AddSection(panel
, ICON_FILE
);