MODULE Desktop; IMPORT OS; VAR desktopRunning: CHAR; desktopWindow: ARRAY WINDOW_STRUCT_SIZE OF CHAR; desktopIcons: ARRAY 5 OF Fox32OSButtonWidget; desktopDiskIcon: ARRAY 4096 OF CHAR; PROCEDURE DesktopMain(hasIcons: CHAR; iconsResPtr: PTR;); VAR tempDskIconResPtr: PTR; BEGIN desktopRunning := 1; (* if icons.res was loaded, then pull the `dsk` resource from it *) IF hasIcons THEN tempDskIconResPtr := get_resource(iconsResPtr, "dsk", 4096); IF tempDskIconResPtr THEN copy_memory_bytes(tempDskIconResPtr, PTROF(desktopDiskIcon), 4096); free_memory(tempDskIconResPtr); END; END; (* set up the desktop icon widgets *) SetupDesktopIconStructs(); (* create the window and make it fully transparent, mark it as "always background", and draw the icons to it *) new_window(PTROF(desktopWindow), "Desktop", 640, 448, 0, 16, 0, PTROF(desktopIcons)); fill_overlay(000000000H, get_window_overlay_number(PTROF(desktopWindow))); set_window_flags(000000001H, PTROF(desktopWindow)); DrawDesktopIcons(PTROF(desktopWindow)); WHILE desktopRunning DO GetNextWindowEvent(PTROF(desktopWindow)); (* mouse click event *) IF eventArgs[0] = PTROF(EVENT_TYPE_MOUSE_CLICK) THEN handle_widget_click(PTROF(desktopWindow), eventArgs[1], eventArgs[2]); (* button click event *) ELSIF eventArgs[0] = PTROF(EVENT_TYPE_BUTTON_CLICK) THEN HandleDesktopIconClick(eventArgs[1]); END; save_state_and_yield_task(); END; END; PROCEDURE HandleDesktopIconClick(buttonId: INT;); VAR i, x, y, w, h: INT; icon: POINTER TO Fox32OSButtonWidget; BEGIN (* draw the expanding box animation *) i := 0; icon := PTROF(desktopIcons[buttonId]); WHILE i <| 16 DO x := RSH(icon^.x *| (16 - i) + 64 *| i, 4); y := RSH(icon^.y *| (16 - i) + 64 *| i, 4); w := RSH(32 *| (16 - i) + 384 *| i, 4); h := RSH(32 *| (16 - i) + 192 *| i, 4); DrawWireframeBox(get_window_overlay_number(PTROF(desktopWindow)), x, y, w, h, 020F0F0F0H); sleep_task(10); draw_filled_rectangle_to_overlay(x, y, w, h, 0, get_window_overlay_number(PTROF(desktopWindow))); i := i + 1; END; (* redraw the icons *) DrawDesktopIcons(PTROF(desktopWindow)); (* launch a new instance of Fetcher *) IF launch_fxf_from_disk("fetcher.fxf", get_boot_disk_id(), 0FFFFFFFFH, buttonId, icon^.x, icon^.y, PTROF(desktopWindow)) = 0FFFFFFFFH THEN new_messagebox("Failed to start new", "instance of fetcher.fxf", 0, 64, 64, 200); END; END; PROCEDURE DrawDesktopIcons(desktopWin: PTR;); VAR i, y, overlay: INT; BEGIN IF desktopWin = 0 THEN RETURN(); END; (* draw the buttons themselves *) draw_widgets_to_window(desktopWin); (* set the tilemap and draw the icons! *) set_tilemap(PTROF(desktopDiskIcon), 32, 32); overlay := get_window_overlay_number(desktopWin); i := 5; y := 16; WHILE i DO draw_tile_to_overlay(0, 592, y, overlay); y := y + 64; i := i - 1; END; END; PROCEDURE SetupDesktopIconStructs(); VAR desktopIcon: POINTER TO Fox32OSButtonWidget; prevDesktopIcon: POINTER TO Fox32OSButtonWidget; BEGIN desktopIcon := PTROF(desktopIcons[0]); desktopIcon^.type := WIDGET_TYPE_BUTTON; desktopIcon^.next := PTROF(desktopIcons[1]); desktopIcon^.id := 0; desktopIcon^.text := "Disk 0"; desktopIcon^.fgColor := 0FF000000H; desktopIcon^.bgColor := 0FFFFFFFFH; desktopIcon^.width := 32; desktopIcon^.height := 32 + 16; desktopIcon^.x := 592; desktopIcon^.y := 16; prevDesktopIcon := desktopIcon; desktopIcon := PTROF(desktopIcons[1]); desktopIcon^.type := WIDGET_TYPE_BUTTON; desktopIcon^.next := PTROF(desktopIcons[2]); desktopIcon^.id := 1; desktopIcon^.text := "Disk 1"; desktopIcon^.fgColor := 0FF000000H; desktopIcon^.bgColor := 0FFFFFFFFH; desktopIcon^.width := 32; desktopIcon^.height := 32 + 16; desktopIcon^.x := 592; desktopIcon^.y := prevDesktopIcon^.y + 32 + 32; prevDesktopIcon := desktopIcon; desktopIcon := PTROF(desktopIcons[2]); desktopIcon^.type := WIDGET_TYPE_BUTTON; desktopIcon^.next := PTROF(desktopIcons[3]); desktopIcon^.id := 2; desktopIcon^.text := "Disk 2"; desktopIcon^.fgColor := 0FF000000H; desktopIcon^.bgColor := 0FFFFFFFFH; desktopIcon^.width := 32; desktopIcon^.height := 32 + 16; desktopIcon^.x := 592; desktopIcon^.y := prevDesktopIcon^.y + 32 + 32; prevDesktopIcon := desktopIcon; desktopIcon := PTROF(desktopIcons[3]); desktopIcon^.type := WIDGET_TYPE_BUTTON; desktopIcon^.next := PTROF(desktopIcons[4]); desktopIcon^.id := 3; desktopIcon^.text := "Disk 3"; desktopIcon^.fgColor := 0FF000000H; desktopIcon^.bgColor := 0FFFFFFFFH; desktopIcon^.width := 32; desktopIcon^.height := 32 + 16; desktopIcon^.x := 592; desktopIcon^.y := prevDesktopIcon^.y + 32 + 32; prevDesktopIcon := desktopIcon; desktopIcon := PTROF(desktopIcons[4]); desktopIcon^.type := WIDGET_TYPE_BUTTON; desktopIcon^.next := 0; desktopIcon^.id := 4; desktopIcon^.text := "Disk 4"; desktopIcon^.fgColor := 0FF000000H; desktopIcon^.bgColor := 0FFFFFFFFH; desktopIcon^.width := 32; desktopIcon^.height := 32 + 16; desktopIcon^.x := 592; desktopIcon^.y := prevDesktopIcon^.y + 32 + 32; END; END.