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 */
133 static void showData(_Panel
*panel
);
138 isMenu(proplist_t item
)
140 if (PLGetNumberOfElements(item
)==1)
143 return PLIsArray(PLGetArrayElement(item
, 1));
148 splitOpenMenuParameter(char *str
, char **dirs
, char **prog
)
152 if (!(p
= strstr(str
, " WITH "))) {
153 *dirs
= wstrdup(str
);
160 *dirs
= wmalloc(i
-j
+1);
161 strncpy(*dirs
, str
, i
-j
+1);
165 while (isspace(*p
)) p
++;
177 changeItemTitle(proplist_t item
, char *title
)
181 tmp
= PLGetArrayElement(item
, 0);
183 PLRemoveArrayElement(item
, 0);
184 PLInsertArrayElement(item
, title
?PLMakeString(title
):PLMakeString(""), 0);
189 removeParameter(proplist_t item
)
194 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
199 tmp
= PLGetArrayElement(item
, index
);
200 PLRemoveArrayElement(item
, index
);
207 changeItemParameter(proplist_t item
, char *param
)
212 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
217 tmp
= PLGetArrayElement(item
, index
);
218 PLRemoveArrayElement(item
, index
);
220 tmp
= param
?PLMakeString(param
):PLMakeString("");
221 PLInsertArrayElement(item
, tmp
, index
);
226 changeItemShortcut(proplist_t item
, char *shortcut
)
230 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
232 tmp
= PLGetArrayElement(item
, 2);
233 PLRemoveArrayElement(item
, 2);
235 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
237 /* remove SHORTCUT keyword */
238 tmp
= PLGetArrayElement(item
, 1);
239 PLRemoveArrayElement(item
, 1);
241 /* remove the shortcut */
242 tmp
= PLGetArrayElement(item
, 1);
243 PLRemoveArrayElement(item
, 1);
248 PLInsertArrayElement(item
, PLMakeString("SHORTCUT"), 1);
249 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
258 changeItemCommand(proplist_t item
, char *command
)
262 tmp
= PLGetArrayElement(item
, 1);
263 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
265 PLRemoveArrayElement(item
, 3);
266 PLInsertArrayElement(item
, PLMakeString(command
), 3);
269 PLRemoveArrayElement(item
, 1);
270 PLInsertArrayElement(item
, PLMakeString(command
), 1);
276 getItemTitle(proplist_t item
)
278 return PLGetString(PLGetArrayElement(item
, 0));
283 getItemParameter(proplist_t item
)
287 tmp
= PLGetArrayElement(item
, 1);
288 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
289 tmp
= PLGetArrayElement(item
, 4);
290 return tmp
? PLGetString(tmp
) : NULL
;
292 tmp
= PLGetArrayElement(item
, 2);
293 return tmp
? PLGetString(tmp
) : NULL
;
300 getItemShortcut(proplist_t item
)
304 tmp
= PLGetArrayElement(item
, 1);
305 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
306 return PLGetString(PLGetArrayElement(item
, 2));
315 getItemCommand(proplist_t item
)
320 tmp
= PLGetArrayElement(item
, 1);
323 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
324 str
= PLGetString(PLGetArrayElement(item
,3));
326 str
= PLGetString(tmp
);
334 getSubmenuInColumn(_Panel
*panel
, int column
)
344 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
347 list
= WMGetBrowserListInColumn(panel
->browser
, column
- 1);
348 assert(list
!= NULL
);
350 r
= WMGetListSelectedItemRow(list
);
352 parent
= getSubmenuInColumn(panel
, column
- 1);
354 assert(parent
!= NULL
);
356 submenu
= PLGetArrayElement(parent
, r
+ 1);
363 updateForItemType(_Panel
*panel
, int type
)
365 if (type
==TNothing
) {
366 WMUnmapWidget(panel
->labF
);
368 WMMapWidget(panel
->labF
);
370 if (type
==TExternalMenu
|| type
==TNothing
) {
371 WMUnmapWidget(panel
->cmdF
);
373 WMMapWidget(panel
->cmdF
);
375 if (type
==TNothing
|| type
==TWSMenu
|| type
==TExternalMenu
) {
376 WMUnmapWidget(panel
->shoF
);
378 WMMapWidget(panel
->shoF
);
380 if (type
==TExec
|| type
== TShExec
|| type
==TRestart
381 || type
==TExternalMenu
) {
382 WMMapWidget(panel
->proF
);
384 WMUnmapWidget(panel
->proF
);
386 if (type
==TExternalMenu
) {
387 WMMapWidget(panel
->pathF
);
389 WMUnmapWidget(panel
->pathF
);
392 WMMapWidget(panel
->noconfirmB
);
394 WMUnmapWidget(panel
->noconfirmB
);
397 WMMapWidget(panel
->infoL
);
399 WMUnmapWidget(panel
->infoL
);
401 if (type
==TExternalMenu
) {
402 WMMapWidget(panel
->guruB
);
404 WMUnmapWidget(panel
->guruB
);
406 if (type
== TRestart
) {
407 WMSetFrameTitle(panel
->proF
, _("Window Manager"));
408 } else if (type
== TExternalMenu
) {
409 WMSetFrameTitle(panel
->proF
, _("Program to Open Files"));
410 } else if (type
== TShExec
) {
411 WMSetFrameTitle(panel
->proF
, _("Command to Execute"));
413 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
419 getItemOfSelectedEntry(WMBrowser
*bPtr
)
425 i
= WMGetBrowserSelectedColumn(bPtr
);
426 menu
= getSubmenuInColumn((_Panel
*)WMGetHangedData(bPtr
), i
);
428 i
= WMGetBrowserSelectedRowInColumn(bPtr
, i
);
429 item
= PLGetArrayElement(menu
, i
+1);
436 performCommand(WMWidget
*w
, void *data
)
438 _Panel
*panel
= (_Panel
*)data
;
439 WMPopUpButton
*pop
= (WMPopUpButton
*)w
;
440 proplist_t menuItem
= NULL
;
444 static int cmdIndex
=0;
446 Bool removed
= False
;
448 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
449 if (pop
== panel
->cmd2P
) {
453 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
456 menu
= getSubmenuInColumn(panel
, column
);
458 row
= WMGetBrowserSelectedRowInColumn(panel
->browser
, column
);
460 switch (WMGetPopUpButtonSelectedItem(pop
)) {
462 title
= wmalloc(strlen(_("New Command %i"))+6);
463 sprintf(title
, _("New Command %i"), cmdIndex
++);
464 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
465 PLMakeString("EXEC"),
470 title
= wstrdup(_("New Submenu"));
471 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
475 title
= wstrdup(_("External Menu"));
476 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
477 PLMakeString("OPEN_MENU"),
482 title
= wstrdup(_("Workspaces"));
483 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
484 PLMakeString("WORKSPACE_MENU"),
486 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
487 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
492 WMRemoveBrowserItem(panel
->browser
, column
, row
);
493 menuItem
= PLGetArrayElement(menu
, row
+1);
494 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0) {
495 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
496 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
498 PLRemoveArrayElement(menu
, row
+1);
500 updateForItemType(panel
, TNothing
);
501 panel
->editedItem
= NULL
;
503 if (pop
== panel
->cmd1P
) {
504 WMSetTextFieldText(panel
->tit2T
, NULL
);
511 if (panel
->itemClipboard
512 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
513 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
514 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
516 if (panel
->itemClipboard
)
517 PLRelease(panel
->itemClipboard
);
518 WMRemoveBrowserItem(panel
->browser
, column
, row
);
519 menuItem
= PLGetArrayElement(menu
, row
+1);
520 PLRemoveArrayElement(menu
, row
+1);
521 updateForItemType(panel
, TNothing
);
523 panel
->itemClipboard
= menuItem
;
525 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
526 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
533 if (panel
->itemClipboard
534 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
535 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
536 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
538 if (panel
->itemClipboard
)
539 PLRelease(panel
->itemClipboard
);
540 panel
->itemClipboard
= NULL
;
541 menuItem
= PLGetArrayElement(menu
, row
+1);
542 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0)
544 panel
->itemClipboard
= PLDeepCopy(menuItem
);
546 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
547 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
550 menuItem
= panel
->itemClipboard
;
551 title
= wstrdup(getItemTitle(menuItem
));
552 panel
->itemClipboard
= NULL
;
553 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
554 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
559 WMInsertBrowserItem(panel
->browser
, column
, row
, title
, isMenu(menuItem
));
561 PLAppendArrayElement(menu
, menuItem
);
563 PLInsertArrayElement(menu
, menuItem
, row
+1);
568 if (pop
== panel
->cmd1P
) {
569 WMSetTextFieldText(panel
->tit2T
, NULL
);
576 browserClick(WMWidget
*w
, void *data
)
578 _Panel
*panel
= (_Panel
*)data
;
582 /* stop shortcut capture */
583 panel
->capturing
= 0;
585 item
= getItemOfSelectedEntry(panel
->browser
);
587 panel
->editedItem
= item
;
590 WMSetTextFieldText(panel
->labT
, getItemTitle(item
));
593 updateForItemType(panel
, TNothing
);
595 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
598 int column
= WMGetBrowserSelectedColumn(panel
->browser
);
600 if (column
== WMGetBrowserNumberOfColumns(panel
->browser
)-1
602 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
604 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
606 if (column
==WMGetBrowserFirstVisibleColumn(panel
->browser
)) {
607 /* second column is empty, because selected item is not a submenu */
608 WMSetTextFieldText(panel
->tit2T
, NULL
);
612 command
= getItemCommand(item
);
614 WMSetTextFieldText(panel
->shoT
, getItemShortcut(item
));
616 if (strcmp(command
, "OPEN_MENU")==0) {
619 splitOpenMenuParameter(getItemParameter(item
), &p
, &c
);
620 WMSetTextFieldText(panel
->pathT
, p
);
621 WMSetTextFieldText(panel
->proT
, c
);
626 updateForItemType(panel
, TExternalMenu
);
627 } else if (strcmp(command
, "EXEC")==0) {
628 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
629 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExec
);
630 updateForItemType(panel
, TExec
);
631 } else if (strcmp(command
, "SHEXEC")==0) {
632 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
633 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShExec
);
634 updateForItemType(panel
, TShExec
);
635 } else if (strcmp(command
, "WORKSPACE_MENU")==0) {
636 updateForItemType(panel
, TWSMenu
);
637 } else if (strcmp(command
, "EXIT")==0) {
638 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExit
);
639 updateForItemType(panel
, TExit
);
640 } else if (strcmp(command
, "SHUTDOWN")==0) {
641 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShutdown
);
642 updateForItemType(panel
, TExit
);
643 } else if (strcmp(command
, "RESTARTW")==0) {
644 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestartWM
);
645 updateForItemType(panel
, TRestartWM
);
646 } else if (strcmp(command
, "RESTART")==0) {
647 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestart
);
648 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
649 updateForItemType(panel
, TRestart
);
651 /* simple commands */
652 if (strcmp(command
, "ARRANGE_ICONS")==0)
653 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpArrange
);
654 else if (strcmp(command
, "HIDE_OTHERS")==0)
655 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpHide
);
656 else if (strcmp(command
, "SHOW_ALL")==0)
657 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShow
);
658 else if (strcmp(command
, "SAVE_SESSION")==0)
659 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpSaveSession
);
660 else if (strcmp(command
, "CLEAR_SESSION")==0)
661 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpClearSession
);
662 else if (strcmp(command
, "REFRESH")==0)
663 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRefresh
);
664 else if (strcmp(command
, "INFO_PANEL")==0)
665 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpInfo
);
666 else if (strcmp(command
, "LEGAL_PANEL")==0)
667 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpLegal
);
668 updateForItemType(panel
, TSimpleCommand
);
675 fillBrowserColumn(WMBrowser
*bPtr
, int column
)
677 _Panel
*panel
= (_Panel
*)WMGetHangedData(bPtr
);
679 proplist_t menuList
= NULL
;
683 menuList
= getSubmenuInColumn(panel
, column
);
684 assert(menuList
!= NULL
);
686 if (column
> WMGetBrowserFirstVisibleColumn(bPtr
)) {
687 WMSetTextFieldText(panel
->tit2T
, getItemTitle(menuList
));
689 WMSetTextFieldText(panel
->tit1T
, getItemTitle(menuList
));
692 for (i
=1; i
<PLGetNumberOfElements(menuList
); i
++) {
693 menuItem
= PLGetArrayElement(menuList
, i
);
694 WMInsertBrowserItem(bPtr
, column
, -1, getItemTitle(menuItem
),
703 changedItem(void *observerData
, WMNotification
*notification
)
705 _Panel
*panel
= (_Panel
*)observerData
;
706 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
707 proplist_t item
= panel
->editedItem
;
719 command
= getItemCommand(item
);
721 if (t
== panel
->shoT
) {
722 str
= WMGetTextFieldText(t
);
723 if (strlen(str
)==0) {
727 changeItemShortcut(item
, str
);
730 } else if (t
== panel
->labT
) {
733 str
= WMGetTextFieldText(t
);
736 changeItemTitle(item
, str
);
737 column
= WMGetBrowserSelectedColumn(panel
->browser
);
738 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
739 litem
= WMGetListSelectedItem(list
);
744 WMRedisplayWidget(list
);
745 } else if (strcmp(command
, "EXEC")==0
746 || strcmp(command
, "SHEXEC")==0
747 || strcmp(command
, "RESTART")==0) {
748 if (t
== panel
->proT
) {
749 str
= WMGetTextFieldText(t
);
751 changeItemParameter(item
, str
);
755 } else if (strcmp(command
, "OPEN_MENU")==0) {
759 str
= WMGetTextFieldText(panel
->pathT
);
760 str2
= WMGetTextFieldText(panel
->proT
);
761 text
= wmalloc(strlen(str
)+strlen(str2
)+16);
764 if (strlen(str2
)>0) {
765 strcat(text
, " WITH ");
769 changeItemParameter(item
, text
);
777 changedTitle(void *observerData
, WMNotification
*notification
)
779 _Panel
*panel
= (_Panel
*)observerData
;
780 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
786 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
787 if (panel
->tit2T
== t
)
790 menu
= getSubmenuInColumn(panel
, column
);
794 txt
= WMGetTextFieldText(t
);
795 changeItemTitle(menu
, txt
);
800 list
= WMGetBrowserListInColumn(panel
->browser
, column
-1);
801 litem
= WMGetListSelectedItem(list
);
806 WMRedisplayWidget(list
);
815 changedCommand(WMWidget
*w
, void *data
)
817 _Panel
*panel
= (_Panel
*)data
;
822 i
= WMGetPopUpButtonSelectedItem(panel
->cmdP
);
823 changeItemParameter(panel
->editedItem
, "");
826 if (strcmp(getItemCommand(panel
->editedItem
), "EXEC")!=0) {
827 changeItemCommand(panel
->editedItem
, "EXEC");
828 tmp
= WMGetTextFieldText(panel
->proT
);
829 changeItemParameter(panel
->editedItem
, tmp
);
831 updateForItemType(panel
, TExec
);
835 if (strcmp(getItemCommand(panel
->editedItem
), "SHEXEC")!=0) {
836 changeItemCommand(panel
->editedItem
, "SHEXEC");
837 tmp
= WMGetTextFieldText(panel
->proT
);
838 changeItemParameter(panel
->editedItem
, tmp
);
840 updateForItemType(panel
, TShExec
);
844 if (strcmp(getItemCommand(panel
->editedItem
), "ARRANGE_ICONS")!=0) {
845 changeItemCommand(panel
->editedItem
, "ARRANGE_ICONS");
846 updateForItemType(panel
, TSimpleCommand
);
850 if (strcmp(getItemCommand(panel
->editedItem
), "HIDE_OTHERS")!=0) {
851 changeItemCommand(panel
->editedItem
, "HIDE_OTHERS");
852 updateForItemType(panel
, TSimpleCommand
);
856 if (strcmp(getItemCommand(panel
->editedItem
), "SHOW_ALL")!=0) {
857 changeItemCommand(panel
->editedItem
, "SHOW_ALL");
858 updateForItemType(panel
, TSimpleCommand
);
862 if (strcmp(getItemCommand(panel
->editedItem
), "EXIT")!=0) {
863 changeItemCommand(panel
->editedItem
, "EXIT");
864 updateForItemType(panel
, TExit
);
866 if (WMGetButtonSelected(panel
->noconfirmB
))
867 changeItemParameter(panel
->editedItem
, "QUICK");
869 changeItemParameter(panel
->editedItem
, "");
872 if (strcmp(getItemCommand(panel
->editedItem
), "SHUTDOWN")!=0) {
873 changeItemCommand(panel
->editedItem
, "SHUTDOWN");
874 updateForItemType(panel
, TExit
);
876 if (WMGetButtonSelected(panel
->noconfirmB
))
877 changeItemParameter(panel
->editedItem
, "QUICK");
879 changeItemParameter(panel
->editedItem
, "");
882 changeItemCommand(panel
->editedItem
, "RESTARTW");
883 updateForItemType(panel
, TRestartWM
);
886 changeItemCommand(panel
->editedItem
, "RESTART");
887 updateForItemType(panel
, TRestart
);
888 tmp
= WMGetTextFieldText(panel
->proT
);
889 changeItemParameter(panel
->editedItem
, tmp
);
893 if (strcmp(getItemCommand(panel
->editedItem
), "SAVE_SESSION")!=0) {
894 changeItemCommand(panel
->editedItem
, "SAVE_SESSION");
895 updateForItemType(panel
, TSimpleCommand
);
899 if (strcmp(getItemCommand(panel
->editedItem
), "CLEAR_SESSION")!=0) {
900 changeItemCommand(panel
->editedItem
, "CLEAR_SESSION");
901 updateForItemType(panel
, TSimpleCommand
);
905 if (strcmp(getItemCommand(panel
->editedItem
), "REFRESH")!=0) {
906 changeItemCommand(panel
->editedItem
, "REFRESH");
907 updateForItemType(panel
, TSimpleCommand
);
911 if (strcmp(getItemCommand(panel
->editedItem
), "INFO_PANEL")!=0) {
912 changeItemCommand(panel
->editedItem
, "INFO_PANEL");
913 updateForItemType(panel
, TSimpleCommand
);
917 if (strcmp(getItemCommand(panel
->editedItem
), "LEGAL_PANEL")!=0) {
918 changeItemCommand(panel
->editedItem
, "LEGAL_PANEL");
919 updateForItemType(panel
, TSimpleCommand
);
930 captureShortcut(Display
*dpy
, _Panel
*panel
)
937 while (panel
->capturing
) {
938 XAllowEvents(dpy
, AsyncKeyboard
, CurrentTime
);
939 WMNextEvent(dpy
, &ev
);
940 if (ev
.type
==KeyPress
&& ev
.xkey
.keycode
!=0) {
941 ksym
= XKeycodeToKeysym(dpy
, ev
.xkey
.keycode
, 0);
942 if (!IsModifierKey(ksym
)) {
943 key
=XKeysymToString(ksym
);
944 panel
->capturing
= 0;
956 if (ev
.xkey
.state
& ControlMask
) {
957 strcat(buffer
, "Control+");
959 if (ev
.xkey
.state
& ShiftMask
) {
960 strcat(buffer
, "Shift+");
962 if (ev
.xkey
.state
& Mod1Mask
) {
963 strcat(buffer
, "Mod1+");
965 if (ev
.xkey
.state
& Mod2Mask
) {
966 strcat(buffer
, "Mod2+");
968 if (ev
.xkey
.state
& Mod3Mask
) {
969 strcat(buffer
, "Mod3+");
971 if (ev
.xkey
.state
& Mod4Mask
) {
972 strcat(buffer
, "Mod4+");
974 if (ev
.xkey
.state
& Mod5Mask
) {
975 strcat(buffer
, "Mod5+");
979 return wstrdup(buffer
);
984 captureClick(WMWidget
*w
, void *data
)
986 _Panel
*panel
= (_Panel
*)data
;
987 Display
*dpy
= WMScreenDisplay(WMWidgetScreen(panel
->win
));
990 if (!panel
->capturing
) {
991 panel
->capturing
= 1;
992 WMSetButtonText(w
, _("Cancel"));
993 XGrabKeyboard(dpy
, WMWidgetXID(panel
->win
), True
, GrabModeAsync
,
994 GrabModeAsync
, CurrentTime
);
995 shortcut
= captureShortcut(dpy
, panel
);
997 WMSetTextFieldText(panel
->shoT
, shortcut
);
998 changeItemShortcut(panel
->editedItem
, shortcut
);
1003 panel
->capturing
= 0;
1004 WMSetButtonText(w
, _("Capture"));
1005 XUngrabKeyboard(dpy
, CurrentTime
);
1011 scrolledBrowser(void *observerData
, WMNotification
*notification
)
1013 _Panel
*panel
= (_Panel
*)observerData
;
1017 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
1019 item
= getSubmenuInColumn(panel
, column
);
1020 WMSetTextFieldText(panel
->tit1T
, getItemTitle(item
));
1022 item
= getSubmenuInColumn(panel
, column
+ 1);
1024 WMSetTextFieldText(panel
->tit2T
, getItemTitle(item
));
1029 confirmClicked(WMWidget
*w
, void *data
)
1031 _Panel
*panel
= (_Panel
*)data
;
1033 if (WMGetButtonSelected(panel
->noconfirmB
)) {
1034 changeItemParameter(panel
->editedItem
, "QUICK");
1036 changeItemParameter(panel
->editedItem
, "");
1044 openGuru(WMWidget
*w
, void *data
)
1046 _Panel
*panel
= (_Panel
*)data
;
1050 def
= OpenMenuGuru(GetWindow(panel
));
1052 changeItemParameter(panel
->editedItem
, def
);
1053 splitOpenMenuParameter(def
, &path
, &cmd
);
1055 WMSetTextFieldText(panel
->pathT
, path
);
1059 WMSetTextFieldText(panel
->proT
, cmd
);
1068 createPanel(_Panel
*p
)
1070 _Panel
*panel
= (_Panel
*)p
;
1073 panel
->frame
= WMCreateFrame(panel
->win
);
1074 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
1075 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
1077 panel
->cmd1P
= WMCreatePopUpButton(panel
->frame
);
1078 WMSetPopUpButtonAction(panel
->cmd1P
, performCommand
, panel
);
1079 WMResizeWidget(panel
->cmd1P
, 144, 20);
1080 WMMoveWidget(panel
->cmd1P
, 15, 15);
1081 WMSetPopUpButtonPullsDown(panel
->cmd1P
, True
);
1082 WMSetPopUpButtonText(panel
->cmd1P
, _("Commands"));
1083 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Command"));
1084 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Submenu"));
1085 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add External Menu"));
1086 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Workspace Menu"));
1087 WMAddPopUpButtonItem(panel
->cmd1P
, _("Remove Item"));
1088 WMAddPopUpButtonItem(panel
->cmd1P
, _("Cut Item"));
1089 WMAddPopUpButtonItem(panel
->cmd1P
, _("Copy Item"));
1090 WMAddPopUpButtonItem(panel
->cmd1P
, _("Paste Item"));
1092 panel
->cmd2P
= WMCreatePopUpButton(panel
->frame
);
1093 WMSetPopUpButtonAction(panel
->cmd2P
, performCommand
, panel
);
1094 WMResizeWidget(panel
->cmd2P
, 144, 20);
1095 WMMoveWidget(panel
->cmd2P
, 164, 15);
1096 WMSetPopUpButtonPullsDown(panel
->cmd2P
, True
);
1097 WMSetPopUpButtonText(panel
->cmd2P
, _("Commands"));
1098 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Command"));
1099 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Submenu"));
1100 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add External Menu"));
1101 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Workspace Menu"));
1102 WMAddPopUpButtonItem(panel
->cmd2P
, _("Remove Item"));
1103 WMAddPopUpButtonItem(panel
->cmd2P
, _("Cut Item"));
1104 WMAddPopUpButtonItem(panel
->cmd2P
, _("Copy Item"));
1105 WMAddPopUpButtonItem(panel
->cmd2P
, _("Paste Item"));
1107 panel
->tit1T
= WMCreateTextField(panel
->frame
);
1108 WMResizeWidget(panel
->tit1T
, 144, 20);
1109 WMMoveWidget(panel
->tit1T
, 15, 40);
1110 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1113 panel
->tit2T
= WMCreateTextField(panel
->frame
);
1114 WMResizeWidget(panel
->tit2T
, 144, 20);
1115 WMMoveWidget(panel
->tit2T
, 164, 40);
1116 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1119 panel
->browser
= WMCreateBrowser(panel
->frame
);
1120 WMSetBrowserTitled(panel
->browser
, False
);
1121 WMResizeWidget(panel
->browser
, 295, 160);
1122 WMMoveWidget(panel
->browser
, 15, 65);
1123 WMSetBrowserFillColumnProc(panel
->browser
, fillBrowserColumn
);
1124 WMHangData(panel
->browser
, panel
);
1125 WMSetBrowserPathSeparator(panel
->browser
, "\r");
1126 WMSetBrowserAction(panel
->browser
, browserClick
, panel
);
1127 WMAddNotificationObserver(scrolledBrowser
, panel
,
1128 WMBrowserDidScrollNotification
, panel
->browser
);
1131 panel
->labF
= WMCreateFrame(panel
->frame
);
1132 WMResizeWidget(panel
->labF
, 190, 50);
1133 WMMoveWidget(panel
->labF
, 320, 10);
1134 WMSetFrameTitle(panel
->labF
, _("Label"));
1136 panel
->labT
= WMCreateTextField(panel
->labF
);
1137 WMResizeWidget(panel
->labT
, 170, 20);
1138 WMMoveWidget(panel
->labT
, 10, 20);
1139 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1142 WMMapSubwidgets(panel
->labF
);
1144 panel
->cmdF
= WMCreateFrame(panel
->frame
);
1145 WMResizeWidget(panel
->cmdF
, 190, 50);
1146 WMMoveWidget(panel
->cmdF
, 320, 65);
1147 WMSetFrameTitle(panel
->cmdF
, _("Command"));
1149 panel
->cmdP
= WMCreatePopUpButton(panel
->cmdF
);
1150 WMResizeWidget(panel
->cmdP
, 170, 20);
1151 WMMoveWidget(panel
->cmdP
, 10, 20);
1152 WMAddPopUpButtonItem(panel
->cmdP
, _("Run Program"));
1153 WMAddPopUpButtonItem(panel
->cmdP
, _("Execute Shell Command"));
1154 WMAddPopUpButtonItem(panel
->cmdP
, _("Arrange Icons"));
1155 WMAddPopUpButtonItem(panel
->cmdP
, _("Hide Others"));
1156 WMAddPopUpButtonItem(panel
->cmdP
, _("Show All Windows"));
1157 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit WindowMaker"));
1158 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit X Session"));
1159 WMAddPopUpButtonItem(panel
->cmdP
, _("Start Window Manager"));
1160 WMAddPopUpButtonItem(panel
->cmdP
, _("Restart WindowMaker"));
1161 WMAddPopUpButtonItem(panel
->cmdP
, _("Save Session"));
1162 WMAddPopUpButtonItem(panel
->cmdP
, _("Clear Session"));
1163 WMAddPopUpButtonItem(panel
->cmdP
, _("Refresh Screen"));
1164 WMAddPopUpButtonItem(panel
->cmdP
, _("Info Panel"));
1165 WMAddPopUpButtonItem(panel
->cmdP
, _("Legal Panel"));
1166 WMSetPopUpButtonAction(panel
->cmdP
, changedCommand
, panel
);
1168 WMMapSubwidgets(panel
->cmdF
);
1170 panel
->infoL
= WMCreateLabel(panel
->frame
);
1171 WMResizeWidget(panel
->infoL
, 190, 50);
1172 WMMoveWidget(panel
->infoL
, 320, 65);
1173 WMSetLabelText(panel
->infoL
, _("Open workspace menu"));
1174 WMSetLabelRelief(panel
->infoL
, WRGroove
);
1175 WMSetLabelTextAlignment(panel
->infoL
, WACenter
);
1177 panel
->noconfirmB
= WMCreateSwitchButton(panel
->frame
);
1178 WMResizeWidget(panel
->noconfirmB
, 190, 50);
1179 WMMoveWidget(panel
->noconfirmB
, 320, 120);
1180 WMSetButtonText(panel
->noconfirmB
, _("No confirmation panel"));
1181 WMSetButtonAction(panel
->noconfirmB
, confirmClicked
, panel
);
1183 panel
->pathF
= WMCreateFrame(panel
->frame
);
1184 WMResizeWidget(panel
->pathF
, 190, 50);
1185 WMMoveWidget(panel
->pathF
, 320, 65);
1186 WMSetFrameTitle(panel
->pathF
, _("Menu Path/Directory List"));
1188 panel
->pathT
= WMCreateTextField(panel
->pathF
);
1189 WMResizeWidget(panel
->pathT
, 170, 20);
1190 WMMoveWidget(panel
->pathT
, 10, 20);
1191 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1194 WMMapSubwidgets(panel
->pathF
);
1196 panel
->proF
= WMCreateFrame(panel
->frame
);
1197 WMResizeWidget(panel
->proF
, 190, 50);
1198 WMMoveWidget(panel
->proF
, 320, 120);
1199 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
1201 panel
->proT
= WMCreateTextField(panel
->proF
);
1202 WMResizeWidget(panel
->proT
, 170, 20);
1203 WMMoveWidget(panel
->proT
, 10, 20);
1204 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1207 WMMapSubwidgets(panel
->proF
);
1209 panel
->shoF
= WMCreateFrame(panel
->frame
);
1210 WMResizeWidget(panel
->shoF
, 190, 50);
1211 WMMoveWidget(panel
->shoF
, 320, 175);
1212 WMSetFrameTitle(panel
->shoF
, _("Shortcut"));
1214 panel
->shoT
= WMCreateTextField(panel
->shoF
);
1215 WMResizeWidget(panel
->shoT
, 95, 20);
1216 WMMoveWidget(panel
->shoT
, 10, 20);
1217 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1220 panel
->shoB
= WMCreateCommandButton(panel
->shoF
);
1221 WMResizeWidget(panel
->shoB
, 70, 24);
1222 WMMoveWidget(panel
->shoB
, 110, 18);
1223 WMSetButtonText(panel
->shoB
, _("Capture"));
1224 WMSetButtonAction(panel
->shoB
, captureClick
, panel
);
1226 WMMapSubwidgets(panel
->shoF
);
1228 panel
->guruB
= WMCreateCommandButton(panel
->frame
);
1229 WMResizeWidget(panel
->guruB
, 180, 24);
1230 WMMoveWidget(panel
->guruB
, 325, 190);
1231 WMSetButtonText(panel
->guruB
, _("Ask help to the Guru"));
1232 WMSetButtonAction(panel
->guruB
, openGuru
, panel
);
1234 WMRealizeWidget(panel
->frame
);
1235 WMMapSubwidgets(panel
->frame
);
1244 preProcessMenu(proplist_t menu
, int *hasWSMenu
)
1250 pmenu
= PLDeepCopy(menu
);
1251 if (PLGetNumberOfElements(pmenu
)==1) {
1254 for (i
=1; i
<PLGetNumberOfElements(pmenu
); i
++) {
1255 item
= PLGetArrayElement(pmenu
, i
);
1257 PLInsertArrayElement(pmenu
, preProcessMenu(item
, hasWSMenu
), i
);
1258 PLRemoveArrayElement(pmenu
, i
+1);
1260 } else if (strcmp(getItemCommand(item
), "RESTART")==0) {
1261 if (getItemShortcut(item
)) {
1262 if (PLGetNumberOfElements(item
) == 4) {
1263 changeItemCommand(item
, "RESTARTW");
1264 PLAppendArrayElement(item
, PLMakeString(""));
1267 if (PLGetNumberOfElements(item
) == 2) {
1268 changeItemCommand(item
, "RESTARTW");
1269 PLAppendArrayElement(item
, PLMakeString(""));
1273 if (strcmp(getItemCommand(item
),"WORKSPACE_MENU")==0)
1275 if (getItemShortcut(item
)) {
1276 if (PLGetNumberOfElements(item
) == 4)
1277 PLAppendArrayElement(item
, PLMakeString(""));
1279 if (PLGetNumberOfElements(item
) == 2)
1280 PLAppendArrayElement(item
, PLMakeString(""));
1291 postProcessMenu(proplist_t menu
)
1298 pmenu
= PLDeepCopy(menu
);
1299 if (PLGetNumberOfElements(pmenu
)==1) {
1302 count
= PLGetNumberOfElements(pmenu
);
1303 for (i
=1; i
<count
; i
++) {
1305 item
= PLGetArrayElement(pmenu
, i
);
1307 PLInsertArrayElement(pmenu
, postProcessMenu(item
), i
);
1308 PLRemoveArrayElement(pmenu
, i
+1);
1311 cmd
= getItemCommand(item
);
1312 if (strcmp(cmd
, "RESTARTW")==0) {
1313 changeItemCommand(item
, "RESTART");
1314 removeParameter(item
);
1315 } else if (strcmp(cmd
, "EXEC")==0 || strcmp(cmd
, "OPEN_MENU")==0) {
1317 } else if (strcmp(cmd
, "RESTART")==0 || strcmp(cmd
, "SHUTDOWN")==0
1318 || strcmp(cmd
, "EXIT")==0) {
1319 char *tmp
= getItemParameter(item
);
1320 if (tmp
&& strlen(tmp
)==0)
1321 removeParameter(item
);
1323 removeParameter(item
);
1333 getDefaultMenu(_Panel
*panel
, int *hasWSMenu
)
1335 proplist_t menu
, pmenu
;
1336 char *menuPath
, *gspath
;
1338 gspath
= wusergnusteppath();
1340 menuPath
= wmalloc(strlen(gspath
)+128);
1341 /* if there is a localized plmenu for the tongue put it's filename here */
1342 sprintf(menuPath
, _("%s/Library/WindowMaker/plmenu"), gspath
);
1344 menu
= PLGetProplistWithPath(menuPath
);
1346 wwarning("%s:could not read property list menu", menuPath
);
1348 if (strcmp("%s/Library/WindowMaker/plmenu",
1349 _("%s/Library/WindowMaker/plmenu"))!=0) {
1351 sprintf(menuPath
, "%s/Library/WindowMaker/plmenu", gspath
);
1352 menu
= PLGetProplistWithPath(menuPath
);
1353 wwarning("%s:could not read property list menu", menuPath
);
1358 sprintf(buffer
, _("Could not open default menu from '%s'"),
1360 WMRunAlertPanel(WMWidgetScreen(panel
->win
), panel
->win
,
1361 _("Error"), buffer
, _("OK"), NULL
, NULL
);
1368 pmenu
= preProcessMenu(menu
, hasWSMenu
);
1379 showData(_Panel
*panel
)
1383 proplist_t menu
, pmenu
, plPath
;
1386 gspath
= wusergnusteppath();
1388 menuPath
= wmalloc(strlen(gspath
)+32);
1389 strcpy(menuPath
, gspath
);
1390 strcat(menuPath
, "/Defaults/WMRootMenu");
1392 menu
= PLGetProplistWithPath(menuPath
);
1395 if (!menu
|| !PLIsArray(menu
)) {
1396 if (AskMenuCopy(panel
->win
)) {
1397 panel
->dontSave
= 0;
1400 pmenu
= getDefaultMenu(panel
, &hasWSMenu
);
1402 WMSetPopUpButtonEnabled(panel
->cmd1P
, False
);
1403 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
1404 panel
->dontSave
= 1;
1407 pmenu
= PLMakeArrayFromElements(PLMakeString("Applications"),
1411 pmenu
= preProcessMenu(menu
, &hasWSMenu
);
1413 plPath
= PLMakeString(menuPath
);
1415 PLSetFilename(pmenu
, plPath
);
1421 if (panel
->itemClipboard
) {
1422 PLRelease(panel
->itemClipboard
);
1423 panel
->itemClipboard
= NULL
;
1425 panel
->menu
= pmenu
;
1426 panel
->editedItem
= NULL
;
1427 panel
->capturing
= 0;
1429 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
1430 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
1432 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
1433 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
1435 WMLoadBrowserColumnZero(panel
->browser
);
1437 updateForItemType(panel
, TNothing
);
1442 storeData(_Panel
*panel
)
1446 if (!panel
->unsaved
|| panel
->dontSave
)
1450 menu
= postProcessMenu(panel
->menu
);
1452 PLSetFilename(menu
, PLGetFilename(panel
->menu
));
1461 InitMenu(WMScreen
*scr
, WMWindow
*win
)
1465 panel
= wmalloc(sizeof(_Panel
));
1466 memset(panel
, 0, sizeof(_Panel
));
1468 panel
->sectionName
= _("Applications Menu Definition");
1472 panel
->callbacks
.createWidgets
= createPanel
;
1473 panel
->callbacks
.updateDomain
= storeData
;
1475 AddSection(panel
, ICON_FILE
);