diff --git a/Makefile b/Makefile index 333ffcb..7764c41 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ base_image/terminal.fxf: applications/terminal/main.asm $(wildcard applications/ base_image/fetcher.fxf: applications/fetcher/Fetcher.okm $(wildcard applications/fetcher/*.okm) $(GFX2INC) 32 32 applications/fetcher/icons/disk.png applications/fetcher/icons/disk.inc lua $(OKAMERON) -arch=fox32 -startup=applications/fetcher/start.asm $< \ + applications/fetcher/About.okm \ applications/fetcher/Browser.okm \ applications/fetcher/Desktop.okm \ applications/fetcher/OS.okm \ diff --git a/applications/fetcher/About.okm b/applications/fetcher/About.okm new file mode 100644 index 0000000..2948fba --- /dev/null +++ b/applications/fetcher/About.okm @@ -0,0 +1,36 @@ +MODULE About; + IMPORT OS; + + VAR aboutRunning: CHAR; + aboutWindow: ARRAY 36 OF CHAR; + + PROCEDURE AboutMain(); + BEGIN + aboutRunning := 1; + + new_window(PTROF(aboutWindow), "About", 256, 192, 192, 144, 0, 0); + DrawAboutWindow(); + + WHILE aboutRunning DO + GetNextWindowEvent(PTROF(aboutWindow)); + + (* mouse release event *) + IF eventArgs[0] = PTROF(EVENT_TYPE_MOUSE_RELEASE) THEN + destroy_window(PTROF(aboutWindow)); + aboutRunning := 0; + END; + + save_state_and_yield_task(); + END; + END; + + PROCEDURE DrawAboutWindow(); + VAR overlay: INT; + BEGIN + overlay := get_window_overlay_number(PTROF(aboutWindow)); + fill_overlay(0FF674764H, overlay); + draw_str_to_overlay("fox32", 16, 16, 0FFFFFFFFH, 0FF674764H, overlay); + draw_str_to_overlay("the computer made with love", 16, 32, 0FFFFFFFFH, 0FF674764H, overlay); + draw_filled_rectangle_to_overlay(4, 56, 248, 2, 0FFFFFFFFH, overlay); + END; +END. diff --git a/applications/fetcher/Browser.okm b/applications/fetcher/Browser.okm index 056322e..118b754 100644 --- a/applications/fetcher/Browser.okm +++ b/applications/fetcher/Browser.okm @@ -1,5 +1,5 @@ MODULE Browser; - IMPORT OS, Desktop; + IMPORT OS, About, Desktop; VAR browserRunning: CHAR; browserWindow: ARRAY 36 OF CHAR; @@ -11,6 +11,7 @@ MODULE Browser; browserDiskId: INT; browserFileList: ARRAY 341 OF CHAR; + EXTERN browserMenuItemsRoot: POINTER TO CHAR; EXTERN browserFileListFriendly: ARRAY 12 OF POINTER TO CHAR; PROCEDURE BrowserMain(diskId, iconX, iconY: INT; desktopWin: PTR;); @@ -36,7 +37,7 @@ MODULE Browser; browserDiskId := diskId; (* create the window and draw its initial contents *) - new_window(PTROF(browserWindow), "Fetcher", 384, 192, 64, 64, 0, PTROF(browserIcons)); + new_window(PTROF(browserWindow), "Fetcher", 384, 192, 64, 64, PTROF(browserMenuItemsRoot), PTROF(browserIcons)); DrawBrowserWindow(); WHILE browserRunning DO @@ -53,6 +54,22 @@ MODULE Browser; END; handle_widget_click(PTROF(browserWindow), eventArgs[1], eventArgs[2]); + (* menu bar click event *) + ELSIF eventArgs[0] = PTROF(EVENT_TYPE_MENU_BAR_CLICK) THEN + menu_bar_click_event(PTROF(browserMenuItemsRoot)); + + (* menu update event *) + ELSIF eventArgs[0] = PTROF(EVENT_TYPE_MENU_UPDATE) THEN + menu_update_event(); + + (* menu click event *) + ELSIF eventArgs[0] = PTROF(EVENT_TYPE_MENU_CLICK) THEN + MenuClickEvent(eventArgs[2], eventArgs[3]); + + (* menu ack event *) + ELSIF eventArgs[0] = PTROF(EVENT_TYPE_MENU_ACK) THEN + close_menu(PTROF(browserMenuItemsRoot)); + (* button click event *) ELSIF eventArgs[0] = PTROF(EVENT_TYPE_BUTTON_CLICK) THEN HandleIconClick(eventArgs[1]); @@ -71,10 +88,26 @@ MODULE Browser; (* previous page button *) DecrementBrowserPage(); ELSE + (* an icon was clicked! *) LaunchFromIcon(buttonId); END; END; + PROCEDURE MenuClickEvent(rootIndex, itemIndex: INT;); + BEGIN + IF rootIndex = 0 THEN + (* System menu *) + IF itemIndex = 0 THEN + (* About fox32os *) + + (* DIRTY HACK WARNING!!! *) + close_menu(PTROF(browserMenuItemsRoot)); + + AboutMain(); + END; + END; + END; + PROCEDURE DrawBrowserWindow(); BEGIN fill_window(0FFFFFFFFH, PTROF(browserWindow)); diff --git a/applications/fetcher/start.asm b/applications/fetcher/start.asm index 266dd2c..f09fbc8 100644 --- a/applications/fetcher/start.asm +++ b/applications/fetcher/start.asm @@ -77,6 +77,16 @@ browserFile9: data.fill 0, 13 browserFile10: data.fill 0, 13 browserFile11: data.fill 0, 13 +browserMenuItemsRoot: + data.8 1 ; number of menus + data.32 menu_items_system_list data.32 menu_items_system_name ; pointer to menu list, pointer to menu name +menu_items_system_name: + data.8 6 data.strz "System" ; text length, text, null-terminator +menu_items_system_list: + data.8 1 ; number of items + data.8 7 ; menu width (usually longest item + 2) + data.8 5 data.strz "About" ; text length, text, null-terminator + diskIcon: #include "icons/disk.inc"