2
0
Эх сурвалжийг харах

* Changes for better MUI support

git-svn-id: trunk@1835 -
Károly Balogh 19 жил өмнө
parent
commit
2ec1678cc1

+ 1 - 0
.gitattributes

@@ -3783,6 +3783,7 @@ rtl/morphos/inputevent.pas svneol=native#text/plain
 rtl/morphos/intuition.pas svneol=native#text/plain
 rtl/morphos/layers.pas svneol=native#text/plain
 rtl/morphos/mui.pas -text
+rtl/morphos/muihelper.pas -text
 rtl/morphos/prt0.as -text
 rtl/morphos/sysdir.inc svneol=native#text/plain
 rtl/morphos/sysfile.inc svneol=native#text/plain

+ 41 - 2
rtl/morphos/aboxlib.pas

@@ -21,13 +21,22 @@ unit aboxlib;
 interface
 
 function DoMethod(obj : longword; msg : array of LongWord): longword;
+function DoMethod(obj : pointer; msg : array of LongWord): longword; inline;
 function DoMethodA(obj : longword; msg1 : Pointer): longword; assembler;
 
 function DoSuperMethod(class_: longword; obj : longword; msg : array of LongWord): longword;
 function DoSuperMethodA(class_: longword; obj : longword; msg1 : Pointer): longword; assembler;
+function DoSuperMethodA(class_: pointer; obj : pointer; msg1 : Pointer): longword; inline;
+
+function DoSuperNew(class_: pointer; obj: pointer; tags: array of LongWord): longword;
+
+// This procedure is used to pop dispatcher args from emulstruc
+procedure DISPATCHERARG(var cl; var obj; var msg); assembler;
 
 implementation
 
+uses intuition;
+
 function DoMethodA(obj : longword; msg1 : Pointer): longword; assembler;
 asm
   mflr r31
@@ -50,16 +59,21 @@ begin
   DoMethod:=DoMethodA(obj, @msg);
 end;
 
+function DoMethod(obj : pointer; msg : array of LongWord): longword; inline;
+begin
+  DoMethod:=DoMethodA(DWord(obj), @msg);
+end;
+
 function DoSuperMethodA(class_: longword; obj : longword; msg1 : Pointer): longword; assembler;
 asm
   mflr r31
 
-  stw r3,32(r2)
+  lwz r9,24(r3)
+  stw r9,32(r2)
   stw r5,36(r2)
   stw r4,40(r2)
 
   lwz r11,104(r2)
-  lwz r9,24(r3)
   lwz r3,8(r9)
   mtlr r11
   blrl
@@ -67,9 +81,34 @@ asm
   mtlr r31
 end ['R31'];
 
+function DoSuperMethodA(class_: pointer; obj : pointer; msg1 : Pointer): longword; inline;
+begin
+  DoSuperMethodA:=DoSuperMethodA(DWord(class_),DWord(obj),msg1);
+end;
+
 function DoSuperMethod(class_: longword; obj : longword; msg : array of LongWord): longword;
 begin
   DoSuperMethod:=DoSuperMethodA(class_, obj, @msg);
 end;
 
+function DoSuperNew(class_: pointer; obj: pointer; tags: array of LongWord): longword;
+var opSet: topSet;
+begin
+  opSet.MethodID := OM_NEW;
+  opSet.ops_AttrList := @tags;
+  opSet.ops_GInfo := nil;
+  DoSuperNew:=DoSuperMethodA(class_,obj,@opset);
+end;
+
+// This procedure is used to pop dispatcher args from emulstruc
+procedure DISPATCHERARG(var cl; var obj; var msg); assembler;
+asm
+  lwz r6,32(r2) // REG_a0
+  stw r6,(r3)   // cl
+  lwz r6,40(r2) // REG_a2
+  stw r6,(r4)   // obj
+  lwz r6,36(r2) // REG_a1
+  stw r6,(r5)   // msg
+end;
+
 end.

+ 7 - 0
rtl/morphos/intuition.pas

@@ -4346,6 +4346,8 @@ SysCall IntuitionBase 630;
 function NewObjectA(classPtr : pIClass location 'a0'; classID : PChar location 'a1'; tagList : pTagItem location 'a2') : POINTER;
 SysCall IntuitionBase 636;
 
