home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / desktop / newbar / Source / s / handler next >
Text File  |  1998-07-30  |  16KB  |  622 lines

  1.  
  2.  AREA    |Module$$Code|, CODE, READONLY
  3.  GET    OS:hdr.OSModule
  4.  GET    OS:hdr.Wimp
  5.  GET    OS:hdr.WimpReadSysInfo
  6.  GET    hdr.ibpatch
  7.  GET    hdr.debug
  8.  
  9.  
  10. ; The following SWIs are patched.
  11. ; Details of what they are patched to do are given below:
  12.  
  13.  EXPORT    pre_wimp_createicon
  14.  EXPORT    pre_wimp_deleteicon
  15.  EXPORT    pre_wimp_createmenu
  16.  EXPORT    pre_wimp_getwindowstate
  17.  EXPORT    pre_wimp_getwindowinfo
  18.  EXPORT    pre_wimp_seticonstate
  19.  EXPORT pre_wimp_geticonstate
  20.  EXPORT    pre_wimp_forceredraw
  21.  EXPORT    pre_wimp_whichicon
  22.  EXPORT    pre_wimp_dragbox
  23.  EXPORT    pre_wimp_getwindowoutline
  24.  EXPORT    pre_wimp_sendmessage
  25.  EXPORT    post_wimp_getpointerinfo
  26.  EXPORT pre_wimp_resizeicon
  27.  
  28.  
  29. ; Patch Wimp_CreateIcon
  30. ; If you try to create an iconbar icon, the request is queued.
  31. ; A unique iconbar icon handle is returned, and our counter incremented.
  32.  
  33. pre_wimp_createicon
  34. createicon_extra    RN 6
  35. createicon_block    RN 7
  36. createicon_element    RN 8
  37.  
  38.  stmfd    sp!, {r0-r3, r6-r8, lr}
  39.  ldr    r2, [r1, #0]
  40.  cmp    r2, #-1
  41.  cmpne    r2, #-2
  42.  cmpne    r2, #-3
  43.  cmpne    r2, #-4
  44.  cmpne    r2, #-5
  45.  cmpne    r2, #-6
  46.  cmpne    r2, #-7
  47.  cmpne    r2, #-8
  48.  ldmnefds sp!, {r0-r3, r6-r8, pc}
  49.  
  50.  DEBUG_MSG    "Wimp_CreateIcon called for iconbar, returned handle ", 0
  51.  
  52.  mov    createicon_extra, r0
  53.  mov    createicon_block, r1
  54.  
  55. ; create new element to add
  56.  mov    r0, #OSModule_Alloc
  57.  mov    r3, #element_add_size
  58.  swi    XOS_Module
  59.  bvs    pre_wimp_createicon_error
  60.  mov    createicon_element, r2
  61.  mov    r0, #element_add_type
  62.  str    r0, [createicon_element, #element_type]
  63.  mov    r0, #0
  64.  str    r0, [createicon_element, #element_next]
  65.  
  66. ; store the icon's position and priority
  67.  ldr    r0, [createicon_block, #0]
  68.  str    r0, [createicon_element, #element_add_position]
  69.  str    createicon_extra, [createicon_element, #element_add_priority]
  70.  
  71. ; copy icon flags
  72.  ldr    r0, [createicon_block, #20]
  73.  str    r0, [createicon_element, #element_add_icon_flags]
  74. ; copy icon data
  75.  ldr    r0, [createicon_block, #24+(4*0)]
  76.  str    r0, [createicon_element, #element_add_icon_data+(4*0)]
  77.  ldr    r0, [createicon_block, #24+(4*1)]
  78.  str    r0, [createicon_element, #element_add_icon_data+(4*1)]
  79.  ldr    r0, [createicon_block, #24+(4*2)]
  80.  str    r0, [createicon_element, #element_add_icon_data+(4*2)]
  81.  
  82. ; store and update icon handle
  83.  ldr    r0, [r12, #block_icon_count]
  84.  DEBUG_INT    r0
  85.  DEBUG_MSG    "", 10
  86.  str    r0, [createicon_element, #element_add_icon]
  87.  mov    r9, r0
  88.  add    r0, r0, #1
  89.  str    r0, [r12, #block_icon_count]
  90.  
  91. ; store task handle
  92.  mov    r0, #WimpReadSysInfo_Task
  93.  swi    XWimp_ReadSysInfo
  94.  bvs    pre_wimp_createicon_error
  95.  str    r0, [createicon_element, #element_add_task]
  96.  
  97. ; add element at end of list
  98.  ldr    r1, [r12, #block_list_end]
  99.  str    createicon_element, [r1]
  100.  add    r0, createicon_element, #element_next
  101.  str    r0, [r12, #block_list_end]
  102.  
  103. ; increment count of list elements
  104.  ldr    r0, [r12, #block_list_count]
  105.  add    r0, r0, #1
  106.  str    r0, [r12, #block_list_count]
  107.  
  108. ; and return
  109.  ldmfd    sp!, {r0-r3, r6-r8, lr}
  110.  mov    r0, r9
  111.  mov    r9, #-1
  112.  movs    pc, lr
  113. pre_wimp_createicon_error
  114.  mov    r12, r0
  115.  ldmfd    sp!, {r0-r3, r6-r8, lr}
  116.  mov    r0, r12
  117.  mov    r9, #-1
  118.  mov    pc, lr
  119.  
  120.  
  121. ; Patch Wimp_DeleteIcon
  122. ; Queues requests to delete iconbar icons.
  123. ; This means that invalid icon handles are not caught, but that doesn't
  124. ; really matter.
  125.  
  126. pre_wimp_deleteicon
  127. deleteicon_block    RN 7
  128. deleteicon_element    RN 8
  129.  
  130.  stmfd    sp!, {r0-r3, r7-r8, lr}
  131.  ldr    r0, [r1, #0]
  132.  cmp    r0, #-2
  133.  cmpne    r0, #-1
  134.  ldmnefds sp!, {r0-r3, r7-r8, pc}
  135.  
  136.  DEBUG_MSG    "Wimp_DeleteIcon called for the iconbar, handle ", 0
  137.  
  138.  mov    deleteicon_block, r1
  139.  
  140. ; create new element to add
  141.  mov    r0, #OSModule_Alloc
  142.  mov    r3, #element_remove_size
  143.  swi    XOS_Module
  144.  mov    deleteicon_element, r2
  145.  mov    r0, #element_remove_type
  146.  str    r0, [deleteicon_element, #element_type]
  147.  mov    r0, #0
  148.  str    r0, [deleteicon_element, #element_next]
  149.  
  150. ; copy icon handle
  151.  ldr    r0, [deleteicon_block, #4]
  152.  DEBUG_INT    r0
  153.  DEBUG_MSG    "", 10
  154.  str    r0, [deleteicon_element, #element_remove_icon]
  155.  
  156. ; add element at end of list
  157.  ldr    r1, [r12, #block_list_end]
  158.  str    deleteicon_element, [r1]
  159.  add    r0, deleteicon_element, #element_next
  160.  str    r0, [r12, #block_list_end]
  161.  
  162. ; increment count of list elements
  163.  ldr    r0, [r12, #block_list_count]
  164.  add    r0, r0, #1
  165.  str    r0, [r12, #block_list_count]
  166.  
  167. ; and return
  168.  mov    r9, #-1
  169.  ldmfds    sp!, {r0-r3, r7-r8, pc}
  170.  
  171.  
  172. ; Patch Wimp_CreateMenu
  173. ; The position of the menu can be shifted by a given amount, and
  174. ; its title can even be removed if you want.
  175.  
  176. pre_wimp_createmenu
  177.  DEBUG_MSG    "Wimp_CreateMenu called and adjusted", 10
  178.  
  179. ; move x co-ordinate
  180.  stmfd    sp!, {r4-r5, lr}
  181.  ldr    r4, [r12, #block_x_offset]
  182.  add    r2, r2, r4
  183.  
  184. ; move y co-ordinate
  185.  ldr    r5, [r12, #block_flags]
  186.  and    r5, r5, #block_flag_y_absolute
  187.  cmp    r5, #0
  188.  ldr    r4, [r12, #block_y_offset]
  189.  addeq    r3, r3, r4
  190.  movne    r3, r4
  191.  
  192. ; remove title if necessary
  193.  ldr    r5, [r12, #block_flags]
  194.  and    r5, r5, #block_flag_remove_title
  195.  cmp    r5, #0
  196.  movne    r4, #0
  197.  strneb    r4, [r1]
  198.  
  199. ; reset values
  200.  mov    r4, #0
  201.  str    r4, [r12, #block_x_offset]
  202.  str    r4, [r12, #block_y_offset]
  203.  ldmfds    sp!, {r4-r5, pc}
  204.  
  205.  
  206. ; Patch Wimp_GetWindowState
  207. ; If someone tries to read the state of the iconbar, they'll get the
  208. ; pre-recorded state set by our client task.  It isn't very useful, but
  209. ; Alarm seems to need it.
  210.  
  211. pre_wimp_getwindowstate
  212.  stmfd    sp!, {r0-r5, lr}
  213. ; is this operating on the iconbar?
  214.  ldr    r0, [r1]
  215.  cmp    r0, #-2
  216.  cmpne    r0, #-1
  217.  ldmnefds sp!, {r0-r5, pc}
  218.  
  219.  DEBUG_MSG    "Wimp_GetWindowState called for the iconbar", 10
  220.  
  221. ; fill out the block from what we've been told
  222. ; r0 is the source, r1 is the destination
  223.  add    r0, r12, #block_iconbar_state + 4
  224.  add    r1, r1, #4
  225. ; transfer 32 bytes
  226.  ldmia    r0!, {r2-r5}
  227.  stmia    r1!, {r2-r5}
  228.  ldmia    r0!, {r2-r5}
  229.  stmia    r1!, {r2-r5}
  230. ; and return, claiming the SWI with a smile on our faces
  231.  mov    r9, #-1
  232.  ldmfds    sp!, {r0-r5, pc}
  233.  
  234.  
  235. ; Patch Wimp_GetWindowInfo
  236. ; If called for the iconbar, this will return initially the same info as
  237. ; Wimp_GetWindowState.  Beyond that, the rest of the block will be zeroed.
  238. ; It won't list icons.  Not terribly useful.
  239.  
  240. pre_wimp_getwindowinfo
  241.  stmfd    sp!, {r0-r5, lr}
  242. ; is this operating on the iconbar?
  243. ; make sure to clear the option bit of r1 first
  244.  bic    r1, r1, #1
  245.  ldr    r0, [r1]
  246.  cmp    r0, #-2
  247.  cmpne    r0, #-1
  248.  ldmnefds sp!, {r0-r5, pc}
  249.  
  250.  DEBUG_MSG    "Wimp_GetWindowInfo called for the iconbar", 10
  251.  
  252. ; fill out the block from what we've been told
  253. ; the first 32 bytes (after the handle) are as for GetWindowState
  254. ; r0 is the source, r1 is the destination
  255.  add    r0, r12, #block_iconbar_state + 4
  256.  add    r1, r1, #4
  257. ; transfer 32 bytes
  258.  ldmia    r0!, {r2-r5}
  259.  stmia    r1!, {r2-r5}
  260.  ldmia    r0!, {r2-r5}
  261.  stmia    r1!, {r2-r5}
  262. ; now fill the rest with zeros (56 bytes worth)
  263. ; if you were looking for an icon list, that's tough
  264.  mov    r2, #0
  265.  mov    r3, #0
  266.  mov    r4, #0
  267.  mov    r5, #0
  268.  stmia    r1!, {r2-r5}
  269.  stmia    r1!, {r2-r5}
  270.  stmia    r1!, {r2-r5}
  271.  stmia    r1!, {r2-r3}
  272. ; and return, claiming the SWI with fingers crossed
  273.  mov    r9, #-1
  274.  ldmfds    sp!, {r0-r5, pc}
  275.  
  276. ;; complain atm
  277. ; ldmfd    sp!, {r0-r1, lr}
  278. ; adr    r0, error_get_window_info
  279. ; mov    r9, #-1
  280. ; orrs    pc, lr, #V
  281. ;
  282. ;; our complaint
  283. ;error_get_window_info
  284. ; DCD    0
  285. ; = "IconbarPatch can't handle Wimp_GetWindowInfo on the iconbar", 0
  286. ; ALIGN
  287.  
  288.  
  289. ; Patch Wimp_SetIconState
  290. ; If this applies to the iconbar, the call is queued.
  291. ; Bad icon handles will not be noticed at this stage.
  292.  
  293. pre_wimp_seticonstate
  294. seticonstate_block    RN 7
  295. seticonstate_element    RN 8
  296.  
  297.  stmfd    sp!, {r0-r3, r7-r8, lr}
  298.  ldr    r0, [r1, #0]
  299.  cmp    r0, #-2
  300.  cmpne    r0, #-1
  301.  ldmnefds sp!, {r0-r3, r7-r8, pc}
  302.  
  303.  DEBUG_MSG    "Wimp_SetIconState called for the iconbar, handle ", 0
  304.  
  305.  mov    seticonstate_block, r1
  306.  
  307. ; create new element to add
  308.  mov    r0, #OSModule_Alloc
  309.  mov    r3, #element_update_size
  310.  swi    XOS_Module
  311.  mov    seticonstate_element, r2
  312.  mov    r0, #element_update_type
  313.  str    r0, [seticonstate_element, #element_type]
  314.  mov    r0, #0
  315.  str    r0, [seticonstate_element, #element_next]
  316.  
  317. ; copy icon handle
  318.  ldr    r0, [seticonstate_block, #4]
  319.  DEBUG_INT    r0
  320.  DEBUG_MSG    "", 10
  321.  str    r0, [seticonstate_element, #element_update_icon]
  322.  
  323. ; copy bic and eor words
  324.  ldr    r0, [seticonstate_block, #12]
  325.  str    r0, [seticonstate_element, #element_update_bic]
  326.  ldr    r0, [seticonstate_block, #8]
  327.  str    r0, [seticonstate_element, #element_update_eor]
  328.  
  329. ; add element at end of list
  330.  ldr    r1, [r12, #block_list_end]
  331.  str    seticonstate_element, [r1]
  332.  add    r0, seticonstate_element, #element_next
  333.  str    r0, [r12, #block_list_end]
  334.  
  335. ; increment count of list elements
  336.  ldr    r0, [r12, #block_list_count]
  337.  add    r0, r0, #1
  338.  str    r0, [r12, #block_list_count]
  339.  
  340. ; and return
  341.  mov    r9, #-1
  342.  ldmfds    sp!, {r0-r3, r7-r8, pc}
  343.  
  344.  
  345. ; Patch Wimp_GetIconState
  346. ; If this is applied to the iconbar, it will return some bogus information.
  347. ; This is necessary to get Alarm to accept iconbar mouse clicks.  It seems
  348. ; to want to know the x co-ordinates of the icon.
  349.  
  350. pre_wimp_geticonstate
  351.  stmfd    sp!, {r0-r3, lr}
  352.  ldr    r0, [r1]
  353.  cmp    r0, #-2
  354.  cmpne    r0, #-1
  355.  ldmnefds sp!, {r0-r3, pc}
  356.  
  357.  [ :DEF:DEBUG
  358.  DEBUG_MSG    "Wimp_GetIconState called for the iconbar, handle ", 0
  359.  ldr    r0, [r1, #4]
  360.  DEBUG_INT    r0
  361.  ]
  362.  
  363. ; fill in bogus bounding box information
  364.  mov    r0, #1000
  365.  str    r0, [r1, #8 + 0]
  366.  add    r0, r0, #68
  367.  str    r0, [r1, #8 + 8]
  368.  mov    r0, #0
  369.  str    r0, [r1, #8 + 4]
  370.  add    r0, r0, #68
  371.  str    r0, [r1, #8 + 12]
  372.  
  373. ; look for this icon in the queue of icons to add
  374. ; r2 is a pointer to the current element
  375.  ldr    r2, [r12, #block_list_begin]
  376. pre_wimp_geticonstate_loop
  377. ; if this is the end, fill in zero icon flags and data
  378.  cmp    r2, #0
  379.  beq    pre_wimp_geticonstate_bogus
  380. ; if this isn't the add type, look at the next element
  381.  ldr    r0, [r2, #element_type]
  382.  cmp    r0, #element_add_type
  383. ; if this isn't the right icon handle either, look at the next element
  384.  ldreq    r0, [r2, #element_add_icon]
  385.  ldreq    r3, [r1, #4]
  386.  cmpeq    r0, r3
  387. ; right, we're going to look at the next element then
  388.  ldrne    r2, [r2, #element_next]
  389.  bne    pre_wimp_geticonstate_loop
  390. ; this is the add type, so fill in correct info
  391.  ldr    r0, [r2, #element_add_icon_flags]
  392.  str    r0, [r1, #8 + 16]
  393.  ldr    r0, [r2, #element_add_icon_data + 0]
  394.  str    r0, [r1, #8 + 16 + 4 + 0]
  395.  ldr    r0, [r2, #element_add_icon_data + 4]
  396.  str    r0, [r1, #8 + 16 + 4 + 4]
  397.  ldr    r0, [r2, #element_add_icon_data + 8]
  398.  str    r0, [r1, #8 + 16 + 4 + 8]
  399.  DEBUG_MSG    ", good info", 10
  400. ; and finish
  401.  b    pre_wimp_geticonstate_finish
  402.  
  403. ; fill in zero icon flags and data
  404. pre_wimp_geticonstate_bogus
  405.  mov    r0, #0
  406.  str    r0, [r1, #8 + 16]
  407.  str    r0, [r1, #8 + 20]
  408.  str    r0, [r1, #8 + 24]
  409.  str    r0, [r1, #8 + 28]
  410.  DEBUG_MSG    ", bogus info", 10
  411.  
  412. ; claim the SWI and joyously return
  413. pre_wimp_geticonstate_finish
  414.  mov    r9, #-1
  415.  ldmfds    sp!, {r0-r3, pc}
  416.  
  417.  
  418. ; Patch Wimp_ForceRedraw
  419. ; This is ignored if applied to the iconbar, with no error.
  420. ; It doesn't matter, because ForceRedrawing the iconbar isn't very useful
  421. ; (you don't know where your icon will be) -- people should use
  422. ; Wimp_SetIconState instead.
  423.  
  424. pre_wimp_forceredraw
  425. ; simply mask out if it applies to iconbar
  426.  cmp    r0, #-2
  427.  moveq    r9, #-1
  428.  [ :DEF:DEBUG
  429.  beq    pre_wimp_forceredraw_debug
  430.  ]
  431.  movs    pc, lr
  432.  
  433.  [ :DEF:DEBUG
  434. pre_wimp_forceredraw_debug
  435.  DEBUG_MSG    "Wimp_ForceRedraw called for the iconbar -- ignored", 10
  436.  movs    pc, lr
  437.  ]
  438.  
  439.  
  440. ; Patch Wimp_WhichIcon
  441. ; Give an error if applied to the iconbar.
  442. ; This call really is especially useless on the iconbar, and I shouldn't
  443. ; think anyone uses it luckily (it only returns for your own icons, so its
  444. ; most useful task -- finding the iconbar icons that exist -- is ruled out).
  445.  
  446. pre_wimp_whichicon
  447. ; does it apply to the iconbar?
  448.  cmp    r0, #-2
  449.  cmpne    r0, #-1
  450.  movnes    pc, lr
  451.  
  452. ; yes, it does
  453.  DEBUG_MSG    "Wimp_WhichIcon called for the iconbar -- error", 10
  454.  adr    r0, error_which_icon
  455.  mov    r9, #-1
  456.  orrs    pc, lr, #V
  457.  
  458. ; our complaint
  459. error_which_icon
  460.  DCD    0
  461.  = "IconbarPatch can't handle Wimp_WhichIcon on the iconbar", 0
  462.  ALIGN
  463.  
  464.  
  465. ; Patch Wimp_DragBox
  466. ; This can allegedly be applied to the iconbar, but no-one does, and it's
  467. ; horrible anyway.  So we return an error.
  468.  
  469. pre_wimp_dragbox
  470. ; does it apply to iconbar?
  471.  stmfd    sp!, {r0-r1, lr}
  472. ; if this is a drag cancellation, let it through
  473.  cmp    r1, #0
  474.  ldmlefds sp!, {r0-r1, pc}
  475. ; if this doesn't apply to the iconbar, let it through
  476.  ldr    r0, [r1]
  477.  cmp    r0, #-2
  478.  cmpne    r0, #-1
  479.  ldmnefds sp!, {r0-r1, pc}
  480.  
  481. ; complain if it does
  482.  DEBUG_MSG    "Wimp_DragBox called for the iconbar -- error", 10
  483.  ldmfd    sp!, {r0-r1, lr}
  484.  adr    r0, error_drag_box
  485.  mov    r9, #-1
  486.  orrs    pc, lr, #V
  487.  
  488. ; our complaint
  489. error_drag_box
  490.  DCD    0
  491.  = "IconbarPatch can't handle Wimp_DragBox with respect to the iconbar", 0
  492.  ALIGN
  493.  
  494.  
  495. ; Patch Wimp_SendMessage
  496. ; This patch is complementary to the one for Wimp_GetPointerInfo.  That
  497. ; made our client's iconbar look like the real iconbar, now this forwards
  498. ; messages to iconbar icons onto their owners.
  499.  
  500. pre_wimp_sendmessage
  501. ; was this message sent to an iconbar icon?
  502.  stmfd    sp!, {r0, lr}
  503.  cmp    r2, #-2
  504.  ldmnefds sp!, {r0, pc}
  505.  
  506.  DEBUG_MSG    "Wimp_SendMessage called for the iconbar", 10
  507.  
  508. ; now check that the icon passed is the one we know about
  509.  ldr    r0, [r12, #block_pointer_icon]
  510.  cmp    r0, r3
  511. ; if it is, change the iconbar handle to the correct task handle and return
  512.  ldreq    r2, [r12, #block_pointer_task]
  513.  ldmeqfds sp!, {r0, pc}
  514.  
  515. ; if it isn't the icon we know about, panic with an error
  516.  ldmfd    sp!, {r0, lr}
  517.  adr    r0, error_send_message
  518.  mov    r9, #-1
  519.  orrs    pc, lr, #V
  520.  
  521. ; our complaint
  522. error_send_message
  523.  DCD    0
  524.  = "IconbarPatch couldn't handle a Wimp_SendMessage to the iconbar because "
  525.  = "it didn't know about the icon in question", 0
  526.  ALIGN
  527.  
  528.  
  529. ; Patch Wimp_GetWindowOutline
  530. ; This is sometimes used in the same way as Wimp_GetWindowState on the
  531. ; iconbar.  In particular, ResEd uses it.  Luckily, we can use the same
  532. ; data provided by the client for Wimp_GetWindowState to fill a reply in.
  533.  
  534. pre_wimp_getwindowoutline
  535. ; does it apply to iconbar?
  536.  stmfd    sp!, {r0-r1, lr}
  537.  ldr    r0, [r1]
  538.  cmp    r0, #-2
  539.  cmpne    r0, #-1
  540.  ldmnefds sp!, {r0-r1, pc}
  541.  
  542.  DEBUG_MSG    "Wimp_GetWindowOutline called for the iconbar", 10
  543.  
  544. ; if it does, fill out the block: copy co-ordinates
  545.  ldr    r0, [r12, #block_iconbar_state + 4]
  546.  str    r0, [r1, #4]
  547.  ldr    r0, [r12, #block_iconbar_state + 8]
  548.  str    r0, [r1, #8]
  549.  ldr    r0, [r12, #block_iconbar_state + 12]
  550.  str    r0, [r1, #12]
  551.  ldr    r0, [r12, #block_iconbar_state + 16]
  552.  str    r0, [r1, #16]
  553. ; and return, whilst claiming the SWI as one of our own
  554.  mov    r9, #-1
  555.  ldmfds    sp!, {r0-r1, pc}
  556.  
  557.  
  558. ; Patch Wimp_GetPointerInfo
  559. ; This fiddles the returned data to make our client's window appear to be
  560. ; the iconbar.  If the window handles match, it changes the returned window
  561. ; handle to the iconbar, and the icon handle to the one our client fills in.
  562.  
  563. post_wimp_getpointerinfo
  564. ; is the pointer over the window we want to patch?
  565.  stmfd    sp!, {r2-r3, lr}
  566.  ldr    r2, [r1, #12]
  567.  ldr    r3, [r12, #block_window]
  568.  cmp    r2, r3
  569.  ldmnefd sp!, {r2-r3, pc}
  570.  
  571.  [ :DEF:DEBUG
  572.  DEBUG_MSG    "Wimp_GetPointerInfo called for the iconbar, changed icon handle ", 0
  573.  ldr    r3, [r1, #16]
  574.  DEBUG_INT    r3
  575.  DEBUG_MSG    " to ", 0
  576.  ldr    r3, [r12, #block_pointer_icon]
  577.  DEBUG_INT    r3
  578.  DEBUG_MSG    "", 10
  579.  ]
  580.  
  581. ; if so, fill in the altered icon handle
  582.  ldr    r3, [r12, #block_pointer_icon]
  583.  str    r3, [r1, #16]
  584. ; and change the window handle
  585.  mov    r3, #-2
  586.  str    r3, [r1, #12]
  587.  ldmfd    sp!, {r2-r3, pc}
  588.  
  589.  
  590. ; Patch Wimp_ResizeIcon
  591. ; Just give an error if you try to resize an iconbar icon.  It's not very
  592. ; useful anyway.
  593.  
  594. pre_wimp_resizeicon
  595. ; Does it apply to the iconbar?
  596.  cmp    r0, #-1
  597.  movnes    pc, lr
  598.  
  599. ; Yes, it does.
  600.  DEBUG_MSG    "Wimp_ResizeIcon called for the iconbar -- error", 10
  601.  adr    r0, error_resize_icon
  602.  mov    r9, #-1
  603.  orrs    pc, lr, #V
  604.  
  605. ; Our complaint.
  606. error_resize_icon
  607.  DCD    0
  608.  = "IconbarPatch can't handle Wimp_ResizeIcon on the iconbar", 0
  609.  ALIGN
  610.  
  611.  
  612. ;; The errors we return at nasty tasks doing nasty things.
  613. ;; (Yeah, like this module isn't nasty or anything. ;-) )
  614. ;
  615. ;cant_handle_error
  616. ; DCD    0
  617. ; = "IconbarPatch couldn't handle the SWI that was called", 0
  618. ; ALIGN
  619.  
  620.  
  621.  END
  622.