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
);
137 static void fillBrowser(WMBrowserDelegate
*self
, WMBrowser
*bPtr
, int column
,
140 static void scrolledBrowser(WMBrowserDelegate
*self
, WMBrowser
*sender
);
142 static WMBrowserDelegate browserDelegate
= {
144 fillBrowser
, /* createRowsForColumn */
145 NULL
, /* titleOfColumn */
146 scrolledBrowser
, /* didScroll */
147 NULL
/* willScroll */
152 isMenu(proplist_t item
)
154 if (PLGetNumberOfElements(item
)==1)
157 return PLIsArray(PLGetArrayElement(item
, 1));
162 splitOpenMenuParameter(char *str
, char **dirs
, char **prog
)
166 if (!(p
= strstr(str
, " WITH "))) {
167 *dirs
= wstrdup(str
);
174 *dirs
= wmalloc(i
-j
+1);
175 strncpy(*dirs
, str
, i
-j
+1);
179 while (isspace(*p
)) p
++;
191 changeItemTitle(proplist_t item
, char *title
)
195 tmp
= PLGetArrayElement(item
, 0);
197 PLRemoveArrayElement(item
, 0);
198 PLInsertArrayElement(item
, title
?PLMakeString(title
):PLMakeString(""), 0);
203 removeParameter(proplist_t item
)
208 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
213 tmp
= PLGetArrayElement(item
, index
);
214 PLRemoveArrayElement(item
, index
);
221 changeItemParameter(proplist_t item
, char *param
)
226 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
231 tmp
= PLGetArrayElement(item
, index
);
232 PLRemoveArrayElement(item
, index
);
234 tmp
= param
?PLMakeString(param
):PLMakeString("");
235 PLInsertArrayElement(item
, tmp
, index
);
240 changeItemShortcut(proplist_t item
, char *shortcut
)
244 if (strcmp(PLGetString(PLGetArrayElement(item
, 1)), "SHORTCUT")==0) {
246 tmp
= PLGetArrayElement(item
, 2);
247 PLRemoveArrayElement(item
, 2);
249 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
251 /* remove SHORTCUT keyword */
252 tmp
= PLGetArrayElement(item
, 1);
253 PLRemoveArrayElement(item
, 1);
255 /* remove the shortcut */
256 tmp
= PLGetArrayElement(item
, 1);
257 PLRemoveArrayElement(item
, 1);
262 PLInsertArrayElement(item
, PLMakeString("SHORTCUT"), 1);
263 PLInsertArrayElement(item
, PLMakeString(shortcut
), 2);
272 changeItemCommand(proplist_t item
, char *command
)
276 tmp
= PLGetArrayElement(item
, 1);
277 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
279 PLRemoveArrayElement(item
, 3);
280 PLInsertArrayElement(item
, PLMakeString(command
), 3);
283 PLRemoveArrayElement(item
, 1);
284 PLInsertArrayElement(item
, PLMakeString(command
), 1);
290 getItemTitle(proplist_t item
)
292 return PLGetString(PLGetArrayElement(item
, 0));
297 getItemParameter(proplist_t item
)
301 tmp
= PLGetArrayElement(item
, 1);
302 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
303 tmp
= PLGetArrayElement(item
, 4);
304 return tmp
? PLGetString(tmp
) : NULL
;
306 tmp
= PLGetArrayElement(item
, 2);
307 return tmp
? PLGetString(tmp
) : NULL
;
314 getItemShortcut(proplist_t item
)
318 tmp
= PLGetArrayElement(item
, 1);
319 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
320 return PLGetString(PLGetArrayElement(item
, 2));
329 getItemCommand(proplist_t item
)
334 tmp
= PLGetArrayElement(item
, 1);
337 if (strcmp(PLGetString(tmp
), "SHORTCUT")==0) {
338 str
= PLGetString(PLGetArrayElement(item
,3));
340 str
= PLGetString(tmp
);
348 getSubmenuInColumn(_Panel
*panel
, int column
)
358 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
361 list
= WMGetBrowserListInColumn(panel
->browser
, column
- 1);
362 assert(list
!= NULL
);
364 r
= WMGetListSelectedItemRow(list
);
366 parent
= getSubmenuInColumn(panel
, column
- 1);
368 assert(parent
!= NULL
);
370 submenu
= PLGetArrayElement(parent
, r
+ 1);
377 updateForItemType(_Panel
*panel
, int type
)
379 if (type
==TNothing
) {
380 WMUnmapWidget(panel
->labF
);
382 WMMapWidget(panel
->labF
);
384 if (type
==TExternalMenu
|| type
==TNothing
) {
385 WMUnmapWidget(panel
->cmdF
);
387 WMMapWidget(panel
->cmdF
);
389 if (type
==TNothing
|| type
==TWSMenu
|| type
==TExternalMenu
) {
390 WMUnmapWidget(panel
->shoF
);
392 WMMapWidget(panel
->shoF
);
394 if (type
==TExec
|| type
== TShExec
|| type
==TRestart
395 || type
==TExternalMenu
) {
396 WMMapWidget(panel
->proF
);
398 WMUnmapWidget(panel
->proF
);
400 if (type
==TExternalMenu
) {
401 WMMapWidget(panel
->pathF
);
403 WMUnmapWidget(panel
->pathF
);
406 WMMapWidget(panel
->noconfirmB
);
408 WMUnmapWidget(panel
->noconfirmB
);
411 WMMapWidget(panel
->infoL
);
413 WMUnmapWidget(panel
->infoL
);
415 if (type
==TExternalMenu
) {
416 WMMapWidget(panel
->guruB
);
418 WMUnmapWidget(panel
->guruB
);
420 if (type
== TRestart
) {
421 WMSetFrameTitle(panel
->proF
, _("Window Manager"));
422 } else if (type
== TExternalMenu
) {
423 WMSetFrameTitle(panel
->proF
, _("Program to Open Files"));
424 } else if (type
== TShExec
) {
425 WMSetFrameTitle(panel
->proF
, _("Command to Execute"));
427 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
433 getItemOfSelectedEntry(WMBrowser
*bPtr
)
439 i
= WMGetBrowserSelectedColumn(bPtr
);
440 menu
= getSubmenuInColumn((_Panel
*)WMGetHangedData(bPtr
), i
);
442 i
= WMGetBrowserSelectedRowInColumn(bPtr
, i
);
443 item
= PLGetArrayElement(menu
, i
+1);
450 performCommand(WMWidget
*w
, void *data
)
452 _Panel
*panel
= (_Panel
*)data
;
453 WMPopUpButton
*pop
= (WMPopUpButton
*)w
;
454 proplist_t menuItem
= NULL
;
458 static int cmdIndex
=0;
460 Bool removed
= False
;
462 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
463 if (pop
== panel
->cmd2P
) {
467 if (column
>= WMGetBrowserNumberOfColumns(panel
->browser
))
470 menu
= getSubmenuInColumn(panel
, column
);
472 row
= WMGetBrowserSelectedRowInColumn(panel
->browser
, column
);
474 switch (WMGetPopUpButtonSelectedItem(pop
)) {
476 title
= wmalloc(strlen(_("New Command %i"))+6);
477 sprintf(title
, _("New Command %i"), cmdIndex
++);
478 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
479 PLMakeString("EXEC"),
484 title
= wstrdup(_("New Submenu"));
485 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
489 title
= wstrdup(_("External Menu"));
490 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
491 PLMakeString("OPEN_MENU"),
496 title
= wstrdup(_("Workspaces"));
497 menuItem
= PLMakeArrayFromElements(PLMakeString(title
),
498 PLMakeString("WORKSPACE_MENU"),
500 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
501 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
506 WMRemoveBrowserItem(panel
->browser
, column
, row
);
507 menuItem
= PLGetArrayElement(menu
, row
+1);
508 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0) {
509 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
510 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
512 PLRemoveArrayElement(menu
, row
+1);
514 updateForItemType(panel
, TNothing
);
515 panel
->editedItem
= NULL
;
517 if (pop
== panel
->cmd1P
) {
518 WMSetTextFieldText(panel
->tit2T
, NULL
);
525 if (panel
->itemClipboard
526 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
527 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
528 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
530 if (panel
->itemClipboard
)
531 PLRelease(panel
->itemClipboard
);
532 WMRemoveBrowserItem(panel
->browser
, column
, row
);
533 menuItem
= PLGetArrayElement(menu
, row
+1);
534 PLRemoveArrayElement(menu
, row
+1);
535 updateForItemType(panel
, TNothing
);
537 panel
->itemClipboard
= menuItem
;
539 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
540 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
547 if (panel
->itemClipboard
548 && strcmp(getItemCommand(panel
->itemClipboard
), "WORKSPACE_MENU")==0){
549 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, True
);
550 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, True
);
552 if (panel
->itemClipboard
)
553 PLRelease(panel
->itemClipboard
);
554 panel
->itemClipboard
= NULL
;
555 menuItem
= PLGetArrayElement(menu
, row
+1);
556 if (strcmp(getItemCommand(menuItem
), "WORKSPACE_MENU")==0)
558 panel
->itemClipboard
= PLDeepCopy(menuItem
);
560 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, True
);
561 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, True
);
564 menuItem
= panel
->itemClipboard
;
565 title
= wstrdup(getItemTitle(menuItem
));
566 panel
->itemClipboard
= NULL
;
567 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
568 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
573 WMInsertBrowserItem(panel
->browser
, column
, row
, title
, isMenu(menuItem
));
575 PLAppendArrayElement(menu
, menuItem
);
577 PLInsertArrayElement(menu
, menuItem
, row
+1);
582 if (pop
== panel
->cmd1P
) {
583 WMSetTextFieldText(panel
->tit2T
, NULL
);
590 browserClick(WMWidget
*w
, void *data
)
592 _Panel
*panel
= (_Panel
*)data
;
596 /* stop shortcut capture */
597 panel
->capturing
= 0;
599 item
= getItemOfSelectedEntry(panel
->browser
);
601 panel
->editedItem
= item
;
604 WMSetTextFieldText(panel
->labT
, getItemTitle(item
));
607 updateForItemType(panel
, TNothing
);
609 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
612 int column
= WMGetBrowserSelectedColumn(panel
->browser
);
614 if (column
== WMGetBrowserNumberOfColumns(panel
->browser
)-1
616 WMSetPopUpButtonEnabled(panel
->cmd2P
, True
);
618 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
620 if (column
==WMGetBrowserFirstVisibleColumn(panel
->browser
)) {
621 /* second column is empty, because selected item is not a submenu */
622 WMSetTextFieldText(panel
->tit2T
, NULL
);
626 command
= getItemCommand(item
);
628 WMSetTextFieldText(panel
->shoT
, getItemShortcut(item
));
630 if (strcmp(command
, "OPEN_MENU")==0) {
633 splitOpenMenuParameter(getItemParameter(item
), &p
, &c
);
634 WMSetTextFieldText(panel
->pathT
, p
);
635 WMSetTextFieldText(panel
->proT
, c
);
640 updateForItemType(panel
, TExternalMenu
);
641 } else if (strcmp(command
, "EXEC")==0) {
642 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
643 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExec
);
644 updateForItemType(panel
, TExec
);
645 } else if (strcmp(command
, "SHEXEC")==0) {
646 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
647 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShExec
);
648 updateForItemType(panel
, TShExec
);
649 } else if (strcmp(command
, "WORKSPACE_MENU")==0) {
650 updateForItemType(panel
, TWSMenu
);
651 } else if (strcmp(command
, "EXIT")==0) {
652 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpExit
);
653 updateForItemType(panel
, TExit
);
654 } else if (strcmp(command
, "SHUTDOWN")==0) {
655 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShutdown
);
656 updateForItemType(panel
, TExit
);
657 } else if (strcmp(command
, "RESTARTW")==0) {
658 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestartWM
);
659 updateForItemType(panel
, TRestartWM
);
660 } else if (strcmp(command
, "RESTART")==0) {
661 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRestart
);
662 WMSetTextFieldText(panel
->proT
, getItemParameter(item
));
663 updateForItemType(panel
, TRestart
);
665 /* simple commands */
666 if (strcmp(command
, "ARRANGE_ICONS")==0)
667 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpArrange
);
668 else if (strcmp(command
, "HIDE_OTHERS")==0)
669 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpHide
);
670 else if (strcmp(command
, "SHOW_ALL")==0)
671 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpShow
);
672 else if (strcmp(command
, "SAVE_SESSION")==0)
673 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpSaveSession
);
674 else if (strcmp(command
, "CLEAR_SESSION")==0)
675 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpClearSession
);
676 else if (strcmp(command
, "REFRESH")==0)
677 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpRefresh
);
678 else if (strcmp(command
, "INFO_PANEL")==0)
679 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpInfo
);
680 else if (strcmp(command
, "LEGAL_PANEL")==0)
681 WMSetPopUpButtonSelectedItem(panel
->cmdP
, CpLegal
);
682 updateForItemType(panel
, TSimpleCommand
);
689 fillBrowser(WMBrowserDelegate
*self
, WMBrowser
*bPtr
, int column
, WMList
*list
)
691 _Panel
*panel
= (_Panel
*)WMGetHangedData(bPtr
);
693 proplist_t menuList
= NULL
;
697 menuList
= getSubmenuInColumn(panel
, column
);
698 assert(menuList
!= NULL
);
700 if (column
> WMGetBrowserFirstVisibleColumn(bPtr
)) {
701 WMSetTextFieldText(panel
->tit2T
, getItemTitle(menuList
));
703 WMSetTextFieldText(panel
->tit1T
, getItemTitle(menuList
));
706 for (i
=1; i
<PLGetNumberOfElements(menuList
); i
++) {
707 menuItem
= PLGetArrayElement(menuList
, i
);
708 WMInsertBrowserItem(bPtr
, column
, -1, getItemTitle(menuItem
),
717 changedItem(void *observerData
, WMNotification
*notification
)
719 _Panel
*panel
= (_Panel
*)observerData
;
720 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
721 proplist_t item
= panel
->editedItem
;
733 command
= getItemCommand(item
);
735 if (t
== panel
->shoT
) {
736 str
= WMGetTextFieldText(t
);
737 if (strlen(str
)==0) {
741 changeItemShortcut(item
, str
);
744 } else if (t
== panel
->labT
) {
747 str
= WMGetTextFieldText(t
);
750 changeItemTitle(item
, str
);
751 column
= WMGetBrowserSelectedColumn(panel
->browser
);
752 list
= WMGetBrowserListInColumn(panel
->browser
, column
);
753 litem
= WMGetListSelectedItem(list
);
758 WMRedisplayWidget(list
);
759 } else if (strcmp(command
, "EXEC")==0
760 || strcmp(command
, "SHEXEC")==0
761 || strcmp(command
, "RESTART")==0) {
762 if (t
== panel
->proT
) {
763 str
= WMGetTextFieldText(t
);
765 changeItemParameter(item
, str
);
769 } else if (strcmp(command
, "OPEN_MENU")==0) {
773 str
= WMGetTextFieldText(panel
->pathT
);
774 str2
= WMGetTextFieldText(panel
->proT
);
775 text
= wmalloc(strlen(str
)+strlen(str2
)+16);
778 if (strlen(str2
)>0) {
779 strcat(text
, " WITH ");
783 changeItemParameter(item
, text
);
791 changedTitle(void *observerData
, WMNotification
*notification
)
793 _Panel
*panel
= (_Panel
*)observerData
;
794 WMTextField
*t
= (WMTextField
*)WMGetNotificationObject(notification
);
800 column
= WMGetBrowserFirstVisibleColumn(panel
->browser
);
801 if (panel
->tit2T
== t
)
804 menu
= getSubmenuInColumn(panel
, column
);
808 txt
= WMGetTextFieldText(t
);
809 changeItemTitle(menu
, txt
);
814 list
= WMGetBrowserListInColumn(panel
->browser
, column
-1);
815 litem
= WMGetListSelectedItem(list
);
820 WMRedisplayWidget(list
);
829 changedCommand(WMWidget
*w
, void *data
)
831 _Panel
*panel
= (_Panel
*)data
;
836 i
= WMGetPopUpButtonSelectedItem(panel
->cmdP
);
837 changeItemParameter(panel
->editedItem
, "");
840 if (strcmp(getItemCommand(panel
->editedItem
), "EXEC")!=0) {
841 changeItemCommand(panel
->editedItem
, "EXEC");
842 tmp
= WMGetTextFieldText(panel
->proT
);
843 changeItemParameter(panel
->editedItem
, tmp
);
845 updateForItemType(panel
, TExec
);
849 if (strcmp(getItemCommand(panel
->editedItem
), "SHEXEC")!=0) {
850 changeItemCommand(panel
->editedItem
, "SHEXEC");
851 tmp
= WMGetTextFieldText(panel
->proT
);
852 changeItemParameter(panel
->editedItem
, tmp
);
854 updateForItemType(panel
, TShExec
);
858 if (strcmp(getItemCommand(panel
->editedItem
), "ARRANGE_ICONS")!=0) {
859 changeItemCommand(panel
->editedItem
, "ARRANGE_ICONS");
860 updateForItemType(panel
, TSimpleCommand
);
864 if (strcmp(getItemCommand(panel
->editedItem
), "HIDE_OTHERS")!=0) {
865 changeItemCommand(panel
->editedItem
, "HIDE_OTHERS");
866 updateForItemType(panel
, TSimpleCommand
);
870 if (strcmp(getItemCommand(panel
->editedItem
), "SHOW_ALL")!=0) {
871 changeItemCommand(panel
->editedItem
, "SHOW_ALL");
872 updateForItemType(panel
, TSimpleCommand
);
876 if (strcmp(getItemCommand(panel
->editedItem
), "EXIT")!=0) {
877 changeItemCommand(panel
->editedItem
, "EXIT");
878 updateForItemType(panel
, TExit
);
880 if (WMGetButtonSelected(panel
->noconfirmB
))
881 changeItemParameter(panel
->editedItem
, "QUICK");
883 changeItemParameter(panel
->editedItem
, "");
886 if (strcmp(getItemCommand(panel
->editedItem
), "SHUTDOWN")!=0) {
887 changeItemCommand(panel
->editedItem
, "SHUTDOWN");
888 updateForItemType(panel
, TExit
);
890 if (WMGetButtonSelected(panel
->noconfirmB
))
891 changeItemParameter(panel
->editedItem
, "QUICK");
893 changeItemParameter(panel
->editedItem
, "");
896 changeItemCommand(panel
->editedItem
, "RESTARTW");
897 updateForItemType(panel
, TRestartWM
);
900 changeItemCommand(panel
->editedItem
, "RESTART");
901 updateForItemType(panel
, TRestart
);
902 tmp
= WMGetTextFieldText(panel
->proT
);
903 changeItemParameter(panel
->editedItem
, tmp
);
907 if (strcmp(getItemCommand(panel
->editedItem
), "SAVE_SESSION")!=0) {
908 changeItemCommand(panel
->editedItem
, "SAVE_SESSION");
909 updateForItemType(panel
, TSimpleCommand
);
913 if (strcmp(getItemCommand(panel
->editedItem
), "CLEAR_SESSION")!=0) {
914 changeItemCommand(panel
->editedItem
, "CLEAR_SESSION");
915 updateForItemType(panel
, TSimpleCommand
);
919 if (strcmp(getItemCommand(panel
->editedItem
), "REFRESH")!=0) {
920 changeItemCommand(panel
->editedItem
, "REFRESH");
921 updateForItemType(panel
, TSimpleCommand
);
925 if (strcmp(getItemCommand(panel
->editedItem
), "INFO_PANEL")!=0) {
926 changeItemCommand(panel
->editedItem
, "INFO_PANEL");
927 updateForItemType(panel
, TSimpleCommand
);
931 if (strcmp(getItemCommand(panel
->editedItem
), "LEGAL_PANEL")!=0) {
932 changeItemCommand(panel
->editedItem
, "LEGAL_PANEL");
933 updateForItemType(panel
, TSimpleCommand
);
944 captureShortcut(Display
*dpy
, _Panel
*panel
)
951 while (panel
->capturing
) {
952 XAllowEvents(dpy
, AsyncKeyboard
, CurrentTime
);
953 WMNextEvent(dpy
, &ev
);
954 if (ev
.type
==KeyPress
&& ev
.xkey
.keycode
!=0) {
955 ksym
= XKeycodeToKeysym(dpy
, ev
.xkey
.keycode
, 0);
956 if (!IsModifierKey(ksym
)) {
957 key
=XKeysymToString(ksym
);
958 panel
->capturing
= 0;
970 if (ev
.xkey
.state
& ControlMask
) {
971 strcat(buffer
, "Control+");
973 if (ev
.xkey
.state
& ShiftMask
) {
974 strcat(buffer
, "Shift+");
976 if (ev
.xkey
.state
& Mod1Mask
) {
977 strcat(buffer
, "Mod1+");
979 if (ev
.xkey
.state
& Mod2Mask
) {
980 strcat(buffer
, "Mod2+");
982 if (ev
.xkey
.state
& Mod3Mask
) {
983 strcat(buffer
, "Mod3+");
985 if (ev
.xkey
.state
& Mod4Mask
) {
986 strcat(buffer
, "Mod4+");
988 if (ev
.xkey
.state
& Mod5Mask
) {
989 strcat(buffer
, "Mod5+");
993 return wstrdup(buffer
);
998 captureClick(WMWidget
*w
, void *data
)
1000 _Panel
*panel
= (_Panel
*)data
;
1001 Display
*dpy
= WMScreenDisplay(WMWidgetScreen(panel
->win
));
1004 if (!panel
->capturing
) {
1005 panel
->capturing
= 1;
1006 WMSetButtonText(w
, _("Cancel"));
1007 XGrabKeyboard(dpy
, WMWidgetXID(panel
->win
), True
, GrabModeAsync
,
1008 GrabModeAsync
, CurrentTime
);
1009 shortcut
= captureShortcut(dpy
, panel
);
1011 WMSetTextFieldText(panel
->shoT
, shortcut
);
1012 changeItemShortcut(panel
->editedItem
, shortcut
);
1017 panel
->capturing
= 0;
1018 WMSetButtonText(w
, _("Capture"));
1019 XUngrabKeyboard(dpy
, CurrentTime
);
1025 scrolledBrowser(WMBrowserDelegate
*self
, WMBrowser
*sender
)
1027 _Panel
*panel
= (_Panel
*)self
->data
;
1031 column
= WMGetBrowserFirstVisibleColumn(sender
);
1033 item
= getSubmenuInColumn(panel
, column
);
1034 WMSetTextFieldText(panel
->tit1T
, getItemTitle(item
));
1036 item
= getSubmenuInColumn(panel
, column
+ 1);
1038 WMSetTextFieldText(panel
->tit2T
, getItemTitle(item
));
1043 confirmClicked(WMWidget
*w
, void *data
)
1045 _Panel
*panel
= (_Panel
*)data
;
1047 if (WMGetButtonSelected(panel
->noconfirmB
)) {
1048 changeItemParameter(panel
->editedItem
, "QUICK");
1050 changeItemParameter(panel
->editedItem
, "");
1058 openGuru(WMWidget
*w
, void *data
)
1060 _Panel
*panel
= (_Panel
*)data
;
1064 def
= OpenMenuGuru(GetWindow(panel
));
1066 changeItemParameter(panel
->editedItem
, def
);
1067 splitOpenMenuParameter(def
, &path
, &cmd
);
1069 WMSetTextFieldText(panel
->pathT
, path
);
1073 WMSetTextFieldText(panel
->proT
, cmd
);
1082 createPanel(_Panel
*p
)
1084 _Panel
*panel
= (_Panel
*)p
;
1087 panel
->frame
= WMCreateFrame(panel
->win
);
1088 WMResizeWidget(panel
->frame
, FRAME_WIDTH
, FRAME_HEIGHT
);
1089 WMMoveWidget(panel
->frame
, FRAME_LEFT
, FRAME_TOP
);
1091 panel
->cmd1P
= WMCreatePopUpButton(panel
->frame
);
1092 WMSetPopUpButtonAction(panel
->cmd1P
, performCommand
, panel
);
1093 WMResizeWidget(panel
->cmd1P
, 144, 20);
1094 WMMoveWidget(panel
->cmd1P
, 15, 15);
1095 WMSetPopUpButtonPullsDown(panel
->cmd1P
, True
);
1096 WMSetPopUpButtonText(panel
->cmd1P
, _("Commands"));
1097 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Command"));
1098 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Submenu"));
1099 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add External Menu"));
1100 WMAddPopUpButtonItem(panel
->cmd1P
, _("Add Workspace Menu"));
1101 WMAddPopUpButtonItem(panel
->cmd1P
, _("Remove Item"));
1102 WMAddPopUpButtonItem(panel
->cmd1P
, _("Cut Item"));
1103 WMAddPopUpButtonItem(panel
->cmd1P
, _("Copy Item"));
1104 WMAddPopUpButtonItem(panel
->cmd1P
, _("Paste Item"));
1106 panel
->cmd2P
= WMCreatePopUpButton(panel
->frame
);
1107 WMSetPopUpButtonAction(panel
->cmd2P
, performCommand
, panel
);
1108 WMResizeWidget(panel
->cmd2P
, 144, 20);
1109 WMMoveWidget(panel
->cmd2P
, 164, 15);
1110 WMSetPopUpButtonPullsDown(panel
->cmd2P
, True
);
1111 WMSetPopUpButtonText(panel
->cmd2P
, _("Commands"));
1112 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Command"));
1113 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Submenu"));
1114 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add External Menu"));
1115 WMAddPopUpButtonItem(panel
->cmd2P
, _("Add Workspace Menu"));
1116 WMAddPopUpButtonItem(panel
->cmd2P
, _("Remove Item"));
1117 WMAddPopUpButtonItem(panel
->cmd2P
, _("Cut Item"));
1118 WMAddPopUpButtonItem(panel
->cmd2P
, _("Copy Item"));
1119 WMAddPopUpButtonItem(panel
->cmd2P
, _("Paste Item"));
1121 panel
->tit1T
= WMCreateTextField(panel
->frame
);
1122 WMResizeWidget(panel
->tit1T
, 144, 20);
1123 WMMoveWidget(panel
->tit1T
, 15, 40);
1124 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1127 panel
->tit2T
= WMCreateTextField(panel
->frame
);
1128 WMResizeWidget(panel
->tit2T
, 144, 20);
1129 WMMoveWidget(panel
->tit2T
, 164, 40);
1130 WMAddNotificationObserver(changedTitle
, panel
, WMTextDidChangeNotification
,
1133 panel
->browser
= WMCreateBrowser(panel
->frame
);
1134 WMSetBrowserTitled(panel
->browser
, False
);
1135 WMResizeWidget(panel
->browser
, 295, 160);
1136 WMMoveWidget(panel
->browser
, 15, 65);
1138 browserDelegate
.data
= panel
;
1140 WMSetBrowserDelegate(panel
->browser
, &browserDelegate
);
1141 WMHangData(panel
->browser
, panel
);
1142 WMSetBrowserPathSeparator(panel
->browser
, "\r");
1143 WMSetBrowserAction(panel
->browser
, browserClick
, panel
);
1147 panel
->labF
= WMCreateFrame(panel
->frame
);
1148 WMResizeWidget(panel
->labF
, 190, 50);
1149 WMMoveWidget(panel
->labF
, 320, 10);
1150 WMSetFrameTitle(panel
->labF
, _("Label"));
1152 panel
->labT
= WMCreateTextField(panel
->labF
);
1153 WMResizeWidget(panel
->labT
, 170, 20);
1154 WMMoveWidget(panel
->labT
, 10, 20);
1155 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1158 WMMapSubwidgets(panel
->labF
);
1160 panel
->cmdF
= WMCreateFrame(panel
->frame
);
1161 WMResizeWidget(panel
->cmdF
, 190, 50);
1162 WMMoveWidget(panel
->cmdF
, 320, 65);
1163 WMSetFrameTitle(panel
->cmdF
, _("Command"));
1165 panel
->cmdP
= WMCreatePopUpButton(panel
->cmdF
);
1166 WMResizeWidget(panel
->cmdP
, 170, 20);
1167 WMMoveWidget(panel
->cmdP
, 10, 20);
1168 WMAddPopUpButtonItem(panel
->cmdP
, _("Run Program"));
1169 WMAddPopUpButtonItem(panel
->cmdP
, _("Execute Shell Command"));
1170 WMAddPopUpButtonItem(panel
->cmdP
, _("Arrange Icons"));
1171 WMAddPopUpButtonItem(panel
->cmdP
, _("Hide Others"));
1172 WMAddPopUpButtonItem(panel
->cmdP
, _("Show All Windows"));
1173 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit WindowMaker"));
1174 WMAddPopUpButtonItem(panel
->cmdP
, _("Exit X Session"));
1175 WMAddPopUpButtonItem(panel
->cmdP
, _("Start Window Manager"));
1176 WMAddPopUpButtonItem(panel
->cmdP
, _("Restart WindowMaker"));
1177 WMAddPopUpButtonItem(panel
->cmdP
, _("Save Session"));
1178 WMAddPopUpButtonItem(panel
->cmdP
, _("Clear Session"));
1179 WMAddPopUpButtonItem(panel
->cmdP
, _("Refresh Screen"));
1180 WMAddPopUpButtonItem(panel
->cmdP
, _("Info Panel"));
1181 WMAddPopUpButtonItem(panel
->cmdP
, _("Legal Panel"));
1182 WMSetPopUpButtonAction(panel
->cmdP
, changedCommand
, panel
);
1184 WMMapSubwidgets(panel
->cmdF
);
1186 panel
->infoL
= WMCreateLabel(panel
->frame
);
1187 WMResizeWidget(panel
->infoL
, 190, 50);
1188 WMMoveWidget(panel
->infoL
, 320, 65);
1189 WMSetLabelText(panel
->infoL
, _("Open workspace menu"));
1190 WMSetLabelRelief(panel
->infoL
, WRGroove
);
1191 WMSetLabelTextAlignment(panel
->infoL
, WACenter
);
1193 panel
->noconfirmB
= WMCreateSwitchButton(panel
->frame
);
1194 WMResizeWidget(panel
->noconfirmB
, 190, 50);
1195 WMMoveWidget(panel
->noconfirmB
, 320, 120);
1196 WMSetButtonText(panel
->noconfirmB
, _("No confirmation panel"));
1197 WMSetButtonAction(panel
->noconfirmB
, confirmClicked
, panel
);
1199 panel
->pathF
= WMCreateFrame(panel
->frame
);
1200 WMResizeWidget(panel
->pathF
, 190, 50);
1201 WMMoveWidget(panel
->pathF
, 320, 65);
1202 WMSetFrameTitle(panel
->pathF
, _("Menu Path/Directory List"));
1204 panel
->pathT
= WMCreateTextField(panel
->pathF
);
1205 WMResizeWidget(panel
->pathT
, 170, 20);
1206 WMMoveWidget(panel
->pathT
, 10, 20);
1207 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1210 WMMapSubwidgets(panel
->pathF
);
1212 panel
->proF
= WMCreateFrame(panel
->frame
);
1213 WMResizeWidget(panel
->proF
, 190, 50);
1214 WMMoveWidget(panel
->proF
, 320, 120);
1215 WMSetFrameTitle(panel
->proF
, _("Program to Run"));
1217 panel
->proT
= WMCreateTextField(panel
->proF
);
1218 WMResizeWidget(panel
->proT
, 170, 20);
1219 WMMoveWidget(panel
->proT
, 10, 20);
1220 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1223 WMMapSubwidgets(panel
->proF
);
1225 panel
->shoF
= WMCreateFrame(panel
->frame
);
1226 WMResizeWidget(panel
->shoF
, 190, 50);
1227 WMMoveWidget(panel
->shoF
, 320, 175);
1228 WMSetFrameTitle(panel
->shoF
, _("Shortcut"));
1230 panel
->shoT
= WMCreateTextField(panel
->shoF
);
1231 WMResizeWidget(panel
->shoT
, 95, 20);
1232 WMMoveWidget(panel
->shoT
, 10, 20);
1233 WMAddNotificationObserver(changedItem
, panel
, WMTextDidChangeNotification
,
1236 panel
->shoB
= WMCreateCommandButton(panel
->shoF
);
1237 WMResizeWidget(panel
->shoB
, 70, 24);
1238 WMMoveWidget(panel
->shoB
, 110, 18);
1239 WMSetButtonText(panel
->shoB
, _("Capture"));
1240 WMSetButtonAction(panel
->shoB
, captureClick
, panel
);
1242 WMMapSubwidgets(panel
->shoF
);
1244 panel
->guruB
= WMCreateCommandButton(panel
->frame
);
1245 WMResizeWidget(panel
->guruB
, 180, 24);
1246 WMMoveWidget(panel
->guruB
, 325, 190);
1247 WMSetButtonText(panel
->guruB
, _("Ask help to the Guru"));
1248 WMSetButtonAction(panel
->guruB
, openGuru
, panel
);
1250 WMRealizeWidget(panel
->frame
);
1251 WMMapSubwidgets(panel
->frame
);
1260 preProcessMenu(proplist_t menu
, int *hasWSMenu
)
1266 pmenu
= PLDeepCopy(menu
);
1267 if (PLGetNumberOfElements(pmenu
)==1) {
1270 for (i
=1; i
<PLGetNumberOfElements(pmenu
); i
++) {
1271 item
= PLGetArrayElement(pmenu
, i
);
1273 PLInsertArrayElement(pmenu
, preProcessMenu(item
, hasWSMenu
), i
);
1274 PLRemoveArrayElement(pmenu
, i
+1);
1276 } else if (strcmp(getItemCommand(item
), "RESTART")==0) {
1277 if (getItemShortcut(item
)) {
1278 if (PLGetNumberOfElements(item
) == 4) {
1279 changeItemCommand(item
, "RESTARTW");
1280 PLAppendArrayElement(item
, PLMakeString(""));
1283 if (PLGetNumberOfElements(item
) == 2) {
1284 changeItemCommand(item
, "RESTARTW");
1285 PLAppendArrayElement(item
, PLMakeString(""));
1289 if (strcmp(getItemCommand(item
),"WORKSPACE_MENU")==0)
1291 if (getItemShortcut(item
)) {
1292 if (PLGetNumberOfElements(item
) == 4)
1293 PLAppendArrayElement(item
, PLMakeString(""));
1295 if (PLGetNumberOfElements(item
) == 2)
1296 PLAppendArrayElement(item
, PLMakeString(""));
1307 postProcessMenu(proplist_t menu
)
1314 pmenu
= PLDeepCopy(menu
);
1315 if (PLGetNumberOfElements(pmenu
)==1) {
1318 count
= PLGetNumberOfElements(pmenu
);
1319 for (i
=1; i
<count
; i
++) {
1321 item
= PLGetArrayElement(pmenu
, i
);
1323 PLInsertArrayElement(pmenu
, postProcessMenu(item
), i
);
1324 PLRemoveArrayElement(pmenu
, i
+1);
1327 cmd
= getItemCommand(item
);
1328 if (strcmp(cmd
, "RESTARTW")==0) {
1329 changeItemCommand(item
, "RESTART");
1330 removeParameter(item
);
1331 } else if (strcmp(cmd
, "EXEC")==0 || strcmp(cmd
, "SHEXEC")==0 ||
1332 strcmp(cmd
, "OPEN_MENU")==0) {
1334 } else if (strcmp(cmd
, "RESTART")==0 || strcmp(cmd
, "SHUTDOWN")==0
1335 || strcmp(cmd
, "EXIT")==0) {
1336 char *tmp
= getItemParameter(item
);
1337 if (tmp
&& strlen(tmp
)==0)
1338 removeParameter(item
);
1340 removeParameter(item
);
1350 getDefaultMenu(_Panel
*panel
, int *hasWSMenu
)
1352 proplist_t menu
, pmenu
;
1353 char *menuPath
, *gspath
;
1355 gspath
= wusergnusteppath();
1357 menuPath
= wmalloc(strlen(gspath
)+128);
1358 /* if there is a localized plmenu for the tongue put it's filename here */
1359 sprintf(menuPath
, _("%s/Library/WindowMaker/plmenu"), gspath
);
1361 menu
= PLGetProplistWithPath(menuPath
);
1363 wwarning("%s:could not read property list menu", menuPath
);
1365 if (strcmp("%s/Library/WindowMaker/plmenu",
1366 _("%s/Library/WindowMaker/plmenu"))!=0) {
1368 sprintf(menuPath
, "%s/Library/WindowMaker/plmenu", gspath
);
1369 menu
= PLGetProplistWithPath(menuPath
);
1370 wwarning("%s:could not read property list menu", menuPath
);
1375 sprintf(buffer
, _("Could not open default menu from '%s'"),
1377 WMRunAlertPanel(WMWidgetScreen(panel
->win
), panel
->win
,
1378 _("Error"), buffer
, _("OK"), NULL
, NULL
);
1385 pmenu
= preProcessMenu(menu
, hasWSMenu
);
1396 showData(_Panel
*panel
)
1400 proplist_t menu
, pmenu
, plPath
;
1403 gspath
= wusergnusteppath();
1405 menuPath
= wmalloc(strlen(gspath
)+32);
1406 strcpy(menuPath
, gspath
);
1407 strcat(menuPath
, "/Defaults/WMRootMenu");
1409 menu
= PLGetProplistWithPath(menuPath
);
1412 if (!menu
|| !PLIsArray(menu
)) {
1413 if (AskMenuCopy(panel
->win
)) {
1414 panel
->dontSave
= 0;
1417 pmenu
= getDefaultMenu(panel
, &hasWSMenu
);
1419 WMSetPopUpButtonEnabled(panel
->cmd1P
, False
);
1420 WMSetPopUpButtonEnabled(panel
->cmd2P
, False
);
1421 panel
->dontSave
= 1;
1424 pmenu
= PLMakeArrayFromElements(PLMakeString("Applications"),
1428 pmenu
= preProcessMenu(menu
, &hasWSMenu
);
1430 plPath
= PLMakeString(menuPath
);
1432 PLSetFilename(pmenu
, plPath
);
1438 if (panel
->itemClipboard
) {
1439 PLRelease(panel
->itemClipboard
);
1440 panel
->itemClipboard
= NULL
;
1442 panel
->menu
= pmenu
;
1443 panel
->editedItem
= NULL
;
1444 panel
->capturing
= 0;
1446 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CPaste
, False
);
1447 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CPaste
, False
);
1449 WMSetPopUpButtonItemEnabled(panel
->cmd1P
, CAddWorkspace
, False
);
1450 WMSetPopUpButtonItemEnabled(panel
->cmd2P
, CAddWorkspace
, False
);
1452 WMLoadBrowserColumnZero(panel
->browser
);
1454 updateForItemType(panel
, TNothing
);
1459 storeData(_Panel
*panel
)
1463 if (!panel
->unsaved
|| panel
->dontSave
)
1467 menu
= postProcessMenu(panel
->menu
);
1469 PLSetFilename(menu
, PLGetFilename(panel
->menu
));
1478 InitMenu(WMScreen
*scr
, WMWindow
*win
)
1482 panel
= wmalloc(sizeof(_Panel
));
1483 memset(panel
, 0, sizeof(_Panel
));
1485 panel
->sectionName
= _("Applications Menu Definition");
1487 panel
->description
= _("Edit the menu for launching applications.");
1491 panel
->callbacks
.createWidgets
= createPanel
;
1492 panel
->callbacks
.updateDomain
= storeData
;
1494 AddSection(panel
, ICON_FILE
);