From b04c4ea500f8759537fc71a77c7ecca79fb97047 Mon Sep 17 00:00:00 2001 From: kojima Date: Sat, 17 Feb 2001 21:44:22 +0000 Subject: [PATCH] added WINDOWS_MENU to rootmenu --- ChangeLog | 2 + WINGs/Extras/test.c | 10 +- WINGs/Tests/wtest.c | 2 +- WINGs/wpanel.c | 2 +- WINGs/wscroller.c | 2 +- WINGs/wscrollview.c | 2 +- WPrefs.app/Menu.c | 13 ++ src/rootmenu.c | 30 +++++ src/screen.h | 1 + util/wkdemenu.pl | 311 ++++++++++++++++++++++++++------------------ 10 files changed, 232 insertions(+), 143 deletions(-) diff --git a/ChangeLog b/ChangeLog index 061cfde6..70a0833b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ Changes since version 0.64.0: - fix with gnome hints stuff, related to tasklist/bar - ripped off single appicon stuff - added better appicon handling of apps of the same type +- applied patch for wkdemenu (Malcolm Cowe ) +- added WINDOWS_MENU submenu type for root menu (Bastien Nocera ) Changes since version 0.63.1: ............................. diff --git a/WINGs/Extras/test.c b/WINGs/Extras/test.c index 97bc663f..17ade172 100644 --- a/WINGs/Extras/test.c +++ b/WINGs/Extras/test.c @@ -72,7 +72,6 @@ void clickedTable(WMWidget *w, void *self) main(int argc, char **argv) { - Display *dpy = XOpenDisplay(""); WMScreen *scr; WMWindow *win; WMTableView *table; @@ -81,14 +80,7 @@ main(int argc, char **argv) WMInitializeApplication("test", &argc, argv); - - - dpy = XOpenDisplay(""); - if (!dpy) { - exit(1); - } - - scr = WMCreateScreen(dpy, DefaultScreen(dpy)); + scr = WMOpenScreen(); win = WMCreateWindow(scr, "eweq"); diff --git a/WINGs/Tests/wtest.c b/WINGs/Tests/wtest.c index 9c9ca935..b3df3e40 100644 --- a/WINGs/Tests/wtest.c +++ b/WINGs/Tests/wtest.c @@ -1279,6 +1279,7 @@ main(int argc, char **argv) */ + testScrollView(scr); testTabView(scr); #if 0 testBox(scr); @@ -1295,7 +1296,6 @@ main(int argc, char **argv) testDragAndDrop(scr); testFontPanel(scr); - testScrollView(scr); testButton(scr); testFrame(scr); diff --git a/WINGs/wpanel.c b/WINGs/wpanel.c index d4bc1b2c..40c6c20b 100644 --- a/WINGs/wpanel.c +++ b/WINGs/wpanel.c @@ -170,7 +170,7 @@ WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner, if (msg) { - panel->mLbl = WMCreateLabel(panel->win); + panel->mLbl = WMCreateLabel(panel->vbox); WMSetLabelWraps(panel->mLbl, True); WMMapWidget(panel->mLbl); WMAddBoxSubview(panel->vbox, WMWidgetView(panel->mLbl), True, True, diff --git a/WINGs/wscroller.c b/WINGs/wscroller.c index c754db86..d54e7dac 100644 --- a/WINGs/wscroller.c +++ b/WINGs/wscroller.c @@ -195,7 +195,7 @@ WMSetScrollerParameters(WMScroller *sPtr, float floatValue, if (sPtr->view->flags.realized) paintScroller(sPtr); - WMPostNotificationName(WMScrollerDidScrollNotification, sPtr, NULL); + /* WMPostNotificationName(WMScrollerDidScrollNotification, sPtr, NULL);*/ } diff --git a/WINGs/wscrollview.c b/WINGs/wscrollview.c index c74f576d..d69abd9e 100644 --- a/WINGs/wscrollview.c +++ b/WINGs/wscrollview.c @@ -14,7 +14,7 @@ typedef struct W_ScrollView { WMScroller *vScroller; WMScroller *hScroller; - + short lineScroll; short pageScroll; diff --git a/WPrefs.app/Menu.c b/WPrefs.app/Menu.c index b633bc14..8859fd61 100644 --- a/WPrefs.app/Menu.c +++ b/WPrefs.app/Menu.c @@ -40,6 +40,7 @@ typedef enum { PipeInfo, DirectoryInfo, WSMenuInfo, + WWindowListInfo, LastInfo } InfoType; @@ -461,6 +462,7 @@ createPanel(_Panel *p) panel->markerPix[PipeInfo] = pixm; panel->markerPix[DirectoryInfo] = pixm; panel->markerPix[WSMenuInfo] = pixm; + panel->markerPix[WWindowListInfo] = pixm; XFreeGC(dpy, gc); } @@ -495,6 +497,7 @@ createPanel(_Panel *p) data = putNewItem(panel, pad, PipeInfo, _("Generated Submenu")); data = putNewItem(panel, pad, DirectoryInfo, _("Directory Contents")); data = putNewItem(panel, pad, WSMenuInfo, _("Workspace Menu")); + data = putNewItem(panel, pad, WWindowListInfo, _("Window List Menu")); panel->itemPad[0] = pad; } @@ -1029,6 +1032,8 @@ parseCommand(proplist_t item) } } else if (strcmp(command, "WORKSPACE_MENU") == 0) { data->type = WSMenuInfo; + } else if (strcmp(command, "WINDOWS_MENU") == 0) { + data->type = WWindowListInfo; } else { int cmd; @@ -1114,6 +1119,10 @@ updateFrameTitle(_Panel *panel, char *title, InfoType type) tmp = wstrconcat(title, _(": Open Workspaces Submenu")); break; + case WWindowListInfo: + tmp = wstrconcat(title, _(": Open Window List Submenu")); + break; + default: tmp = NULL; break; @@ -1704,6 +1713,10 @@ processData(char *title, ItemData *data) PLAppendArrayElement(item, PLMakeString("WORKSPACE_MENU")); break; + case WWindowListInfo: + PLAppendArrayElement(item, PLMakeString("WINDOWS_MENU")); + break; + default: assert(0); break; diff --git a/src/rootmenu.c b/src/rootmenu.c index bba945a4..97cac0fa 100644 --- a/src/rootmenu.c +++ b/src/rootmenu.c @@ -770,6 +770,32 @@ addWorkspaceMenu(WScreen *scr, WMenu *menu, char *title) return entry; } +static WMenuEntry* +addWindowsMenu(WScreen *scr, WMenu *menu, char *title) +{ + WMenu *wwmenu; + WWindow *wwin; + WMenuEntry *entry; + + if (scr->flags.added_windows_menu) { + wwarning(_("There are more than one WINDOWS_MENU commands in the applications menu. Only one is allowed.")); + return NULL; + } else { + scr->flags.added_windows_menu = 1; + + wwmenu = wMenuCreate(scr, _("Window List"), False); + scr->switch_menu = wwmenu; + wwin = scr->focused_window; + while (wwin) { + UpdateSwitchMenu(scr, wwin, ACTION_ADD); + + wwin = wwin->prev; + } + entry = wMenuAddCallback(menu, title, NULL, NULL); + wMenuEntrySetCascade(menu, entry, wwmenu); + } + return entry; +} static WMenuEntry* addMenuEntry(WMenu *menu, char *title, char *shortcut, char *command, @@ -844,6 +870,10 @@ addMenuEntry(WMenu *menu, char *title, char *shortcut, char *command, } else if (strcmp(command, "WORKSPACE_MENU")==0) { entry = addWorkspaceMenu(scr, menu, title); + shortcutOk = True; + } else if (strcmp(command, "WINDOWS_MENU")==0) { + entry = addWindowsMenu(scr, menu, title); + shortcutOk = True; } else if (strcmp(command, "ARRANGE_ICONS")==0) { entry = wMenuAddCallback(menu, title, arrangeIconsCommand, NULL); diff --git a/src/screen.h b/src/screen.h index 33502342..b9623f47 100644 --- a/src/screen.h +++ b/src/screen.h @@ -310,6 +310,7 @@ typedef struct _WScreen { unsigned int dnd_data_convertion_status:1; unsigned int root_menu_changed_shortcuts:1; unsigned int added_workspace_menu:1; + unsigned int added_windows_menu:1; unsigned int startup2:1; /* startup phase 2 */ unsigned int supports_tiff:1; unsigned int clip_balloon_mapped:1; diff --git a/util/wkdemenu.pl b/util/wkdemenu.pl index 33efc95d..b80afce8 100644 --- a/util/wkdemenu.pl +++ b/util/wkdemenu.pl @@ -54,9 +54,32 @@ # #--------------------------------------------------------------------- # -# 21st January 2001. +# v1.2.0 -- 14th February 2001. # -# This script has been competely re-written to allow recursion of the +# Added alphabetic sorting of the menus. +# +# Directories are now displayed before files in the menu. +# +#--------------------------------------------------------------------- +# +# v1.1.5 -- 3rd February 2001. (No public release) +# +# Unsupported applnk files have a fallback entry in the menu tree so +# that users can report menu entries that do not work. So far, +# wkdemenu.pl assumes that there is an Exec= line in the application +# definition, which is not always the case. +# +# -------------------------------------------------------------------- +# +# v1.1.0 -- 29th January 2001. +# +# Code cleanup and bug fixes. +# +# -------------------------------------------------------------------- +# +# v1.0.0 -- 21st January 2001. +# +# This script has been completely re-written to allow recursion of the # KDE menu directories to an arbitrary depth, fixing a major # functional limitation in the original script. To do this, I have # rewritten the code to traverse directories recursively, introducing @@ -92,6 +115,9 @@ # use. This still defaults to xterm, but could be used to specify # aterm, etc. # +# Malcolm Cowe, malk@271m.net. +# +# -------------------------------------------------------------------- # # To Do # ----- @@ -99,9 +125,6 @@ # Programmatically determine the system location for the KDE menu # directory. # -# Organise the output alphabetically, with directories appearing -# before files. -# # Find a better way to parse the Exec= lines. In the short term, # provide a user mechanism for generating exceptions to the curtailing # of command line options. In the longer term, emulate what KDE does @@ -110,46 +133,51 @@ # Optimise the code. This is my first proper PERL script, and I'm sure # there's a better way. =) # + +# +# Variables # -# Malcolm Cowe, malk@271m.net. -### -### Variables -### - -### The External Menu file, this should NEVER point to the root menu file +# The External Menu file, this should NEVER point to the root menu file $menufile = "$ENV{'HOME'}/.kde2wmaker.menu"; -### Base directory, location of all the KDE AppName.kdelnk files + -### Malcolm Cowe, 21/01/2001. -### Change the base directory default to point at the system files, -### not the user files. Need to find a way of determining the prefix -### programmatically. +# Base directory, location of all the KDE AppName.kdelnk files. + +# Change the base directory default to point at the system files, +# not the user files. Need to find a way of determining the prefix +# programmatically. $prefix="/usr"; $basedir = $prefix."/share/applnk"; -### - Malcolm Cowe, 21/01/2001. -### Terminal to use. May be specified on the command line with the -t -### switch. +# Terminal to use. May be specified on the command line with the -t +# switch. $term = "xterm"; -### Print to STDOUT, default is YES, a filename is specified +# Xmessage command line to invoke (can vary platform to platform) +$ostype = `uname -s`; +if ($ostype =~ /^HP-UX$/) { + $xmsg = "xmessage -geometry 400x100 -f -"; +} +else { + $xmsg = "xmessage -geometry 400x100 -file - -default \"okay\""; +} + +# Print to STDOUT, default is YES, a filename is specified $stdout = 1; -### + Malcolm Cowe, 21/01/2001. -### KDE Locale Support +# KDE Locale Support -### Support for KDE internationalisation so that menu entries appear -### in the language chosen by the user. Also gets around some problems -### with the KDE applnk file format. +# Support for KDE internationalisation so that menu entries appear +# in the language chosen by the user. Also gets around some problems +# with the KDE applnk file format. -### The Locale is stored in one of two places, depending on the -### version of KDE that is running. +# The Locale is stored in one of two places, depending on the +# version of KDE that is running. $kde2cf="$ENV{'HOME'}/.kde/share/config/kdeglobals"; $kde1cf="$ENV{'HOME'}/.kderc"; $kdeLanguage = ""; -### Open the file, if it exists, otherwise provide a default language. +# Open the file, if it exists, otherwise provide a default language. unless(open KDERC, $kde2cf) { unless(open KDERC, $kde1cf) { $kdeLanguage = "C"; @@ -158,10 +186,10 @@ unless(open KDERC, $kde2cf) { if ( $kdeLanguage == ""){ $kdeLanguage = "C"; - ### Search through the contents of the file + # Search through the contents of the file while($line = ) { chomp($line); - ### Grab the Language + # Grab the Language if($line =~ /^Language=/) { $kdeLanguage = $line; $kdeLanguage =~ s/Language=//; @@ -172,14 +200,12 @@ if ( $kdeLanguage == ""){ close(KDERC); } -### - Malcolm Cowe, 21/01/2001. +# +# Begin Main Iteration. +# -### -### Begin Main Iteration. -### - -### Process command line arguments +# Process command line arguments foreach $arg(@ARGV) { if($last) { if($last eq "-d") { @@ -189,14 +215,11 @@ foreach $arg(@ARGV) { $menufile = $arg; $stdout = 0; } - ### + Malcolm Cowe, 21/01/2001. elsif($last eq "-t") { $term = $arg; } - ### - Malcolm Cowe, 21/01/2001. undef($last); } elsif($arg =~ /^-/) { - ### + Malcolm Cowe, 21/01/2001. if($arg =~ /^-[dfst]$/) { $last = $arg; } else { @@ -205,16 +228,14 @@ foreach $arg(@ARGV) { "\t\t-d \n". "\t\t-f \n". "\t\t-t \n"); - ### - Malcolm Cowe, 21/01/2001. &Usage; } } } -### Make sure the KDE Menu's Top Level Directory exists. +# Make sure the KDE Menu's Top Level Directory exists. if(-d $basedir) { - - ### See if there is an old menu file. If there is, rename it + # See if there is an old menu file. If there is, rename it unless($stdout) { if(-e $menufile) { print STDERR "\tFound $menufile, renaming\n\n"; @@ -223,9 +244,8 @@ if(-d $basedir) { open(MENUFILE,"> $menufile"); } - ### Start the main menu entry + # Start the main menu entry if($stdout) { - ### + Malcolm Cowe, 21/01/2001. print STDOUT "\"KDE Applications\" MENU\n"; process_dir (STDOUT, $basedir); print STDOUT "\"KDE Applications\" END\n"; @@ -233,125 +253,156 @@ if(-d $basedir) { print MENUFILE "\"KDE Applications\" MENU\n"; process_dir (MENUFILE, $basedir); print MENUFILE "\"KDE Applications\" END\n"; - ### - Malcolm Cowe, 21/01/2001. } } else { - ### Error out :/ + # Error out :/ print STDERR "ERROR:\n\t$basedir not found\n\tTry another directory.\n"; exit(0); } # End of Main Iteration. -### + Malcolm Cowe, 21/01/2001. - -### process_dir() works it's way through each file and directory in -### the tree and generates the menu output to be used by Window Maker. +# process_dir() works it's way through each file and directory in +# the tree and generates the menu output to be used by Window Maker. sub process_dir { my $OUT = @_[0]; my $path = @_[1]; my $item; my @tld; - my ($gotLang, $gotDef, $gotExec); + my @tlf; + my @klist; + my ($gotLang, $gotDef, $gotExec, $inTerm); my $inDesktop; - ### tld == Top Level Directory. + # tld == Top Level Directory. opendir(TLD, $path) || return; - @tld = readdir(TLD); + # In order to display directories before files, the directory + # contents must be split. Directories are added to one array, files + # to a second. The lists are then sorted alphabetically by name and + # combined into a single list for processing by the rest of the + # subroutine. + while (defined($file = readdir(TLD))) { + next if $file =~ /^\./; + if (-d "$path/$file") { + @tld = (@tld, $file); + } + else { + @tlf = (@tlf, $file); + } + } closedir(TLD); + # At this stage, only sort the directories, since the application + # sorting is done later, using the "Name=" field in the applnk file. + @tld = sort (@tld); + # Print out directory names first and then process the directories. foreach $item(@tld) { + print $OUT "\"$item\" MENU\n"; + process_dir($OUT, "$path/$item"); + print $OUT "\"$item\" END\n"; + } + + # Process the applnk files in the current directory. + foreach $item(@tlf) { $gotLang = 0; $gotDef = 0; $gotExec = 0; + $inTerm = 0; $inDesktop = 0; - ### Ignore hidden files and directories. - unless($item =~ /^\./) { - if (-d "$path/$item") { - print $OUT "\"$item\" MENU\n"; - process_dir($OUT, "$path/$item"); - print $OUT "\"$item\" END\n"; - } - else { - # Process the contents of the applnk file to generate a menu - # entry for the application. + # Process the contents of the applnk file to generate a menu + # entry for the application. - open(SUB,"$path/$item"); + open(SUB,"$path/$item"); - ### Search through the contents of the file - while($line = ) { - chomp($line); - ### Get the application's name. This is stored in the - ### [Desktop Entry] section of the applnk description. - ### - ### The application's name can have one of these forms: - ### Name= - ### Name[]= - ### Name[language]= - ### - ### Get the default name anyway (one of the first two, just - ### in case there is no language specific entry). - if ($inDesktop) { - # Make sure we are in fact still in the [Desktop Entry] - # section. - if ($line =~ /^\[/) { - $inDesktop = 0; - } - ### Extract the Name of the Application - elsif ($line =~ /^Name=/ && (!$gotDef || !gotLang)) { - $pname = $line; - $pname =~ s/^Name=//s; - $pname =~ s/\"/\'\'/g; - $gotDef = 1; - } - elsif ($line =~ /^Name\[\]=/ && (!$gotDef || !gotLang)) { - $pname = $line; - $pname =~ s/^Name\[\]=//s; - $pname =~ s/\"/\'\'/g; - $gotDef = 1; - } - elsif ($line =~ /^Name\[$kdeLanguage\]=/ && !$gotLang) { - $pname = $line; - $pname =~ s/^Name\[$kdeLanguage\]=//s; - $pname =~ s/\"/\'\'/g; - $gotLang = 1; - } + # Set a default application warning to run in case there is no + # Exec= line in the application definition. This will be + # useful for debugging exceptions. + $pname="$item"; + $pargs="echo \"Could not extract executable information from:\\n\\n$path/$item.\"|".$xmsg; - ### Grab the command - if($line =~ /^Exec=/ && !$gotExec) { - $pargs = $line; - $pargs =~ s/^Exec=//s; - # Strip off all command line options unless the - # application is "kfmclient". - if ($pargs !~ /^kfmclient/ - && $pargs !~ /^kcmshell/ - && $pargs !~ /^kdesu/){ - ($pargs) = split(/\s/, $pargs); - } - $gotExec = 1; - } - ### If Terminal=1, then we need to execute a term - if($line =~ /^Terminal=1$/) { - $pargs = "$term -T \"$pname\" -e $pargs"; - } - } - elsif ($line =~ /^\[Desktop\ Entry\]/ || - $line =~ /^\[KDE\ Desktop\ Entry\]/) { - $inDesktop = 1; - } + # Search through the contents of the file. Exit the loop at the + # EOF or if we have processed the [Desktop Entry Section] of the + # file. + while($line = ) { + chomp($line); + # Get the application's name. This is stored in the + # [Desktop Entry] section of the applnk description. + # + # The application's name can have one of these forms: + # Name= + # Name[]= + # Name[language]= + # + # Get the default name anyway (one of the first two, just + # in case there is no language specific entry). + if ($inDesktop) { + # Make sure we are in fact still in the [Desktop Entry] + # section. + if ($line =~ /^\[/) { + $inDesktop = 0; } - - close(SUB); - ### Begin printing menu items - print $OUT "\t\"$pname\" EXEC $pargs\n"; + # Extract the Name of the Application + elsif ($line =~ /^Name\[?\]?=/ + && (!$gotDef || !gotLang)) { + $pname = $line; + $pname =~ s/^Name\[?\]?=//s; + $pname =~ s/\"/\'\'/g; + $gotDef = 1; + } + elsif ($line =~ /^Name\[$kdeLanguage\]=/ && !$gotLang) { + $pname = $line; + $pname =~ s/^Name\[$kdeLanguage\]=//s; + $pname =~ s/\"/\'\'/g; + $gotLang = 1; + } + # Grab the command + elsif($line =~ /^Exec=/ && !$gotExec) { + $pargs = $line; + $pargs =~ s/^Exec=//s; + # Strip off all command line options unless the + # application is "kfmclient", etc. + if ($pargs !~ /^kfmclient/ + && $pargs !~ /^kcm/ + && $pargs !~ /^\/bin\/bash/ + && $pargs !~ /^kdesu/){ + ($pargs) = split(/\s/, $pargs); + } + else { + # A double check to remove any dubious characters from + # the command line of the exceptions listed in the + # above "if" statement. The only culprit so far is the + # KDE 1 kfmclient command line. + $pargs =~ s/\%[a-zA-Z]//g; + } + $gotExec = 1; + } + # If Terminal=1, then we need to execute application + # within a terminal window. + elsif($line =~ /^Terminal=(1|true)$/i) { + $inTerm=1; + } + } + elsif ($line =~ /^\[(KDE\ )?Desktop\ Entry\]/){ + $inDesktop = 1; } } + + close(SUB); + + if ($inTerm) { + $pargs = "$term -T \"$pname\" -e $pargs"; + } + @klist = (@klist, "\t\"$pname\" EXEC $pargs\n"); + } + + @klist = sort(@klist); + foreach (@klist) { + print $OUT $_; } return; } -### - Malcolm Cowe, 21/01/2001.