;
;       Title                  : Font menu creation for RISC OS 3
;       System                 : Menu library
;       Version                : 1.0
;       Copyright              : (c) Ben Summers
;       Date                   : 21 Oct 94
;       Author                 : Ben Summers
;
;       Function               : Makes a font menu
;
;
;       Modification history.
;
;       Version                :
;       Date                   :
;       Author                 :
;       Changes                :
;
;
;============================================================================
;
;  Include files.
;
;============================================================================
;
        GET     Desk.sh.regdefs
        GET     ^.h.swinos
        GET     Desk.sh.macros
;
;============================================================================
;
;  Code.
;
;============================================================================
;
        PREAMBLE

Desk_XFont_ListFonts EQU &40091 + Desk_XOS_Bit
Desk_XFont_DecodeMenu EQU &400A0 + Desk_XOS_Bit

        IMPORT  Desk_DeskMem_Free
        IMPORT  Desk_DeskMem_Malloc

          ; a1 = Desk_bool sysfont
          ; a2 = char *tick

        STARTCODE Desk_Menu_FontMenu3

        STMFD   sp!, {v1-v6, lr}
        MOV     v5, a1
        MOV     v6, a2

        BL      Desk_free_data

        MOV     a2, #0
        CMP     v5, #0
        MOVEQ   a3, #2_101000:SHL:16
        MOVNE   a3, #2_111000:SHL:16
        MOV     v1, #0
        MOV     v3, v6
        SWI     Desk_XFont_ListFonts
        BVS     Desk_exit_err

        MOV     v4, a4           ; size of font menu buffer
        MOV     v3, v2           ; size of indirected text buffer

        MOV     a1, a4
        BL      Desk_DeskMem_Malloc
        CMP     a1, #0           ; got a buffer?
        BEQ     Desk_exit_err
        MOV     v1, a1           ; store it...
        MOV     a1, v3           ; ind data
        BL      Desk_DeskMem_Malloc
        CMP     a1, #0
        BEQ     Desk_no_ind_block
        STR     a1, Desk_fontmenu_ind
        STR     v1, Desk_fontmenu_def ; store the pointers

        MOV     a2, v1           ; font menu definition
        CMP     v5, #0
        MOVEQ   a3, #2_101000:SHL:16
        MOVNE   a3, #2_111000:SHL:16
        MOV     a4, v4           ; size of font menu buffer
        MOV     v1, a1           ; indirected data
        MOV     v2, v3           ; size of ind data
        MOV     v3, v6
        SWI     Desk_XFont_ListFonts
        BVS     Desk_exit_err_free

; SWI 256+7
Desk_exit_err
        LDR     a1, Desk_fontmenu_def
        LDMFD   sp!, {v1-v6, pc}^

Desk_no_ind_block
        MOV     a1, v1
        BL      Desk_DeskMem_Free            ; doesn't preseve flags
        B       Desk_exit_err

Desk_exit_err_free
        BL      Desk_free_data
        B       Desk_exit_err

Desk_free_data
        STMFD   sp!, {lr}
        LDR     a1, Desk_fontmenu_def
        CMP     a1, #0
        BLNE    Desk_DeskMem_Free
        LDR     a1, Desk_fontmenu_ind
        CMP     a1, #0
        BLNE    Desk_DeskMem_Free
        MOV     a1, #0
        STR     a1, Desk_fontmenu_def
        STR     a1, Desk_fontmenu_ind
        LDMFD   sp!, {pc}^

        EXPORT  Desk_Menu_FontMenuDecode3

          ; a1 = pointer to selection
Desk_Menu_FontMenuDecode3
        STMFD   sp!, {v1-v4, lr}
        MOV     v4, a1
        MOV     a3, a1
        MOV     a1, #0
        LDR     a2, Desk_fontmenu_def
        MOV     a4, #0           ; find size of answer
        SWI     Desk_XFont_DecodeMenu
        BVS     Desk_mfmd_err

        LDR     a1, Desk_answer_size
        CMP     a1, v1
        BGE     Desk_mfmd_got_enough

        LDR     a1, answer
        BL      Desk_DeskMem_Free
        MOV     a1, v1
        BL      Desk_DeskMem_Malloc
        STR     a1, answer
        CMP     a1, #0
        BEQ     Desk_mfmd_err
        STR     v1, Desk_answer_size

Desk_mfmd_got_enough

        MOV     a1, #0
        LDR     a2, Desk_fontmenu_def
        MOV     a3, v4
        LDR     a4, answer
        SWI     Desk_XFont_DecodeMenu
        BVS     Desk_mfmd_err

        LDR     a1, answer
        LDMFD   sp!, {v1-v4, pc}^

Desk_mfmd_err
        MOV     a1, #0
        LDMFD   sp!, {v1-v4, pc}^

Desk_menu_fontmenu
Desk_fontmenu_def    ; these should really be in an area of their own... but what the hell...
        DCD     0
Desk_fontmenu_ind
        DCD     0
answer
        DCD     0
Desk_answer_size
        DCD     0

        EXPORT  Desk_menu_fontmenu

          ; two seperate variables instead of one large block to help fit the blocks into
          ; odd places in the heap

        END
