2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
5 Desc: Base class for console units
11 #include <proto/intuition.h>
12 #include <proto/utility.h>
13 #include <aros/asmcall.h>
14 #include <devices/conunit.h>
15 #include <intuition/classes.h>
16 #include <intuition/intuition.h>
20 #include <aros/debug.h>
22 #include "consoleif.h"
23 #include "console_gcc.h"
27 VOID
normalizecoords(Object
*o
, WORD
*x_ptr
, WORD
*y_ptr
);
30 Base class for the classes handling standard, charmap and snipmap
31 consoles. This is a whitebox base class (like GADGETCLASS), which means subclasses
32 can have direct access to its instance data.
37 struct intConUnit intunit
;
42 #define ConsoleDevice ((struct ConsoleBase *)cl->cl_UserData)
44 /*********************
46 *********************/
47 static Object
*console_new(Class
*cl
, Object
*o
, struct opSet
*msg
)
50 EnterFunc(bug("Console::New()\n"));
51 struct Library
*UtilityBase
;
53 UtilityBase
= TaggedOpenLibrary(TAGGEDOPEN_UTILITY
);
55 ReturnPtr ("Console::New", Object
*, NULL
);
57 /* Get console window */
58 win
= (struct Window
*)GetTagData(A_Console_Window
, 0, msg
->ops_AttrList
);
59 CloseLibrary(UtilityBase
);
61 ReturnPtr ("Console::New", Object
*, NULL
);
64 o
= (Object
*)DoSuperMethodA(cl
, o
, (Msg
)msg
);
68 struct consoledata
*data
;
69 struct RastPort
*rp
= win
->RPort
;
72 data
= INST_DATA(cl
, o
);
74 unit
= (struct ConUnit
*)data
;
76 memset(data
, 0, sizeof(struct consoledata
));
78 /* Initialize the unit fields */
79 unit
->cu_Window
= win
;
82 /* For now one should use only non-proportional fonts */
83 unit
->cu_XRSize
= rp
->Font
->tf_XSize
;
84 unit
->cu_YRSize
= rp
->Font
->tf_YSize
;
86 D(bug("cu_XRSize: %d, cu_YRSize: %d\n",
87 unit
->cu_XRSize
, unit
->cu_YRSize
));
89 /* Use whole window for console. */
90 unit
->cu_XMax
= (win
->Width
- (win
->BorderLeft
+ win
->BorderRight
)) / unit
->cu_XRSize
- 1;
91 unit
->cu_YMax
= (win
->Height
- (win
->BorderTop
+ win
->BorderBottom
)) / unit
->cu_YRSize
- 1;
93 unit
->cu_XROrigin
= win
->Flags
& WFLG_GIMMEZEROZERO
? 0 : win
->BorderLeft
;
94 unit
->cu_YROrigin
= win
->Flags
& WFLG_GIMMEZEROZERO
? 0 : win
->BorderTop
;
96 D(bug("cu_XROrigin: %d, cu_YROrigin: %d\n",
97 unit
->cu_XROrigin
, unit
->cu_YROrigin
));
99 unit
->cu_XRExtant
= unit
->cu_XROrigin
+ (unit
->cu_XRSize
* (unit
->cu_XMax
+ 1) - 1);
100 unit
->cu_YRExtant
= unit
->cu_YROrigin
+ (unit
->cu_YRSize
* (unit
->cu_YMax
+ 1) - 1);
102 unit
->cu_XCP
= DEF_CHAR_XMIN
;
103 unit
->cu_YCP
= DEF_CHAR_YMIN
;
105 unit
->cu_XCCP
= DEF_CHAR_XMIN
;
106 unit
->cu_YCCP
= DEF_CHAR_YMIN
;
108 for(i
= 0; i
< MAXTABS
- 1; i
++)
110 unit
->cu_TabStops
[i
] = i
* 8;
112 unit
->cu_TabStops
[i
] = (UWORD
)-1;
114 ICU(o
)->conFlags
= 0UL;
115 ICU(o
)->numStoredChars
= 0;
117 NEWLIST(&ICU(o
)->pasteData
);
119 SET_MODE(o
, PMB_ASM
); /* auto-scroll-mode ON */
120 SET_MODE(o
, PMB_AWM
); /* auto-wrap-mode ON */
122 /* RKM: Default mode is SET */
123 SET_MODE(o
, M_LNM
); /* linefeed mode = linefeed+carriage return */
126 ReturnPtr("Console::New", Object
*, o
);
129 /**********************
130 ** Console::Left() **
131 **********************/
132 static VOID
console_left(Class
*cl
, Object
*o
, struct P_Console_Left
*msg
)
136 EnterFunc(bug("Console::Left()\n"));
138 newx
= XCCP
- msg
->Num
;
140 if (CHECK_MODE(o
, PMB_AWM
))
142 WORD scrollcount
= 0;
144 while(newx
< CHAR_XMIN(o
))
146 newx
+= (CHAR_XMAX(o
) + 1);
152 Console_Up(o
, scrollcount
);
157 if (newx
< CHAR_XMIN(o
)) newx
= CHAR_XMIN(o
);
160 XCP
= XCCP
= newx
; /* XCP always same as XCCP?? */
162 D(bug("XCP=%d, XCCP=%d\n", XCP
, XCCP
));
164 ReturnVoid("Console::Left");
167 /***********************
168 ** Console::Right() **
169 ***********************/
170 static VOID
console_right(Class
*cl
, Object
*o
, struct P_Console_Right
*msg
)
174 EnterFunc(bug("Console::Right()\n"));
176 newx
= XCCP
+ msg
->Num
;
178 if (CHECK_MODE(o
, PMB_AWM
))
180 WORD scrollcount
= 0;
182 while(newx
> CHAR_XMAX(o
))
184 newx
-= (CHAR_XMAX(o
) + 1);
190 Console_Down(o
, scrollcount
);
195 if (newx
> CHAR_XMAX(o
)) newx
= CHAR_XMAX(o
);
198 XCP
= XCCP
= newx
; /* XCP always same as XCCP?? */
200 D(bug("XCP=%d, XCCP=%d\n", XCP
, XCCP
));
202 ReturnVoid("Console::Right");
205 /********************
207 ********************/
208 static VOID
console_up(Class
*cl
, Object
*o
, struct P_Console_Up
*msg
)
210 EnterFunc(bug("Console::Up(num=%d)\n", msg
->Num
));
216 if (CHECK_MODE(o
, PMB_ASM
))
218 IPTR scroll_param
= -YCCP
;
221 Console_DoCommand(o
, C_SCROLL_DOWN
, 1, &scroll_param
);
228 YCP
= YCCP
; /* YCP always same as YCCP ?? */
230 D(bug("New coords: char (%d, %d), gfx (%d, %d)\n",
231 XCCP
, YCCP
, CP_X(o
), CP_Y(o
) ));
232 ReturnVoid("Console::Up");
237 /**********************
238 ** Console::Down() **
239 **********************/
240 static VOID
console_down(Class
*cl
, Object
*o
, struct P_Console_Down
*msg
)
242 EnterFunc(bug("Console::Down(num=%d)\n", msg
->Num
));
246 if (YCCP
> CHAR_YMAX(o
))
248 if (CHECK_MODE(o
, PMB_ASM
))
250 IPTR scroll_param
= YCCP
- CHAR_YMAX(o
);
252 YCCP
= YCP
= CHAR_YMAX(o
);
253 Console_DoCommand(o
, C_SCROLL_UP
, 1, &scroll_param
);
260 YCP
= YCCP
; /* YCP always same as YCCP ?? */
262 D(bug("New coords: char (%d, %d), gfx (%d, %d)\n",
263 XCCP
, YCCP
, CP_X(o
), CP_Y(o
) ));
264 ReturnVoid("Console::Down");
267 /***************************
268 ** Console::DoCommand() **
269 ***************************/
270 static VOID
console_docommand(Class
*cl
, Object
*o
, struct P_Console_DoCommand
*msg
)
272 EnterFunc(bug("Console::DoCommand(cmd=%d)\n", msg
->Command
));
274 switch (msg
->Command
)
277 D(bug("Set LF mode ON\n"));
279 /* ICU(o)->conFlags |= CF_LF_MODE_ON ; */
283 case C_RESET_LF_MODE
:
285 D(bug("Set LF mode OFF\n"));
286 /* ICU(o)->conFlags &= ~CF_LF_MODE_ON; */
287 CLEAR_MODE(o
, M_LNM
);
290 case C_SET_AUTOSCROLL_MODE
:
291 SET_MODE(o
, PMB_ASM
);
294 case C_RESET_AUTOSCROLL_MODE
:
295 CLEAR_MODE(o
, PMB_ASM
);
298 case C_SET_AUTOWRAP_MODE
:
299 SET_MODE(o
, PMB_AWM
);
302 case C_RESET_AUTOWRAP_MODE
:
303 CLEAR_MODE(o
, PMB_AWM
);
306 case C_SELECT_GRAPHIC_RENDITION
:
307 D(bug("Select graphic Rendition, params=%d\n", msg
->NumParams
));
311 for(i
= 0; i
< msg
->NumParams
; i
++)
313 param
= msg
->Params
[i
];
314 D(bug("param%d=%d\n", i
, param
));
321 CU(o
)->cu_TxFlags
= 0;
324 CU(o
)->cu_TxFlags
|= CON_TXTFLAGS_BOLD
;
330 CU(o
)->cu_TxFlags
|= CON_TXTFLAGS_ITALIC
;
333 CU(o
)->cu_TxFlags
|= CON_TXTFLAGS_UNDERLINED
;
336 CU(o
)->cu_TxFlags
|= CON_TXTFLAGS_REVERSED
;
339 CU(o
)->cu_TxFlags
|= CON_TXTFLAGS_CONCEALED
;
342 CU(o
)->cu_TxFlags
&= ~CON_TXTFLAGS_BOLD
;
345 CU(o
)->cu_TxFlags
&= ~CON_TXTFLAGS_ITALIC
;
348 CU(o
)->cu_TxFlags
&= ~CON_TXTFLAGS_UNDERLINED
;
351 CU(o
)->cu_TxFlags
&= ~CON_TXTFLAGS_REVERSED
;
354 CU(o
)->cu_TxFlags
&= ~CON_TXTFLAGS_CONCEALED
;
364 CU(o
)->cu_FgPen
= param
- 30;
378 CU(o
)->cu_BgPen
= param
- 40;
384 } /* switch(param) */
386 } /* for(i = 0; i < msg->NumParams; i++) */
391 case C_SET_RAWEVENTS
:
392 D(bug("Set Raw Events\n"));
396 for(i
= 0; i
< msg
->NumParams
; i
++)
398 param
= msg
->Params
[i
];
400 if (param
<= IECLASS_MAX
)
402 SET_RAWEVENT(o
, param
);
405 } /* for(i = 0; i < msg->NumParams; i++) */
409 case C_RESET_RAWEVENTS
:
410 D(bug("Set Raw Events\n"));
414 for(i
= 0; i
< msg
->NumParams
; i
++)
416 param
= msg
->Params
[i
];
418 if (param
<= IECLASS_MAX
)
420 RESET_RAWEVENT(o
, param
);
423 } /* for(i = 0; i < msg->NumParams; i++) */
427 } /* switch (msg->Command) */
429 ReturnVoid("Console::DoCommand");
432 /**********************************
433 ** Console::GetDefaultParams() **
434 **********************************/
435 static VOID
console_getdefaultparams(Class
*cl
, Object
*o
, struct P_Console_GetDefaultParams
*msg
)
437 switch (msg
->Command
)
442 case C_CURSOR_FORWARD
:
443 case C_CURSOR_BACKWARD
:
444 case C_CURSOR_NEXT_LINE
:
445 case C_CURSOR_PREV_LINE
:
446 case C_SET_TOP_OFFSET
:
447 case C_SET_PAGE_LENGTH
:
451 msg
->Params
[0] = YCCP
+ 1;
452 msg
->Params
[1] = XCCP
+ 1;
455 /* FIXME: Autodocs state commands in between here, has params RKRM: Devs saye the do not */
463 case C_CURSOR_TAB_CTRL
:
464 msg
->Params
[0] = 0; /* set tab */
468 case C_CURSOR_BACKTAB
:
472 case C_SELECT_GRAPHIC_RENDITION
:
473 /* don't do anything, as params may be in any order */
476 case C_SET_RAWEVENTS
:
477 /* don't do anything, as params may be in any order */
480 case C_RESET_RAWEVENTS
:
481 /* don't do anything, as params may be in any order */
484 } /* switch (msg->Command) */
489 /*******************************
490 ** Console::NewWindowSize() **
491 *******************************/
492 static VOID
console_newwindowsize(Class
*cl
, Object
*o
, struct P_Console_NewWindowSize
*msg
)
494 struct ConUnit
*unit
;
495 struct consoledata
*data
;
498 data
= INST_DATA(cl
, o
);
499 unit
= (struct ConUnit
*)data
;
501 win
= unit
->cu_Window
;
503 unit
->cu_XMax
= (win
->Width
- win
->BorderRight
- unit
->cu_XROrigin
) / unit
->cu_XRSize
- 1;
504 unit
->cu_YMax
= (win
->Height
- win
->BorderBottom
- unit
->cu_YROrigin
) / unit
->cu_YRSize
- 1;
506 unit
->cu_XRExtant
= unit
->cu_XROrigin
+ (unit
->cu_XRSize
* (unit
->cu_XMax
+ 1) - 1);
507 unit
->cu_YRExtant
= unit
->cu_YROrigin
+ (unit
->cu_YRSize
* (unit
->cu_YMax
+ 1) - 1);
509 if (unit
->cu_XCCP
> unit
->cu_XMax
) unit
->cu_XCCP
= unit
->cu_XMax
;
510 if (unit
->cu_YCCP
> unit
->cu_YMax
) unit
->cu_YCCP
= unit
->cu_YMax
;
512 unit
->cu_XCP
= unit
->cu_XCCP
;
513 unit
->cu_YCP
= unit
->cu_YCCP
;
520 /********* Console class dispatcher **********************************/
521 AROS_UFH3S(IPTR
, dispatch_consoleclass
,
522 AROS_UFHA(Class
*, cl
, A0
),
523 AROS_UFHA(Object
*, o
, A2
),
524 AROS_UFHA(Msg
, msg
, A1
)
531 switch (msg
->MethodID
)
534 retval
= (IPTR
)console_new(cl
, o
, (struct opSet
*)msg
);
538 console_left(cl
, o
, (struct P_Console_Left
*)msg
);
541 case M_Console_Right
:
542 console_right(cl
, o
, (struct P_Console_Right
*)msg
);
546 console_up(cl
, o
, (struct P_Console_Up
*)msg
);
550 console_down(cl
, o
, (struct P_Console_Down
*)msg
);
553 case M_Console_DoCommand
:
554 console_docommand(cl
, o
, (struct P_Console_DoCommand
*)msg
);
557 case M_Console_GetDefaultParams
:
558 console_getdefaultparams(cl
, o
, (struct P_Console_GetDefaultParams
*)msg
);
561 case M_Console_NewWindowSize
:
562 console_newwindowsize(cl
, o
, (struct P_Console_NewWindowSize
*)msg
);
566 retval
= DoSuperMethodA(cl
, o
, msg
);
576 /************************
577 ** normalizecoords() **
578 ************************/
580 /* Normalizes "out of window" coords, so that they
584 #define ABS(a) (((a) < 0) ? -(a) : (a))
588 #define ConsoleDevice ((struct ConsoleBase *)OCLASS(o)->cl_UserData)
590 /* FIXME: Currently dead code */
591 VOID
normalizecoords(Object
*o
, WORD
*x_ptr
, WORD
*y_ptr
)
593 EnterFunc(bug("normalizecoords(o=%p, x=%d, y=%d)\n",
596 if (*x_ptr
> CU(o
)->cu_XMax
) /* charpos too far to the right */
598 D(bug("Pos right of window\n"));
600 Console_Down(o
, *x_ptr
/ CHAR_XMAX(o
) );
603 *x_ptr
= *x_ptr
% (CHAR_XMAX(o
) - CHAR_XMIN(o
));
605 else if (*x_ptr
< CHAR_XMIN(o
))
607 D(bug("Pos left of window\n"));
610 Console_Up(o
, ABS(*x_ptr
) / CHAR_XMAX(o
) - CHAR_XMIN(o
) );
613 *x_ptr
= *x_ptr
% (CHAR_XMAX(o
) - CHAR_XMIN(o
));
617 if (*y_ptr
> CHAR_YMAX(o
)) /* pos below window bounds */
620 *y_ptr
= CHAR_YMAX(o
);
622 else if (*y_ptr
< CHAR_YMIN(o
))
624 UBYTE scroll_param
= CHAR_YMIN(o
) - *y_ptr
; /* pos above window bounds */
626 D(bug("Pos above window\n"));
628 Console_DoCommand(o
, C_SCROLL_DOWN
, 1, &scroll_param
);
630 *y_ptr
= CHAR_YMIN(o
);
634 ReturnVoid("normalizecoords");
641 Class
*makeConsoleClass(struct ConsoleBase
*ConsoleDevice
)
646 cl
= MakeClass(NULL
, ROOTCLASS
, NULL
, sizeof(struct consoledata
), 0UL);
649 cl
->cl_Dispatcher
.h_Entry
= (APTR
)dispatch_consoleclass
;
650 cl
->cl_Dispatcher
.h_SubEntry
= NULL
;
652 cl
->cl_UserData
= (IPTR
)ConsoleDevice
;