+function NewObject(classPtr : pIClass; classID : PChar; tags: array of LongWord) : POINTER;
+
 procedure DisposeObject(object1 : POINTER location 'a0');
 SysCall IntuitionBase 642;
 
@@ -4489,6 +4491,11 @@ begin
   OpenWindowTags:=OpenWindowTagList(newWindow,@tagList);
 end;
 
+function NewObject(classPtr : pIClass; classID : PChar; tags: array of LongWord) : POINTER; inline;
+begin
+  NewObject:=NewObjectA(classPtr, classID, @tags);
+end;
+
 
 function INST_DATA (cl: pIClass; o: p_Object): Pointer;
 begin

+ 38 - 37
rtl/morphos/mui.pas

@@ -145,6 +145,9 @@ uses exec, intuition,utility,graphics{,iffparse};
      MUI_TRUE  = 1;
      MUI_FALSE = 0;
 
+  const
+     MUI_END = TAG_DONE; // this can be used instead of C End
+
   {
      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      Warning, some of the macros in this header file work only with
@@ -461,23 +464,23 @@ uses exec, intuition,utility,graphics{,iffparse};
        Control codes for text strings
                                                                                }
     { right justified  }
-       MUIX_R : PChar = '\033r';
+       MUIX_R  = #27+'r';
     { centered         }
-       MUIX_C : PChar = '\033c';
+       MUIX_C = #27+'c';
     { left justified   }
-       MUIX_L : PChar = '\033l';
+       MUIX_L = #27+'l';
     { normal      }
-       MUIX_N : PChar = '\033n';
+       MUIX_N = #27+'n';
     { bold        }
-       MUIX_B : PChar = '\033b';
+       MUIX_B = #27+'b';
     { italic      }
-       MUIX_I : PChar = '\033i';
+       MUIX_I = #27+'i';
     { underlined  }
-       MUIX_U : PChar = '\033u';
+       MUIX_U = #27+'u';
     { text pen            }
-       MUIX_PT : PChar = '\0332';
+       MUIX_PT = #27+'2';
     { highlight text pen  }
-       MUIX_PH : PChar = '\0338';
+       MUIX_PH = #27+'8';
     {
        Parameter structures for some classes
                                                                                }
@@ -3395,34 +3398,32 @@ uses exec, intuition,utility,graphics{,iffparse};
          end;
        p__dummyXFC2__ = ^t__dummyXFC2__;
 
-
     const
-
-        MUIKEY_RELEASE = -2;
-        MUIKEY_NONE    = -1;
-        MUIKEY_PRESS   = 0;
-        MUIKEY_TOGGLE  = 1;
-        MUIKEY_UP      = 2;
-        MUIKEY_DOWN    = 3;
-        MUIKEY_PAGEUP  = 4;
-        MUIKEY_PAGEDOWN = 5;
-        MUIKEY_TOP      = 6;
-        MUIKEY_BOTTOM   = 7;
-        MUIKEY_LEFT     = 8;
-        MUIKEY_RIGHT    = 9;
-        MUIKEY_WORDLEFT = 10;
-        MUIKEY_WORDRIGHT = 11;
-        MUIKEY_LINESTART = 12;
-        MUIKEY_LINEEND   = 13;
-        MUIKEY_GADGET_NEXT = 14;
-        MUIKEY_GADGET_PREV = 15;
-        MUIKEY_GADGET_OFF  = 16;
-        MUIKEY_WINDOW_CLOSE = 17;
-        MUIKEY_WINDOW_NEXT  = 18;
-        MUIKEY_WINDOW_PREV  = 19;
-        MUIKEY_HELP         = 20;
-        MUIKEY_POPUP        = 21;
-        MUIKEY_COUNT        = 22;
+       MUIKEY_RELEASE = -2;
+       MUIKEY_NONE    = -1;
+       MUIKEY_PRESS   = 0;
+       MUIKEY_TOGGLE  = 1;
+       MUIKEY_UP      = 2;
+       MUIKEY_DOWN    = 3;
+       MUIKEY_PAGEUP  = 4;
+       MUIKEY_PAGEDOWN = 5;
+       MUIKEY_TOP      = 6;
+       MUIKEY_BOTTOM   = 7;
+       MUIKEY_LEFT     = 8;
+       MUIKEY_RIGHT    = 9;
+       MUIKEY_WORDLEFT = 10;
+       MUIKEY_WORDRIGHT = 11;
+       MUIKEY_LINESTART = 12;
+       MUIKEY_LINEEND   = 13;
+       MUIKEY_GADGET_NEXT = 14;
+       MUIKEY_GADGET_PREV = 15;
+       MUIKEY_GADGET_OFF  = 16;
+       MUIKEY_WINDOW_CLOSE = 17;
+       MUIKEY_WINDOW_NEXT  = 18;
+       MUIKEY_WINDOW_PREV  = 19;
+       MUIKEY_HELP         = 20;
+       MUIKEY_POPUP        = 21;
+       MUIKEY_COUNT        = 22;
 
        MUIKEYF_PRESS = 1 shl MUIKEY_PRESS;
        MUIKEYF_TOGGLE = 1 shl MUIKEY_TOGGLE;
