QB64 Phoenix Edition
QB64 Phoenix Edition v3.3.0 Released! - Printable Version

+- QB64 Phoenix Edition (https://staging.qb64phoenix.com)
+-- Forum: Official Links (https://staging.qb64phoenix.com/forumdisplay.php?fid=16)
+--- Forum: Announcements (https://staging.qb64phoenix.com/forumdisplay.php?fid=18)
+--- Thread: QB64 Phoenix Edition v3.3.0 Released! (/showthread.php?tid=960)

Pages: 1 2 3 4 5 6 7 8


RE: QB64 Phoenix Edition v3.3.0 Released! - Fifi - 10-23-2022

Hello,

Unfortunately, the installation script of QB64-PE version 3.3.0 X64 for macOS doesn't work! Angry

Code: (Select All)
Last login: Sun Oct 23 17:25:05 on ttys001
i-Mac-27:~ Philippe$ /Users/Philippe/Desktop/qb64pe/setup_osx.command ; exit;
QB64-PE Setup

Building 'QB64-PE'
make: *** No rule to make target `clean'.  Stop.
make: *** No targets specified and no makefile found.  Stop.

Compilation of QB64-PE failed!

logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Opération terminée]


Please help me to correct the make file, because this bother me a lot to be obliged to use QB64 2.1 (X64) that I just downloaded from the other so-called "official" branch to compile and create QB64-PE 3.3.0 on my iMac 27 under 10.13.6, a process which, BTW, works fine.

TIA for your help.

Cheers.
Fifi


RE: QB64 Phoenix Edition v3.3.0 Released! - Kernelpanic - 10-23-2022

OS X is similar to Linux, can't you install it by hand? Might be easier than possibly having to adjust the script with each new version of QB64.


RE: QB64 Phoenix Edition v3.3.0 Released! - DSMan195276 - 10-23-2022

(10-23-2022, 03:52 PM)Fifi Wrote: Unfortunately, the installation script of QB64-PE version 3.3.0 X64 for macOS doesn't work! Angry


Can you check if there is a file called
Makefile
in the folder you're running the
setup_osx.command
from? And did you do anything else beyond extracting the release
.tar.gz
and running
setup_osx.command
?


RE: QB64 Phoenix Edition v3.3.0 Released! - Fifi - 10-24-2022

(10-23-2022, 08:56 PM)DSMan195276 Wrote:
(10-23-2022, 03:52 PM)Fifi Wrote: Unfortunately, the installation script of QB64-PE version 3.3.0 X64 for macOS doesn't work! Angry


Can you check if there is a file called
Makefile
in the folder you're running the
setup_osx.command
from? And did you do anything else beyond extracting the release
.tar.gz
and running
setup_osx.command
?
Hi DSMan195276

Yes there is a file named Makefile in the folder I'm running the 'setup_osx.command', and no I didn't do anything but extracting the .tar.gz release (that's so easy under macOS by just doing a doble click on the file which automatically creates thr folder).

Unfortunately, I can't attach the Makefile to this post because its format isn't allowed.

Do you want a cut and past in text mode?

Looking forward.
Fifi


RE: QB64 Phoenix Edition v3.3.0 Released! - Fifi - 10-24-2022

(10-24-2022, 02:15 AM)Fifi Wrote:
(10-23-2022, 08:56 PM)DSMan195276 Wrote:
(10-23-2022, 03:52 PM)Fifi Wrote: Unfortunately, the installation script of QB64-PE version 3.3.0 X64 for macOS doesn't work! Angry


Can you check if there is a file called
Makefile
in the folder you're running the
setup_osx.command
from? And did you do anything else beyond extracting the release
.tar.gz
and running
setup_osx.command
?
Hi DSMan195276

Yes there is a file named Makefile in the folder I'm running the 'setup_osx.command', and no I didn't do anything but extracting the .tar.gz release (that's so easy under macOS by just doing a doble click on the file which automatically creates thr folder).

Unfortunately, I can't attach the Makefile to this post because its format isn't allowed.

Do you want a cut and past in text mode?

Looking forward.
Fifi

Hi again,

Please find bellow the Copy/Past of the Makefile.

Code: (Select All)
# Disable implicit rules
MAKEFLAGS += --no-builtin-rules

ifndef OS
$(error "OS must be set to 'lnx', 'win', or 'osx'")
endif

# The extra tag to put on ./internal/temp and qbx.o when multiple instances are involved
# This is blank for the 'normal' files
TEMP_ID ?=

# Extra flags go at the beginning of the library list
#
# This is important for libraries, since they could potentially be referencing
# things from our dependencies
CXXFLAGS += $(CXXFLAGS_EXTRA)
CXXLIBS += $(CXXLIBS_EXTRA)

# There are no C lib flags, those all go in CXXLIBS
CFLAGS += $(CFLAGS_EXTRA)

EXE_OBJS :=
EXE_LIBS :=

ifeq ($(OS),lnx)
    lnx := y

    PATH_INTERNAL := ./internal
    PATH_INTERNAL_SRC := $(PATH_INTERNAL)/source
    PATH_INTERNAL_TEMP := $(PATH_INTERNAL)/temp$(TEMP_ID)
    PATH_INTERNAL_C := $(PATH_INTERNAL)/c
    PATH_LIBQB := $(PATH_INTERNAL_C)/libqb
    CP := cp -r
    RM := rm -fr
    MKDIR := mkdir -p
    OBJCOPY := objcopy
    FIXPATH = $1
    PLATFORM := posix
    EXTENSION :=

    # Compiling with -no-pie lets some file explorers know we're an executable,
    # not a shared object
    CXXFLAGS += -no-pie

    # Check bitness by getting length of `long
    # 64 bits on x86_64, 32 bits on x86
    BITS := $(shell getconf LONG_BIT)

    ifeq ($(BITS),)
        BITS := 64
    endif
endif

ifeq ($(OS),win)
    win := y

    PATH_INTERNAL := internal
    PATH_INTERNAL_SRC := $(PATH_INTERNAL)\source
    PATH_INTERNAL_TEMP := $(PATH_INTERNAL)\temp$(TEMP_ID)
    PATH_INTERNAL_C := $(PATH_INTERNAL)\c
    PATH_LIBQB := $(PATH_INTERNAL_C)\libqb
    SHELL := cmd
    CP := xcopy /E /C /H /R /Y
    AR := $(PATH_INTERNAL_C)\c_compiler\bin\ar.exe
    CC := $(PATH_INTERNAL_C)\c_compiler\bin\gcc.exe
    CXX := $(PATH_INTERNAL_C)\c_compiler\bin\c++.exe
    OBJCOPY := $(PATH_INTERNAL_C)\c_compiler\bin\objcopy.exe
    WINDRES := $(PATH_INTERNAL_C)\c_compiler\bin\windres.exe
    ICON_OBJ := $(PATH_INTERNAL_TEMP)\icon.o
    RM := del /Q
    MKDIR := mkdir
    FIXPATH = $(subst /,\,$1)
    PLATFORM := windows
    EXTENSION := .exe

    # Check bitness by seeing which compiler we have
    ifeq ($(wildcard $(PATH_INTERNAL_C)\c_compiler\i686-w64-mingw32),)
        BITS := 64
    else
        BITS := 32
    endif
endif

ifeq ($(OS),osx)
    osx := y

    PATH_INTERNAL := ./internal
    PATH_INTERNAL_SRC := $(PATH_INTERNAL)/source
    PATH_INTERNAL_TEMP := $(PATH_INTERNAL)/temp$(TEMP_ID)
    PATH_INTERNAL_C := $(PATH_INTERNAL)/c
    PATH_LIBQB := $(PATH_INTERNAL_C)/libqb
    CP := cp -r
    RM := rm -fr
    MKDIR := mkdir -p
    FIXPATH = $1
    BITS := 64
    PLATFORM := posix
    EXTENSION :=
endif

ifeq ($(BITS),64)
    OBJCOPY_FLAGS := -Oelf64-x86-64 -Bi386:x86-64
else
    OBJCOPY_FLAGS := -Oelf32-i386 -Bi386
endif

ifdef BUILD_QB64
    ifeq ($(OS),win)
        EXE ?= qb64pe.exe
    else
        EXE ?= qb64pe
    endif
endif

ifneq ($(filter clean build-tests,$(MAKECMDGOALS)),)
    # We have to define this for the Makefile to work,
    # but it doesn't actually matter what it is since clean and build-tests don't compile an executable
    EXE := blah
endif

ifndef EXE
$(error Please provide executable name as 'EXE=executable')
endif

GENERATE_LICENSE ?= n

LICENSE ?= $(EXE).license.txt
LICENSE_IN_USE := qb64

all: $(EXE)

CLEAN_LIST :=
CLEAN_DEP_LIST :=

CXXFLAGS += -w -std=gnu++11

ifeq ($(OS),lnx)
    CXXLIBS += -lGL -lGLU -lX11 -lpthread -ldl -lrt
    CXXFLAGS += -DFREEGLUT_STATIC
endif

ifeq ($(OS),win)
    CXXLIBS += -static-libgcc -static-libstdc++
    CXXFLAGS += -DGLEW_STATIC -DFREEGLUT_STATIC
endif

ifeq ($(OS),osx)
    CXXLIBS += -framework OpenGL -framework IOKit -framework GLUT -framework Cocoa

    # OSX doesn't strip using objcopy, so we're using `-s` instead
    ifneq ($(STRIP_SYMBOLS),n)
        CXXLIBS += -s
    endif
endif

QB_QBX_OBJ := $(PATH_INTERNAL_C)/qbx$(TEMP_ID).o

$(QB_QBX_OBJ): $(wildcard $(PATH_INTERNAL)/temp$(TEMP_ID)/*.txt)

EXE_OBJS += $(QB_QBX_OBJ)

CLEAN_LIST += $(QB_QBX_OBJ)

ifdef BUILD_QB64
    # Copy the QB64-PE source code into temp before compiling
ifeq ($(OS),win)
    _shell := $(shell $(CP) $(PATH_INTERNAL_SRC)\\* $(PATH_INTERNAL_TEMP)\\)
else
    _shell := $(shell $(CP) $(PATH_INTERNAL_SRC)/* $(PATH_INTERNAL_TEMP)/)
endif

    # Required dependencies of QB64-PE itself
    DEP_FONT := y
    DEP_ICON := y
    DEP_ICON_RC := y
    DEP_SOCKETS := y
endif

include $(PATH_INTERNAL_C)/libqb/build.mk

CXXFLAGS += -I$(PATH_LIBQB)/include
EXE_LIBS += $(libqb-objs-y)

include $(PATH_INTERNAL_C)/parts/audio/conversion/build.mk
include $(PATH_INTERNAL_C)/parts/audio/decode/mp3_mini/build.mk
include $(PATH_INTERNAL_C)/parts/audio/decode/ogg/build.mk
include $(PATH_INTERNAL_C)/parts/audio/out/build.mk
include $(PATH_INTERNAL_C)/parts/audio/extras/build.mk
include $(PATH_INTERNAL_C)/parts/audio/build.mk
include $(PATH_INTERNAL_C)/parts/core/build.mk
include $(PATH_INTERNAL_C)/parts/input/game_controller/build.mk
include $(PATH_INTERNAL_C)/parts/video/font/ttf/build.mk
include $(PATH_INTERNAL_C)/parts/video/image/build.mk

.PHONY: all clean

QBLIB_NAME := libqb_make_

CLEAN_LIST += $(wildcard $(PATH_INTERNAL_C)/$(QBLIB_NAME)*.o)

ifneq ($(filter y,$(DEP_GL)),)
    CXXFLAGS += -DDEPENDENCY_GL
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_SCREENIMAGE) $(DEP_IMAGE_CODEC)),)
    CXXFLAGS += -DDEPENDENCY_IMAGE_CODEC
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += dr_pcx stb_image
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_CONSOLE_ONLY)),)
    CXXFLAGS += -DDEPENDENCY_CONSOLE_ONLY
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_SOCKETS)),)
    CXXFLAGS += -DDEPENDENCY_SOCKETS
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    CXXFLAGS += -DDEPENDENCY_NO_SOCKETS
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_PRINTER)),)
    CXXFLAGS += -DDEPENDENCY_PRINTER
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    CXXFLAGS += -DDEPENDENCY_NO_PRINTER
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_ICON_RC) $(DEP_ICON)),)
    CXXFLAGS += -DDEPENDENCY_ICON
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    CXXFLAGS += -DDEPENDENCY_NO_ICON
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_ICON_RC)),)
    ifeq ($(OS),win)
        EXE_OBJS += $(ICON_OBJ)
    endif
endif

ifneq ($(filter y,$(DEP_SCREENIMAGE)),)
    CXXFLAGS += -DDEPENDENCY_SCREENIMAGE
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    CXXFLAGS += -DDEPENDENCY_NO_SCREENIMAGE
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_FONT)),)
    EXE_LIBS += $(QB_FONT_LIB)
    CXXFLAGS += -DDEPENDENCY_LOADFONT
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += freetype_ftl
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_DEVICEINPUT)),)
    EXE_LIBS += $(QB_DEVICE_INPUT_LIB)
    CXXFLAGS += -DDEPENDENCY_DEVICEINPUT
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_AUDIO_MINIAUDIO)),)
    EXE_LIBS += $(MINIAUDIO_OBJS)

    CXXFLAGS += -DDEPENDENCY_AUDIO_MINIAUDIO
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += miniaudio libxmp-lite radv2 stbvorbis

    ifdef DEP_AUDIO_DECODE_MIDI
        LICENSE_IN_USE += tinysoundfont tinymidiloader
    endif
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_AUDIO_CONVERSION) $(DEP_AUDIO_DECODE)),)
    EXE_LIBS += $(QB_AUDIO_CONVERSION_LIB)
    CXXFLAGS += -DDEPENDENCY_AUDIO_CONVERSION
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += opus
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_AUDIO_DECODE)),)
    EXE_LIBS += $(QB_AUDIO_DECODE_MP3_LIB) $(QB_AUDIO_DECODE_OGG_LIB)
    CXXFLAGS += -DDEPENDENCY_AUDIO_DECODE
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += mpg123 stbvorbis
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_AUDIO_OUT) $(DEP_AUDIO_CONVERSION) $(DEP_AUDIO_DECODE)),)
    EXE_LIBS += $(QB_AUDIO_OUT_LIB)
    CXXFLAGS += -DDEPENDENCY_AUDIO_OUT
    ifeq ($(OS),osx)
        CXXLIBS += -framework AudioUnit -framework AudioToolbox
    endif
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += openal
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(filter y,$(DEP_ZLIB)),)
    CXXFLAGS += -DDEPENDENCY_ZLIB
    ifeq ($(OS),osx)
        CXXLIBS += "-lz"
    else
        CXXLIBS += "-l:libz.a"
    endif
    QBLIB_NAME := $(addsuffix 1,$(QBLIB_NAME))

    LICENSE_IN_USE += zlib
else
    QBLIB_NAME := $(addsuffix 0,$(QBLIB_NAME))
endif

ifneq ($(OS),osx)
    EXE_LIBS += $(QB_CORE_LIB)

    LICENSE_IN_USE += freeglut
endif

ifeq ($(OS),win)
    LICENSE_IN_USE += mingw-base-runtime libstdc++

    ifneq ($(filter y,$(DEP_CONSOLE_ONLY) $(DEP_CONSOLE)),)
        CXXLIBS += -mconsole
    endif

    ifneq ($(filter y,$(DEP_CONSOLE_ONLY)),)
        CXXFLAGS := $(filter-out -DFREEGLUT_STATIC,$(CXXFLAGS))
        EXE_LIBS := $(filter-out $(QB_CORE_LIB),$(EXE_LIBS))

        LICENSE_IN_USE := $(filter-out freeglut,$(LICENSE_IN_USE))
    else
        CXXLIBS += -mwindows -lopengl32 -lglu32 -lwinmm
    endif

    ifneq ($(filter y,$(DEP_SOCKETS)),)
        CXXLIBS += -lws2_32
    endif

    ifneq ($(filter y,$(DEP_PRINTER)),)
        CXXLIBS += -lwinspool
    endif

    ifneq ($(filter y,$(DEP_DEVICEINPUT)),)
        CXXLIBS += -lwinmm
    endif

    ifneq ($(filter y,$(DEP_AUDIO_OUT) $(DEP_AUDIO_CONVERSION) $(DEP_AUDIO_DECODE) $(DEP_AUDIO_MINIAUDIO)),)
        CXXLIBS += -lwinmm -lksguid -ldxguid -lole32
    endif

    ifneq ($(filter y,$(DEP_ICON) $(DEP_ICON_RC) $(DEP_SCREENIMAGE) $(DEP_PRINTER)),)
        CXXLIBS += -lgdi32
    endif
endif

ifneq ($(filter y,$(DEP_DATA)),)
    EXE_OBJS += $(PATH_INTERNAL_TEMP)/data.o
endif


QBLIB := $(PATH_INTERNAL_C)/$(QBLIB_NAME).o

ifneq ($(OS),osx)
$(QBLIB): $(PATH_INTERNAL_C)/libqb.cpp
    $(CXX) $(CXXFLAGS) $< -c -o $@
else
$(QBLIB): $(PATH_INTERNAL_C)/libqb.mm
    $(CXX) $(CXXFLAGS) $< -c -o $@
endif

ifeq ($(OS),win)
CLEAN_LIST += $(ICON_OBJ)
$(ICON_OBJ): $(PATH_INTERNAL_TEMP)\icon.rc
    $(WINDRES) -i $< -o $@
endif

# QBLIB has to go first to ensure correct linking
EXE_OBJS := $(QBLIB) $(EXE_OBJS)

%.o: %.cpp
    $(CXX) $(CXXFLAGS) $< -c -o $@

$(PATH_INTERNAL_TEMP)/data.o: $(PATH_INTERNAL_TEMP)/data.bin
    $(OBJCOPY) -Ibinary $(OBJCOPY_FLAGS) $< $@

# Clean all files out of ./internal/temp except for temp.bin
CLEAN_LIST += $(wildcard $(PATH_INTERNAL_TEMP)/*)
CLEAN_LIST := $(filter-out $(PATH_INTERNAL_TEMP)/temp.bin,$(CLEAN_LIST))

clean: $(CLEAN_DEP_LIST)
    $(RM) $(call FIXPATH,$(CLEAN_LIST))

ifeq ($(GENERATE_LICENSE),y)
LICENSE_FILES := $(patsubst %,licenses/license_%.txt,$(LICENSE_IN_USE))
LICENSE_DEP := $(LICENSE)
endif

$(EXE): $(EXE_OBJS) $(EXE_LIBS) $(LICENSE_DEP)
    $(CXX) $(CXXFLAGS) $(EXE_OBJS) -o "$@" $(EXE_LIBS) $(CXXLIBS)
ifneq ($(filter-out osx,$(OS)),)
ifneq ($(STRIP_SYMBOLS),n)
    $(OBJCOPY) --only-keep-debug "$@" "$(PATH_INTERNAL_TEMP)/$(notdir $@).sym"
    $(OBJCOPY) --strip-unneeded "$@"
endif
endif

$(LICENSE): $(LICENSE_FILES)
ifeq ($(GENERATE_LICENSE),y)
ifeq ($(OS),win)
    type $(call FIXPATH,$^) > "$@"
else
    cat $^ > "$@"
endif
endif

-include ./tests/build.mk
Hope this helps.

Looking forward.

Cheers.
Fifi


RE: QB64 Phoenix Edition v3.3.0 Released! - DSMan195276 - 10-24-2022

Oh, I see the problem now, you didn't run the script from the same directory it was in. Unfortunately it does seem that I unintentionally broke that a few releases ago.

I'll fix it in the next release, but for now you can work around it either by cd'ing to the
qb64pe
directory before running the script (preferred approach) or edit the script to have
cd "$(dirname "$0")"
at the top instead of the similar line that's currently there.

Working around the issue by compiling via a different QB64 version ('official v2.1' or another PE version) will probably be fine but there is some potential to hit weird problems. Personally I'd recommend just rebuilding it via the above suggestion but that's completely up to you.


RE: QB64 Phoenix Edition v3.3.0 Released! - Fifi - 10-24-2022

(10-24-2022, 02:44 AM)DSMan195276 Wrote: Oh, I see the problem now, you didn't run the script from the same directory it was in. Unfortunately it does seem that I unintentionally broke that a few releases ago.
Hi again,

Not sure to understand or I have been not explicit enough.

So,may I be more precise.

I downloaded the file qb64pe_osx-3.3.0.tar.gz and put it on my desktop.

Then, I made a double click on that file, and the action was that a folder named qb64pe was automatically created on my desktop.

Then I made a double click on that folder and the  result was to open this folder.

Then, I made a double click on the setup_osx.command file and the compilation failed.

That's it.

Is that what you think is "broken"?

So, should I do the installation via a terminal session and start the install process via the command line?

If so, that's totaly OK and fine with me but it's a serious regression of the use of the macOS GUI, isn't it?

Looking forward.

Cheers.
Fifi


RE: QB64 Phoenix Edition v3.3.0 Released! - DSMan195276 - 10-24-2022

To clarify, it is supposed to work the way you described, the current version is bugged and does not. The instructions I gave are how you could fix the existing v3.3.0 version to work, and in the next version this should be fixed.


RE: QB64 Phoenix Edition v3.3.0 Released! - Fifi - 10-24-2022

(10-24-2022, 03:58 AM)DSMan195276 Wrote: To clarify, it is supposed to work the way you described, the current version is bugged and does not. The instructions I gave are how you could fix the existing v3.3.0 version to work, and in the next version this should be fixed.

OK, both solutions (command line and GUI) are fine with me.

Thank you for your help, time and concern.

Cheers.
Fifi


RE: QB64 Phoenix Edition v3.3.0 Released! - Pete - 10-25-2022

Curious as to why the IDE file menu changed.

Older format:

NEW
OPEN
SAVE
SAVE AS
(6) Most recent files
Recent...

Our new version lists only (3) of the most recent, and Clear Recent has replaced the much desired Recent... selection.

Maybe this menu can be customized?

Love our new PE desktop icon, btw.

Pete