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
{
36 CallbackRec callbacks
;
71 proplist_t editedItem
;
73 proplist_t itemClipboard
; /* for copy/paste */
75 char capturing
; /* shortcut capture */
76 char unsaved
; /* if there are unsaved changes */
82 #define ICON_FILE "menus"
86 extern char *OpenMenuGuru(WMWindow
*mainWindow
);
88 extern Bool
AskMenuCopy(WMWindow
*wwin
);
91 /* must match the indexes of the commands popup */
135 static void showData(_Panel
*panel
);
140 isMenu(proplist_t item
)
142 if (PLGetNumberOfElements(item
)==1)
145 return PLIsArray(PLGetArrayElement(item
, 1));
150 splitOpenMenuParameter(char *str
, char **dirs
, char **prog
)
154 if (!(p
= strstr(str
, " WITH "))) {
155 *dirs
= wstrdup(str
);
162 *dirs
= wmalloc(i
-j
+1);
163 strncpy(*dirs
, str
, i
-j
+1);
167 while (isspace(*p
)) p
++;
179 changeItemTitle(proplist_t item
, char *title
)
183 tmp
= PLGetArrayElement(item
, 0);
185 PLRemoveArrayElement(item
, 0);
186 PLInsertArrayElement(item
, title
?PLMakeString(title
):PLMakeString(""), 0);
191 removeParameter(proplist_t item
)
196 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
201 tmp
= PLGetArrayElement(item
, index
);
202 PLRemoveArrayElement(item
, index
);
209 changeItemParameter(proplist_t item
, char *param
)
214 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
219 tmp
= PLGetArrayElement(item
, index
);
220 PLRemoveArrayElement(item
, index
);
222 tmp
= param
?PLMakeString(param
):PLMakeString("");
223 PLInsertArrayElement(item
, tmp
, index
);
228 changeItemShortcut(proplist_t item
, char *shortcut
)
232 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
234 tmp
= PLGetArrayElement(item
, 2);
235 PLRemoveArrayElement(item
, 2);
237 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
239 /* remove SHORTCUT keyword */
240 tmp
= PLGetArrayElement(item
, 1);
241 PLRemoveArrayElement(item
, 1);
243 /* remove the shortcut */
244 tmp
= PLGetArrayElement(item
, 1);
245 PLRemoveArrayElement(item
, 1);
250 PLInsertArrayElement(item
, PLMakeString("SHORTCUT"), 1);
251 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
260 changeItemCommand(proplist_t item
, char *command
)
264 tmp
= PLGetArrayElement(item
, 1);
265 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
267 PLRemoveArrayElement(item
, 3);
268 PLInsertArrayElement(item
, PLMakeString(command
), 3);
271 PLRemoveArrayElement(item
, 1);
272 PLInsertArrayElement(item
, PLMakeString(command
), 1);
278 getItemTitle(proplist_t item
)
280 return PLGetString(PLGetArrayElement(item
, 0));
285 getItemParameter(proplist_t item
)
289 tmp
= PLGetArrayElement(item
, 1);
290 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
291 tmp
= PLGetArrayElement(item
, 4);
292 return tmp
? PLGetString(tmp
) : NULL
;
294 tmp
= PLGetArrayElement(item
, 2);
295 return tmp
? PLGetString(tmp
) : NULL
;
302 getItemShortcut(proplist_t item
)
306 tmp
= PLGetArrayElement(item
, 1);
307 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
308 return PLGetString(PLGetArrayElement(item
, 2));
317 getItemCommand(proplist_t item
)
322 tmp
= PLGetArrayElement(item
, 1);
325 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
326 str
= PLGetString(PLGetArrayElement(item
,3));
328 str
= PLGetString(tmp
);
336 getSubmenuInColumn(_Panel
*panel
, int column
)
346 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
349 list
= WMGetBrowserListInColumn(panel
->browser
, column
- 1);
350 assert(list
!= NULL
);
352 r
= WMGetListSelectedItemRow(list
);
354 parent
= getSubmenuInColumn(panel
, column
- 1);
356 assert(parent
!= NULL
);
358 submenu
= PLGetArrayElement(parent
, r
+ 1);
365 updateForItemType(_Panel
*panel
, int type
)
367 if (type
==TNothing
) {
368 WMUnmapWidget(panel
->labF
);
370 WMMapWidget(panel
->labF
);
372 if (type
==TExternalMenu
|| type
==TNothing
) {
373 WMUnmapWidget(panel
->cmdF
);
375 WMMapWidget(panel
->cmdF
);
377 if (type
==TNothing
|| type
==TWSMenu
|| type
==TExternalMenu
) {
378 WMUnmapWidget(panel
->shoF
);
380 WMMapWidget(panel
->shoF
);
382 if (type
==TExec
|| type
== TShExec
|| type
==TRestart
383 || type
==TExternalMenu
) {
384 WMMapWidget(panel
->proF
);
386 WMUnmapWidget(panel
->proF
);
388 if (type
==TExternalMenu
) {
389 WMMapWidget(panel
->pathF
);
391 WMUnmapWidget(panel
->pathF
);
394 WMMapWidget(panel
->noconfirmB
);
396 WMUnmapWidget(panel
->noconfirmB
);
399 WMMapWidget(panel
->infoL
);
401 WMUnmapWidget(panel
->infoL
);
403 if (type
==TExternalMenu
) {
404 WMMapWidget(panel
->guruB
);
406 WMUnmapWidget(panel
->guruB
);
408 if (type
== TRestart
) {
409 WMSetFrameTitle(panel
->proF
, _("Window Manager"));
410 } else if (type
== TExternalMenu
) {
411 WMSetFrameTitle(panel
->proF
, _("Program to Open Files"));
412 } else if (type
== TShExec
) {
413 WMSetFrameTitle(panel
->proF
, _("Command to Execute"));
415 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
421 getItemOfSelectedEntry(WMBrowser
*bPtr
)
427 i
= WMGetBrowserSelectedColumn(bPtr
);
428 menu
= getSubmenuInColumn((_Panel
*)WMGetHangedData(bPtr
), i
);
430 i
= WMGetBrowserSelectedRowInColumn(bPtr
, i
);
431 item
= PLGetArrayElement(menu
, i
+1);
438 performCommand(WMWidget
*w
, void *data
)
440 _Panel
*panel
= (_Panel
*)data
;
441 WMPopUpButton
*pop
= (WMPopUpButton
*)w
;
442 proplist_t menuItem
= NULL
;
446 static int cmdIndex
=0;
448 Bool removed
= False
;
450 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
451 if (pop
== panel
->cmd2P
) {
455 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
458 menu
= getSubmenuInColumn(panel
, column
);
460 row
= WMGetBrowserSelectedRowInColumn(panel
->browser
, column
);
462 switch (WMGetPopUpButtonSelectedItem(pop
)) {
464 title
= wmalloc(strlen(_("New Command %i"))+6);
465 sprintf(title
, _("New Command %i"), cmdIndex
++);
466 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
467 PLMakeString("EXEC"),
472 title
= wstrdup(_("New Submenu"));
473 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
477 title
= wstrdup(_("External Menu"));
478 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
479 PLMakeString("OPEN_MENU"),
484 title
= wstrdup(_("Workspaces"));
485 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
486 PLMakeString("WORKSPACE_MENU"),
488 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
489 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
494 WMRemoveBrowserItem(panel
->browser
, column
, row
);
495 menuItem
= PLGetArrayElement(menu
, row
+1);
496 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0) {
497 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
498 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
500 PLRemoveArrayElement(menu
, row
+1);
502 updateForItemType(panel
, TNothing
);
503 panel
->editedItem
= NULL
;
505 if (pop
== panel
->cmd1P
) {
506 WMSetTextFieldText(panel
->tit2T
, NULL
);
513 if (panel
->itemClipboard
514 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
515 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
516 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
518 if (panel
->itemClipboard
)
519 PLRelease(panel
->itemClipboard
);
520 WMRemoveBrowserItem(panel
->browser
, column
, row
);
521 menuItem
= PLGetArrayElement(menu
, row
+1);
522 PLRemoveArrayElement(menu
, row
+1);
523 updateForItemType(panel
, TNothing
);
525 panel
->itemClipboard
= menuItem
;
527 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
528 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
535 if (panel
->itemClipboard
536 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
537 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
538 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
540 if (panel
->itemClipboard
)
541 PLRelease(panel
->itemClipboard
);
542 panel
->itemClipboard
= NULL
;
543 menuItem
= PLGetArrayElement(menu
, row
+1);
544 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0)
546 panel
->itemClipboard
= PLDeepCopy(menuItem
);
548 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
549 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
552 menuItem
= panel
->itemClipboard
;
553 title
= wstrdup(getItemTitle(menuItem
));
554 panel
->itemClipboard
= NULL
;
555 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
556 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
561 WMInsertBrowserItem(panel
->browser
, column
, row
, title
, isMenu(menuItem
));
563 PLAppendArrayElement(menu
, menuItem
);
565 PLInsertArrayElement(menu
, menuItem
, row
+1);
570 if (pop
== panel
->cmd1P
) {
571 WMSetTextFieldText(panel
->tit2T
, NULL
);
578 browserClick(WMWidget
*w
, void *data
)
580 _Panel
*panel
= (_Panel
*)data
;
584 /* stop shortcut capture */
585 panel
->capturing
= 0;
587 item
= getItemOfSelectedEntry(panel
->browser
);
589 panel
->editedItem
= item
;
592 WMSetTextFieldText(panel
->labT
, getItemTitle(item
));
595 updateForItemType(panel
, TNothing
);
597 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
600 int column
= WMGetBrowserSelectedColumn(panel
->browser
);
602 if (column
== WMGetBrowserNumberOfColumns(panel
->browser
)-1
604 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
606 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
608 if (column
==WMGetBrowserFirstVisibleColumn(panel
->browser
)) {
609 /* second column is empty, because selected item is not a submenu */
610 WMSetTextFieldText(panel
->tit2T
, NULL
);
614 command
= getItemCommand(item
);
616 WMSetTextFieldText(panel
->shoT
, getItemShortcut(item
));
618 if (strcmp(command
, "OPEN_MENU")==0) {
621 splitOpenMenuParameter(getItemParameter(item
), &p
, &c
);
622 WMSetTextFieldText(panel
->pathT
, p
);
623 WMSetTextFieldText(panel
->proT
, c
);
628 updateForItemType(panel
, TExternalMenu
);
629 } else if (strcmp(command
, "EXEC")==0) {
630 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
631 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExec
);
632 updateForItemType(panel
, TExec
);
633 } else if (strcmp(command
, "SHEXEC")==0) {
634 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
635 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShExec
);
636 updateForItemType(panel
, TShExec
);
637 } else if (strcmp(command
, "WORKSPACE_MENU")==0) {
638 updateForItemType(panel
, TWSMenu
);
639 } else if (strcmp(command
, "EXIT")==0) {
640 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExit
);
641 updateForItemType(panel
, TExit
);
642 } else if (strcmp(command
, "SHUTDOWN")==0) {
643 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShutdown
);
644 updateForItemType(panel
, TExit
);
645 } else if (strcmp(command
, "RESTARTW")==0) {
646 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestartWM
);
647 updateForItemType(panel
, TRestartWM
);
648 } else if (strcmp(command
, "RESTART")==0) {
649 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestart
);
650 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
651 updateForItemType(panel
, TRestart
);
653 /* simple commands */
654 if (strcmp(command
, "ARRANGE_ICONS")==0)
655 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpArrange
);
656 else if (strcmp(command
, "HIDE_OTHERS")==0)
657 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpHide
);
658 else if (strcmp(command
, "SHOW_ALL")==0)
659 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShow
);
660 else if (strcmp(command
, "SAVE_SESSION")==0)
661 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpSaveSession
);
662 else if (strcmp(command
, "CLEAR_SESSION")==0)
663 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpClearSession
);
664 else if (strcmp(command
, "REFRESH")==0)
665 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRefresh
);
666 else if (strcmp(command
, "INFO_PANEL")==0)
667 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpInfo
);
668 else if (strcmp(command
, "LEGAL_PANEL")==0)
669 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpLegal
);
670 updateForItemType(panel
, TSimpleCommand
);
677 fillBrowserColumn(WMBrowser
*bPtr
, int column
)
679 _Panel
*panel
= (_Panel
*)WMGetHangedData(bPtr
);
681 proplist_t menuList
= NULL
;
685 menuList
= getSubmenuInColumn(panel
, column
);
686 assert(menuList
!= NULL
);
688 if (column
> WMGetBrowserFirstVisibleColumn(bPtr
)) {
689 WMSetTextFieldText(panel
->tit2T
, getItemTitle(menuList
));
691 WMSetTextFieldText(panel
->tit1T
, getItemTitle(menuList
));
694 for (i
=1; i
<PLGetNumberOfElements(menuList
); i
++) {
695 menuItem
= PLGetArrayElement(menuList
, i
);
696 WMInsertBrowserItem(bPtr
, column
, -1, getItemTitle(menuItem
),
705 changedItem(void *observerData
, WMNotification
*notification
)
707 _Panel
*panel
= (_Panel
*)observerData
;
708 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
709 proplist_t item
= panel
->editedItem
;
721 command
= getItemCommand(item
);
723 if (t
== panel
->shoT
) {
724 str
= WMGetTextFieldText(t
);
725 if (strlen(str
)==0) {
729 changeItemShortcut(item
, str
);
732 } else if (t
== panel
->labT
) {
735 str
= WMGetTextFieldText(t
);
738 changeItemTitle(item
, str
);
739 column
= WMGetBrowserSelectedColumn(panel
->browser
);
740 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
741 litem
= WMGetListSelectedItem(list
);
746 WMRedisplayWidget(list
);
747 } else if (strcmp(command
, "EXEC")==0
748 || strcmp(command
, "SHEXEC")==0
749 || strcmp(command
, "RESTART")==0) {
750 if (t
== panel
->proT
) {
751 str
= WMGetTextFieldText(t
);
753 changeItemParameter(item
, str
);
757 } else if (strcmp(command
, "OPEN_MENU")==0) {
761 str
= WMGetTextFieldText(panel
->pathT
);
762 str2
= WMGetTextFieldText(panel
->proT
);
763 text
= wmalloc(strlen(str
)+strlen(str2
)+16);
766 if (strlen(str2
)>0) {
767 strcat(text
, " WITH ");
771 changeItemParameter(item
, text
);
779 changedTitle(void *observerData
, WMNotification
*notification
)
781 _Panel
*panel
= (_Panel
*)observerData
;
782 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
788 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
789 if (panel
->tit2T
== t
)
792 menu
= getSubmenuInColumn(panel
, column
);
796 txt
= WMGetTextFieldText(t
);
797 changeItemTitle(menu
, txt
);
802 list
= WMGetBrowserListInColumn(panel
->browser
, column
-1);
803 litem
= WMGetListSelectedItem(list
);
808 WMRedisplayWidget(list
);
817 changedCommand(WMWidget
*w
, void *data
)
819 _Panel
*panel
= (_Panel
*)data
;
824 i
= WMGetPopUpButtonSelectedItem(panel
->cmdP
);
825 changeItemParameter(panel
->editedItem
, "");
828 if (strcmp(getItemCommand(panel
->editedItem
), "EXEC")!=0) {
829 changeItemCommand(panel
->editedItem
, "EXEC");
830 tmp
= WMGetTextFieldText(panel
->proT
);
831 changeItemParameter(panel
->editedItem
, tmp
);
833 updateForItemType(panel
, TExec
);
837 if (strcmp(getItemCommand(panel
->editedItem
), "SHEXEC")!=0) {
838 changeItemCommand(panel
->editedItem
, "SHEXEC");
839 tmp
= WMGetTextFieldText(panel
->proT
);
840 changeItemParameter(panel
->editedItem
, tmp
);
842 updateForItemType(panel
, TShExec
);
846 if (strcmp(getItemCommand(panel
->editedItem
), "ARRANGE_ICONS")!=0) {
847 changeItemCommand(panel
->editedItem
, "ARRANGE_ICONS");
848 updateForItemType(panel
, TSimpleCommand
);
852 if (strcmp(getItemCommand(panel
->editedItem
), "HIDE_OTHERS")!=0) {
853 changeItemCommand(panel
->editedItem
, "HIDE_OTHERS");
854 updateForItemType(panel
, TSimpleCommand
);
858 if (strcmp(getItemCommand(panel
->editedItem
), "SHOW_ALL")!=0) {
859 changeItemCommand(panel
->editedItem
, "SHOW_ALL");
860 updateForItemType(panel
, TSimpleCommand
);
864 if (strcmp(getItemCommand(panel
->editedItem
), "EXIT")!=0) {
865 changeItemCommand(panel
->editedItem
, "EXIT");
866 updateForItemType(panel
, TExit
);
868 if (WMGetButtonSelected(panel
->noconfirmB
))
869 changeItemParameter(panel
->editedItem
, "QUICK");
871 changeItemParameter(panel
->editedItem
, "");
874 if (strcmp(getItemCommand(panel
->editedItem
), "SHUTDOWN")!=0) {
875 changeItemCommand(panel
->editedItem
, "SHUTDOWN");
876 updateForItemType(panel
, TExit
);
878 if (WMGetButtonSelected(panel
->noconfirmB
))
879 changeItemParameter(panel
->editedItem
, "QUICK");
881 changeItemParameter(panel
->editedItem
, "");
884 changeItemCommand(panel
->editedItem
, "RESTARTW");
885 updateForItemType(panel
, TRestartWM
);
888 changeItemCommand(panel
->editedItem
, "RESTART");
889 updateForItemType(panel
, TRestart
);
890 tmp
= WMGetTextFieldText(panel
->proT
);
891 changeItemParameter(panel
->editedItem
, tmp
);
895 if (strcmp(getItemCommand(panel
->editedItem
), "SAVE_SESSION")!=0) {
896 changeItemCommand(panel
->editedItem
, "SAVE_SESSION");
897 updateForItemType(panel
, TSimpleCommand
);
901 if (strcmp(getItemCommand(panel
->editedItem
), "CLEAR_SESSION")!=0) {
902 changeItemCommand(panel
->editedItem
, "CLEAR_SESSION");
903 updateForItemType(panel
, TSimpleCommand
);
907 if (strcmp(getItemCommand(panel
->editedItem
), "REFRESH")!=0) {
908 changeItemCommand(panel
->editedItem
, "REFRESH");
909 updateForItemType(panel
, TSimpleCommand
);
913 if (strcmp(getItemCommand(panel
->editedItem
), "INFO_PANEL")!=0) {
914 changeItemCommand(panel
->editedItem
, "INFO_PANEL");
915 updateForItemType(panel
, TSimpleCommand
);
919 if (strcmp(getItemCommand(panel
->editedItem
), "LEGAL_PANEL")!=0) {
920 changeItemCommand(panel
->editedItem
, "LEGAL_PANEL");
921 updateForItemType(panel
, TSimpleCommand
);
932 captureShortcut(Display
*dpy
, _Panel
*panel
)
939 while (panel
->capturing
) {
940 XAllowEvents(dpy
, AsyncKeyboard
, CurrentTime
);
941 WMNextEvent(dpy
, &ev
);
942 if (ev
.type
==KeyPress
&& ev
.xkey
.keycode
!=0) {
943 ksym
= XKeycodeToKeysym(dpy
, ev
.xkey
.keycode
, 0);
944 if (!IsModifierKey(ksym
)) {
945 key
=XKeysymToString(ksym
);
946 panel
->capturing
= 0;
958 if (ev
.xkey
.state
& ControlMask
) {
959 strcat(buffer
, "Control+");
961 if (ev
.xkey
.state
& ShiftMask
) {
962 strcat(buffer
, "Shift+");
964 if (ev
.xkey
.state
& Mod1Mask
) {
965 strcat(buffer
, "Mod1+");
967 if (ev
.xkey
.state
& Mod2Mask
) {
968 strcat(buffer
, "Mod2+");
970 if (ev
.xkey
.state
& Mod3Mask
) {
971 strcat(buffer
, "Mod3+");
973 if (ev
.xkey
.state
& Mod4Mask
) {
974 strcat(buffer
, "Mod4+");
976 if (ev
.xkey
.state
& Mod5Mask
) {
977 strcat(buffer
, "Mod5+");
981 return wstrdup(buffer
);
986 captureClick(WMWidget
*w
, void *data
)
988 _Panel
*panel
= (_Panel
*)data
;
989 Display
*dpy
= WMScreenDisplay(WMWidgetScreen(panel
->win
));
992 if (!panel
->capturing
) {
993 panel
->capturing
= 1;
994 WMSetButtonText(w
, _("Cancel"));
995 XGrabKeyboard(dpy
, WMWidgetXID(panel
->win
), True
, GrabModeAsync
,
996 GrabModeAsync
, CurrentTime
);
997 shortcut
= captureShortcut(dpy
, panel
);
999 WMSetTextFieldText(panel
->shoT
, shortcut
);
1000 changeItemShortcut(panel
->editedItem
, shortcut
);
1005 panel
->capturing
= 0;
1006 WMSetButtonText(w
, _("Capture"));
1007 XUngrabKeyboard(dpy
, CurrentTime
);
1013 scrolledBrowser(void *observerData
, WMNotification
*notification
)
1015 _Panel
*panel
= (_Panel
*)observerData
;
1019 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
1021 item
= getSubmenuInColumn(panel
, column
);
1022 WMSetTextFieldText(panel
->tit1T
, getItemTitle(item
));
1024 item
= getSubmenuInColumn(panel
, column
+ 1);
1026 WMSetTextFieldText(panel
->tit2T
, getItemTitle(item
));
1031 confirmClicked(WMWidget
*w
, void *data
)
1033 _Panel
*panel
= (_Panel
*)data
;
1035 if (WMGetButtonSelected(panel
->noconfirmB
)) {
1036 changeItemParameter(panel
->editedItem
, "QUICK");
1038 changeItemParameter(panel
->editedItem
, "");
1046 openGuru(WMWidget
*w
, void *data
)
1048 _Panel
*panel
= (_Panel
*)data
;
1052 def
= OpenMenuGuru(GetWindow(panel
));
1054 changeItemParameter(panel
->editedItem
, def
);
1055 splitOpenMenuParameter(def
, &path
, &cmd
);
1057 WMSetTextFieldText(panel
->pathT
, path
);
1061 WMSetTextFieldText(panel
->proT
, cmd
);
1070 createPanel(_Panel
*p
)
1072 _Panel
*panel
= (_Panel
*)p
;
1075 panel
->frame
= WMCreateFrame(panel
->win
);
1076 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
1077 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
1079 panel
->cmd1P
= WMCreatePopUpButton(panel
->frame
);
1080 WMSetPopUpButtonAction(panel
->cmd1P
, performCommand
, panel
);
1081 WMResizeWidget(panel
->cmd1P
, 144, 20);
1082 WMMoveWidget(panel
->cmd1P
, 15, 15);
1083 WMSetPopUpButtonPullsDown(panel
->cmd1P
, True
);
1084 WMSetPopUpButtonText(panel
->cmd1P
, _("Commands"));
1085 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Command"));
1086 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Submenu"));
1087 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add External Menu"));
1088 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Workspace Menu"));
1089 WMAddPopUpButtonItem(panel
->cmd1P
, _("Remove Item"));
1090 WMAddPopUpButtonItem(panel
->cmd1P
, _("Cut Item"));
1091 WMAddPopUpButtonItem(panel
->cmd1P
, _("Copy Item"));
1092 WMAddPopUpButtonItem(panel
->cmd1P
, _("Paste Item"));
1094 panel
->cmd2P
= WMCreatePopUpButton(panel
->frame
);
1095 WMSetPopUpButtonAction(panel
->cmd2P
, performCommand
, panel
);
1096 WMResizeWidget(panel
->cmd2P
, 144, 20);
1097 WMMoveWidget(panel
->cmd2P
, 164, 15);
1098 WMSetPopUpButtonPullsDown(panel
->cmd2P
, True
);
1099 WMSetPopUpButtonText(panel
->cmd2P
, _("Commands"));
1100 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Command"));
1101 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Submenu"));
1102 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add External Menu"));
1103 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Workspace Menu"));
1104 WMAddPopUpButtonItem(panel
->cmd2P
, _("Remove Item"));
1105 WMAddPopUpButtonItem(panel
->cmd2P
, _("Cut Item"));
1106 WMAddPopUpButtonItem(panel
->cmd2P
, _("Copy Item"));
1107 WMAddPopUpButtonItem(panel
->cmd2P
, _("Paste Item"));
1109 panel
->tit1T
= WMCreateTextField(panel
->frame
);
1110 WMResizeWidget(panel
->tit1T
, 144, 20);
1111 WMMoveWidget(panel
->tit1T
, 15, 40);
1112 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1115 panel
->tit2T
= WMCreateTextField(panel
->frame
);
1116 WMResizeWidget(panel
->tit2T
, 144, 20);
1117 WMMoveWidget(panel
->tit2T
, 164, 40);
1118 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1121 panel
->browser
= WMCreateBrowser(panel
->frame
);
1122 WMSetBrowserTitled(panel
->browser
, False
);
1123 WMResizeWidget(panel
->browser
, 295, 160);
1124 WMMoveWidget(panel
->browser
, 15, 65);
1125 WMSetBrowserFillColumnProc(panel
->browser
, fillBrowserColumn
);
1126 WMHangData(panel
->browser
, panel
);
1127 WMSetBrowserPathSeparator(panel
->browser
, "\r");
1128 WMSetBrowserAction(panel
->browser
, browserClick
, panel
);
1129 WMAddNotificationObserver(scrolledBrowser
, panel
,
1130 WMBrowserDidScrollNotification
, panel
->browser
);
1133 panel
->labF
= WMCreateFrame(panel
->frame
);
1134 WMResizeWidget(panel
->labF
, 190, 50);
1135 WMMoveWidget(panel
->labF
, 320, 10);
1136 WMSetFrameTitle(panel
->labF
, _("Label"));
1138 panel
->labT
= WMCreateTextField(panel
->labF
);
1139 WMResizeWidget(panel
->labT
, 170, 20);
1140 WMMoveWidget(panel
->labT
, 10, 20);
1141 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1144 WMMapSubwidgets(panel
->labF
);
1146 panel
->cmdF
= WMCreateFrame(panel
->frame
);
1147 WMResizeWidget(panel
->cmdF
, 190, 50);
1148 WMMoveWidget(panel
->cmdF
, 320, 65);
1149 WMSetFrameTitle(panel
->cmdF
, _("Command"));
1151 panel
->cmdP
= WMCreatePopUpButton(panel
->cmdF
);
1152 WMResizeWidget(panel
->cmdP
, 170, 20);
1153 WMMoveWidget(panel
->cmdP
, 10, 20);
1154 WMAddPopUpButtonItem(panel
->cmdP
, _("Run Program"));
1155 WMAddPopUpButtonItem(panel
->cmdP
, _("Execute Shell Command"));
1156 WMAddPopUpButtonItem(panel
->cmdP
, _("Arrange Icons"));
1157 WMAddPopUpButtonItem(panel
->cmdP
, _("Hide Others"));
1158 WMAddPopUpButtonItem(panel
->cmdP
, _("Show All Windows"));
1159 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit WindowMaker"));
1160 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit X Session"));
1161 WMAddPopUpButtonItem(panel
->cmdP
, _("Start Window Manager"));
1162 WMAddPopUpButtonItem(panel
->cmdP
, _("Restart WindowMaker"));
1163 WMAddPopUpButtonItem(panel
->cmdP
, _("Save Session"));
1164 WMAddPopUpButtonItem(panel
->cmdP
, _("Clear Session"));
1165 WMAddPopUpButtonItem(panel
->cmdP
, _("Refresh Screen"));
1166 WMAddPopUpButtonItem(panel
->cmdP
, _("Info Panel"));
1167 WMAddPopUpButtonItem(panel
->cmdP
, _("Legal Panel"));
1168 WMSetPopUpButtonAction(panel
->cmdP
, changedCommand
, panel
);
1170 WMMapSubwidgets(panel
->cmdF
);
1172 panel
->infoL
= WMCreateLabel(panel
->frame
);
1173 WMResizeWidget(panel
->infoL
, 190, 50);
1174 WMMoveWidget(panel
->infoL
, 320, 65);
1175 WMSetLabelText(panel
->infoL
, _("Open workspace menu"));
1176 WMSetLabelRelief(panel
->infoL
, WRGroove
);
1177 WMSetLabelTextAlignment(panel
->infoL
, WACenter
);
1179 panel
->noconfirmB
= WMCreateSwitchButton(panel
->frame
);
1180 WMResizeWidget(panel
->noconfirmB
, 190, 50);
1181 WMMoveWidget(panel
->noconfirmB
, 320, 120);
1182 WMSetButtonText(panel
->noconfirmB
, _("No confirmation panel"));
1183 WMSetButtonAction(panel
->noconfirmB
, confirmClicked
, panel
);
1185 panel
->pathF
= WMCreateFrame(panel
->frame
);
1186 WMResizeWidget(panel
->pathF
, 190, 50);
1187 WMMoveWidget(panel
->pathF
, 320, 65);
1188 WMSetFrameTitle(panel
->pathF
, _("Menu Path/Directory List"));
1190 panel
->pathT
= WMCreateTextField(panel
->pathF
);
1191 WMResizeWidget(panel
->pathT
, 170, 20);
1192 WMMoveWidget(panel
->pathT
, 10, 20);
1193 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1196 WMMapSubwidgets(panel
->pathF
);
1198 panel
->proF
= WMCreateFrame(panel
->frame
);
1199 WMResizeWidget(panel
->proF
, 190, 50);
1200 WMMoveWidget(panel
->proF
, 320, 120);
1201 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
1203 panel
->proT
= WMCreateTextField(panel
->proF
);
1204 WMResizeWidget(panel
->proT
, 170, 20);
1205 WMMoveWidget(panel
->proT
, 10, 20);
1206 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1209 WMMapSubwidgets(panel
->proF
);
1211 panel
->shoF
= WMCreateFrame(panel
->frame
);
1212 WMResizeWidget(panel
->shoF
, 190, 50);
1213 WMMoveWidget(panel
->shoF
, 320, 175);
1214 WMSetFrameTitle(panel
->shoF
, _("Shortcut"));
1216 panel
->shoT
= WMCreateTextField(panel
->shoF
);
1217 WMResizeWidget(panel
->shoT
, 95, 20);
1218 WMMoveWidget(panel
->shoT
, 10, 20);
1219 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1222 panel
->shoB
= WMCreateCommandButton(panel
->shoF
);
1223 WMResizeWidget(panel
->shoB
, 70, 24);
1224 WMMoveWidget(panel
->shoB
, 110, 18);
1225 WMSetButtonText(panel
->shoB
, _("Capture"));
1226 WMSetButtonAction(panel
->shoB
, captureClick
, panel
);
1228 WMMapSubwidgets(panel
->shoF
);
1230 panel
->guruB
= WMCreateCommandButton(panel
->frame
);
1231 WMResizeWidget(panel
->guruB
, 180, 24);
1232 WMMoveWidget(panel
->guruB
, 325, 190);
1233 WMSetButtonText(panel
->guruB
, _("Ask help to the Guru"));
1234 WMSetButtonAction(panel
->guruB
, openGuru
, panel
);
1236 WMRealizeWidget(panel
->frame
);
1237 WMMapSubwidgets(panel
->frame
);
1246 preProcessMenu(proplist_t menu
, int *hasWSMenu
)
1252 pmenu
= PLDeepCopy(menu
);
1253 if (PLGetNumberOfElements(pmenu
)==1) {
1256 for (i
=1; i
<PLGetNumberOfElements(pmenu
); i
++) {
1257 item
= PLGetArrayElement(pmenu
, i
);
1259 PLInsertArrayElement(pmenu
, preProcessMenu(item
, hasWSMenu
), i
);
1260 PLRemoveArrayElement(pmenu
, i
+1);
1262 } else if (strcmp(getItemCommand(item
), "RESTART")==0) {
1263 if (getItemShortcut(item
)) {
1264 if (PLGetNumberOfElements(item
) == 4) {
1265 changeItemCommand(item
, "RESTARTW");
1266 PLAppendArrayElement(item
, PLMakeString(""));
1269 if (PLGetNumberOfElements(item
) == 2) {
1270 changeItemCommand(item
, "RESTARTW");
1271 PLAppendArrayElement(item
, PLMakeString(""));
1275 if (strcmp(getItemCommand(item
),"WORKSPACE_MENU")==0)
1277 if (getItemShortcut(item
)) {
1278 if (PLGetNumberOfElements(item
) == 4)
1279 PLAppendArrayElement(item
, PLMakeString(""));
1281 if (PLGetNumberOfElements(item
) == 2)
1282 PLAppendArrayElement(item
, PLMakeString(""));
1293 postProcessMenu(proplist_t menu
)
1300 pmenu
= PLDeepCopy(menu
);
1301 if (PLGetNumberOfElements(pmenu
)==1) {
1304 count
= PLGetNumberOfElements(pmenu
);
1305 for (i
=1; i
<count
; i
++) {
1307 item
= PLGetArrayElement(pmenu
, i
);
1309 PLInsertArrayElement(pmenu
, postProcessMenu(item
), i
);
1310 PLRemoveArrayElement(pmenu
, i
+1);
1313 cmd
= getItemCommand(item
);
1314 if (strcmp(cmd
, "RESTARTW")==0) {
1315 changeItemCommand(item
, "RESTART");
1316 removeParameter(item
);
1317 } else if (strcmp(cmd
, "EXEC")==0 || strcmp(cmd
, "SHEXEC")==0 ||
1318 strcmp(cmd
, "OPEN_MENU")==0) {
1320 } else if (strcmp(cmd
, "RESTART")==0 || strcmp(cmd
, "SHUTDOWN")==0
1321 || strcmp(cmd
, "EXIT")==0) {
1322 char *tmp
= getItemParameter(item
);
1323 if (tmp
&& strlen(tmp
)==0)
1324 removeParameter(item
);
1326 removeParameter(item
);
1336 getDefaultMenu(_Panel
*panel
, int *hasWSMenu
)
1338 proplist_t menu
, pmenu
;
1339 char *menuPath
, *gspath
;
1341 gspath
= wusergnusteppath();
1343 menuPath
= wmalloc(strlen(gspath
)+128);
1344 /* if there is a localized plmenu for the tongue put it's filename here */
1345 sprintf(menuPath
, _("%s/Library/WindowMaker/plmenu"), gspath
);
1347 menu
= PLGetProplistWithPath(menuPath
);
1349 wwarning("%s:could not read property list menu", menuPath
);
1351 if (strcmp("%s/Library/WindowMaker/plmenu",
1352 _("%s/Library/WindowMaker/plmenu"))!=0) {
1354 sprintf(menuPath
, "%s/Library/WindowMaker/plmenu", gspath
);
1355 menu
= PLGetProplistWithPath(menuPath
);
1356 wwarning("%s:could not read property list menu", menuPath
);
1361 sprintf(buffer
, _("Could not open default menu from '%s'"),
1363 WMRunAlertPanel(WMWidgetScreen(panel
->win
), panel
->win
,
1364 _("Error"), buffer
, _("OK"), NULL
, NULL
);
1371 pmenu
= preProcessMenu(menu
, hasWSMenu
);
1382 showData(_Panel
*panel
)
1386 proplist_t menu
, pmenu
, plPath
;
1389 gspath
= wusergnusteppath();
1391 menuPath
= wmalloc(strlen(gspath
)+32);
1392 strcpy(menuPath
, gspath
);
1393 strcat(menuPath
, "/Defaults/WMRootMenu");
1395 menu
= PLGetProplistWithPath(menuPath
);
1398 if (!menu
|| !PLIsArray(menu
)) {
1399 if (AskMenuCopy(panel
->win
)) {
1400 panel
->dontSave
= 0;
1403 pmenu
= getDefaultMenu(panel
, &hasWSMenu
);
1405 WMSetPopUpButtonEnabled(panel
->cmd1P
, False
);
1406 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
1407 panel
->dontSave
= 1;
1410 pmenu
= PLMakeArrayFromElements(PLMakeString("Applications"),
1414 pmenu
= preProcessMenu(menu
, &hasWSMenu
);
1416 plPath
= PLMakeString(menuPath
);
1418 PLSetFilename(pmenu
, plPath
);
1424 if (panel
->itemClipboard
) {
1425 PLRelease(panel
->itemClipboard
);
1426 panel
->itemClipboard
= NULL
;
1428 panel
->menu
= pmenu
;
1429 panel
->editedItem
= NULL
;
1430 panel
->capturing
= 0;
1432 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
1433 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
1435 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
1436 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
1438 WMLoadBrowserColumnZero(panel
->browser
);
1440 updateForItemType(panel
, TNothing
);
1445 storeData(_Panel
*panel
)
1449 if (!panel
->unsaved
|| panel
->dontSave
)
1453 menu
= postProcessMenu(panel
->menu
);
1455 PLSetFilename(menu
, PLGetFilename(panel
->menu
));
1464 InitMenu(WMScreen
*scr
, WMWindow
*win
)
1468 panel
= wmalloc(sizeof(_Panel
));
1469 memset(panel
, 0, sizeof(_Panel
));
1471 panel
->sectionName
= _("Applications Menu Definition");
1473 panel
->description
= _("Edit the menu for launching applications.");
1477 panel
->callbacks
.createWidgets
= createPanel
;
1478 panel
->callbacks
.updateDomain
= storeData
;
1480 AddSection(panel
, ICON_FILE
);