@@ -3982,7 +3983,7 @@ end;
 const
   { Change VERSION and LIBVERSION to proper values }
   VERSION : string[2] = '19';
-  LIBVERSION : longword = 19;
+  LIBVERSION : longword = MUIMASTER_VMIN;
 
 var
   muimaster_exit : Pointer;

+ 268 - 0
rtl/morphos/muihelper.pas

@@ -0,0 +1,268 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2005 Karoly Balogh
+
+    MUI helper functions for MorphOS/PowerPC
+
+    Based on work of Nils Sjoholm member of the Amiga RTL
+    development team.
+
+    MorphOS port was done on a free Pegasos II/G4 machine
+    provided by Genesi S.a.r.l. <www.genesi.lu>
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+unit muihelper;
+
+interface
+
+uses intuition, mui, doslib, utility;
+
+
+const
+  NoFrame          = MUIV_Frame_None;
+  ButtonFrame      = MUIV_Frame_Button;
+  ImageButtonFrame = MUIV_Frame_ImageButton;
+  TextFrame        = MUIV_Frame_Text;
+  StringFrame      = MUIV_Frame_String;
+  ReadListFrame    = MUIV_Frame_ReadList;
+  InputListFrame   = MUIV_Frame_InputList;
+  PropFrame        = MUIV_Frame_Prop;
+  SliderFrame      = MUIV_Frame_Slider;
+  GaugeFrame       = MUIV_Frame_Gauge;
+  VirtualFrame     = MUIV_Frame_Virtual;
+  GroupFrame       = MUIV_Frame_Group;
+
+const
+  Child          = MUIA_Group_Child;
+  SubWindow      = MUIA_Application_Window;
+  WindowContents = MUIA_Window_RootObject;
+
+
+// Creates a MUI application
+function MH_Application(tags: array of LongWord): pObject_;
+function MH_Application(var app; tags: array of LongWord): pObject_;
+
+// Creates a MUI window
+function MH_Window(tags: array of LongWord): pObject_;
+function MH_Window(var win; tags: array of LongWord): pObject_;
+
+// Creates a MUI button
+function MH_MakeButton(blabel: pchar): pObject_;
+function MH_MakeButton(var button; blabel: pchar): pObject_;
+
+// Creates a MUI HBar
+function MH_MakeHBar(space: longword): pObject_;
+function MH_MakeHBar(var hbar; space: longword): pObject_;
+
+// Creates MUI V/HGroup
+function MH_VGroup(tags: array of LongWord): pObject_;
+function MH_VGroup(frame: longword; tags: array of LongWord): pObject_;
+function MH_VGroup(title: PChar; tags: array of LongWord): pObject_;
+function MH_HGroup(tags: array of LongWord): pObject_;
+function MH_HGroup(frame: longword; tags: array of LongWord): pObject_;
+function MH_HGroup(title: PChar; tags: array of LongWord): pObject_;
+
+// Creates MUI Col/RowGroup
+function MH_ColGroup(cols: longword; tags: array of LongWord): pObject_;
+function MH_ColGroup(cols: longword; frame: longword; tags: array of LongWord): pObject_;
+function MH_ColGroup(cols: longword; title: PChar; tags: array of LongWord): pObject_;
+function MH_RowGroup(rows: longword; tags: array of LongWord): pObject_;
+function MH_RowGroup(rows: longword; frame: longword; tags: array of LongWord): pObject_;
+function MH_RowGroup(rows: longword; title: PChar; tags: array of LongWord): pObject_;
+
+
+// Creates a MUI Text area
+function MH_Text(contents: PChar): pObject_;
+function MH_Text(contents: PChar; tags: array of LongWord): pObject_;
+function MH_Text(var text_; contents: PChar): pObject_;
+function MH_Text(var text_; contents: PChar; tags: array of LongWord): pObject_;
+
+
+implementation
+
+
+// Creates a MUI application
+// ************************************************************************
+function MH_Application(tags: array of LongWord): pObject_;
+begin
+  MH_Application:=MUI_NewObject(MUIC_Application, tags);
+end;
+
+function MH_Application(var app; tags: array of LongWord): pObject_;
+begin
+  pObject_(app):=MUI_NewObject(MUIC_Application, tags);
+  MH_Application:=pObject_(app);
+end;
+
+
+// Creates a MUI window
+// ************************************************************************
+function MH_Window(tags: array of LongWord): pObject_;
+begin
+  MH_Window:=MUI_NewObject(MUIC_Window, tags);
+end;
+
+function MH_Window(var win; tags: array of LongWord): pObject_;
+begin
+  pObject_(win):=MUI_NewObject(MUIC_Window, tags);
+  MH_Window:=pObject_(win);
+end;
+
+
+// Creates a MUI button
+// ************************************************************************
+function MH_MakeButton(blabel: pchar): pObject_;
+begin
+ MH_MakeButton:=MUI_MakeObject(MUIO_Button, [DWord(blabel)]);
+end;
+
+function MH_MakeButton(var button; blabel: pchar): pObject_;
+begin
+ pObject_(button):=MUI_MakeObject(MUIO_Button, [DWord(blabel)]);
+ MH_MakeButton:=pObject_(button);
+end;
+
+
+// Creates a MUI HBar
+// ************************************************************************
+function MH_MakeHBar(space: longword): pObject_;
+begin
+ MH_MakeHBar:=MUI_MakeObject(MUIO_HBar, [space]);
+end;
+
+function MH_MakeHBar(var hbar; space: longword): pObject_;
+begin
+ pObject_(hbar):=MUI_MakeObject(MUIO_HBar, [space]);
+ MH_MakeHBar:=pObject_(hbar);
+end;
+
+
+// Creates a MUI VGroup
+// ************************************************************************
+function MH_VGroup(tags: array of LongWord): pObject_;
+begin
+  MH_VGroup:=MUI_NewObject(MUIC_Group, tags);
+end;
+
+function MH_VGroup(frame: longword; tags: array of LongWord): pObject_;
+begin
+  MH_VGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Frame, frame, TAG_MORE, DWord(@tags) ] );
+end;
+
+function MH_VGroup(title: PChar; tags: array of LongWord): pObject_;
+begin
+  MH_VGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Frame,      MUIV_Frame_Group, 
+                                         MUIA_FrameTitle, longword(title), 
+                                         MUIA_Background, MUII_GroupBack,
+                                         TAG_MORE, DWord(@tags) ]);
+end;
+
+
+// Creates a MUI HGroup
+// ************************************************************************
+function MH_HGroup(tags: array of LongWord): pObject_;
+begin
+  MH_HGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Horiz, MUI_TRUE, TAG_MORE, DWord(@tags) ]);
+end;
+
+function MH_HGroup(frame: longword; tags: array of LongWord): pObject_;
+begin
+  MH_HGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Horiz, MUI_TRUE, 
+                                         MUIA_Frame,       frame, 
+                                         TAG_MORE, DWord(@tags) ] );
+end;
+
+function MH_HGroup(title: PChar; tags: array of LongWord): pObject_;
+begin
+  MH_HGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Horiz, MUI_TRUE,
+                                         MUIA_Frame,       MUIV_Frame_Group, 
+                                         MUIA_FrameTitle,  longword(title), 
+                                         MUIA_Background,  MUII_GroupBack,
+                                         TAG_MORE, DWord(@tags) ]);
+end;
+
+
+// Creates MUI ColGroup
+// ************************************************************************
+function MH_ColGroup(cols: longword; tags: array of LongWord): pObject_;
+begin
+  MH_ColGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Columns, cols, TAG_MORE, DWord(@tags) ]);
+end;
+
+function MH_ColGroup(cols: longword; frame: longword; tags: array of LongWord): pObject_;
+begin
+  MH_ColGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Columns, cols, 
+                                           MUIA_Frame,         frame, 
+                                           TAG_MORE, DWord(@tags) ]);
+end;
+
+function MH_ColGroup(cols: longword; title: PChar; tags: array of LongWord): pObject_;
+begin
+  MH_ColGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Columns, cols,
+                                           MUIA_Frame,         MUIV_Frame_Group, 
+                                           MUIA_FrameTitle,    longword(title), 
+                                           MUIA_Background,    MUII_GroupBack,
+                                           TAG_MORE, DWord(@tags) ]);
+end;
+
+
+// Creates MUI RowGroup
+// ************************************************************************
+function MH_RowGroup(rows: longword; tags: array of LongWord): pObject_;
+begin
+  MH_RowGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Rows, rows, TAG_MORE, DWord(@tags) ]);
+end;
+
+function MH_RowGroup(rows: longword; frame: longword; tags: array of LongWord): pObject_;
+begin
+  MH_RowGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Rows, rows, 
+                                           MUIA_Frame,      frame, 
+                                           TAG_MORE, DWord(@tags) ]);
+end;
+
+function MH_RowGroup(rows: longword; title: PChar; tags: array of LongWord): pObject_;
+begin
+  MH_RowGroup:=MUI_NewObject(MUIC_Group, [ MUIA_Group_Rows, rows,
+                                           MUIA_Frame,      MUIV_Frame_Group, 
+                                           MUIA_FrameTitle, longword(title), 
+                                           MUIA_Background, MUII_GroupBack,
+                                           TAG_MORE, DWord(@tags) ]);
+end;
+
+
+// Creates a MUI text area
+// ************************************************************************
+function MH_Text(contents: PChar): pObject_;
+begin
+ MH_Text:=MUI_NewObject(MUIC_Text,[ MUIA_Text_Contents, DWord(contents), TAG_DONE ]);
+end;
+
+function MH_Text(contents: PChar; tags: array of LongWord): pObject_;
+begin
+ MH_Text:=MUI_NewObject(MUIC_Text,[ MUIA_Text_Contents, DWord(contents), 
+                                       TAG_MORE, DWord(@tags) ]);
+end;
+
+function MH_Text(var text_; contents: PChar): pObject_;
+begin
+ pObject_(text_):=MUI_NewObject(MUIC_Text,[ MUIA_Text_Contents, DWord(contents), TAG_DONE ]);
+ MH_Text:=pObject_(text_);
+end;
+
+function MH_Text(var text_; contents: PChar; tags: array of LongWord): pObject_;
+begin
+ pObject_(text_):=MUI_NewObject(MUIC_Text,[ MUIA_Text_Contents, DWord(contents), 
+                                      TAG_MORE, DWord(@tags) ]);
+ MH_Text:=pObject_(text_);
+end;
+
+
+end.

+ 16 - 1
rtl/morphos/utility.pp

@@ -15,7 +15,7 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
  **********************************************************************}
-
+{$inline on}
 unit utility;
 
 interface
@@ -30,8 +30,23 @@ var
 {$include utild2.inc}
 {$include utilf.inc}
 
+function TAG(value: pointer): longword; inline;
+function TAG(value: pchar): longword; inline;
+
+
 implementation
 
+function TAG(value: pointer): longword; inline;
+begin
+  TAG:=longword(value);
+end;
+
+function TAG(value: pchar): longword; inline;
+begin
+  TAG:=longword(value);
+end;
+
+
 begin
   UtilityBase:=MOS_UtilityBase;
 end.