2 Copyright © 2009, The AROS Development Team. All rights reserved.
5 ASCIITable -- Insert characters to clipboard from GUI.
8 /******************************************************************************
16 CX_PRIORITY/N/K,CX_POPKEY/K,CX_POPUP/S
24 Insert characters to clipboard from GUI
28 CX_PRIORITY -- Priority of the ASCIITable broker
29 CX_POPKEY -- Hotkey combination for ASCIITable
30 CX_POPUP -- Appear at startup
44 ******************************************************************************/
46 #define MUIMASTER_YES_INLINE_STDARG
53 #include <aros/debug.h>
54 #include <aros/asmcall.h>
55 #include <aros/symbolsets.h>
56 #include <libraries/iffparse.h>
57 #include <libraries/mui.h>
58 #include <zune/customclasses.h>
59 #include <devices/clipboard.h>
61 #include <proto/muimaster.h>
62 #include <proto/locale.h>
63 #include <proto/intuition.h>
64 #include <proto/exec.h>
65 #include <proto/dos.h>
66 #include <proto/alib.h>
67 #include <proto/commodities.h>
68 #include <proto/utility.h>
73 #define CATALOG_NAME "System/Tools/Commodities.catalog"
74 #define CATALOG_VERSION 3
76 TEXT version
[] = "$VER: ASCIITable 1.1 (14.06.2009)";
78 #define ARG_TEMPLATE "CX_PRIORITY/N/K,CX_POPKEY/K,CX_POPUP/S"
79 #define DEF_POPKEY "ctrl alt a"
88 static Object
*app
, *wnd
;
89 static struct Catalog
*catalog
;
92 static struct Hook broker_hook
;
95 static char *cx_popkey
;
96 static BOOL cx_popup
= FALSE
;
98 static struct MsgPort
*brokermp
;
99 static struct Task
*maintask
;
101 static void Cleanup(CONST_STRPTR txt
);
102 static void GetArguments(int argc
, char **argv
);
103 static void HandleAll(void);
104 static void InitMenus(void);
105 static VOID
Locale_Deinitialize(VOID
);
106 static int Locale_Initialize(VOID
);
107 static void MakeGUI(void);
108 static void showSimpleMessage(CONST_STRPTR msgString
);
109 static CONST_STRPTR
_(ULONG id
);
111 static struct IOClipReq
*CBOpen(ULONG unit
);
112 static void CBClose(struct IOClipReq
*ior
);
113 static BOOL
CBWriteFTXT(struct IOClipReq
*ior
, CONST_STRPTR string
);
114 static BOOL
CBWriteLong(struct IOClipReq
*ior
, LONG
*ldata
);
116 /*** ASCIITable class *******************************************************/
120 #define ASCIITableObject BOOPSIOBJMACRO_START(ASCIITable_CLASS->mcc_Class)
122 #define MUIM_ASCIITable_Copy (TAG_USER | 1)
123 #define MUIM_ASCIITable_Clear (TAG_USER | 2)
124 #define MUIM_ASCIITable_Insert (TAG_USER | 3)
125 struct MUIP_ASCIITable_Insert
{STACKED ULONG MethodID
; STACKED LONG code
;};
127 struct ASCIITable_DATA
130 Object
*clear_button
;
131 Object
*ascii_string
;
132 TEXT buffer
[MAXLEN
+ 1];
133 struct IOClipReq
*clip_req
;
134 TEXT shorthelp
[192][20];
137 /*** CBOpen *****************************************************************/
138 static struct IOClipReq
*CBOpen(ULONG unit
)
141 struct IORequest
*ior
;
143 if ((mp
= CreatePort(0, 0)))
145 if ((ior
= (struct IORequest
*)CreateExtIO(mp
, sizeof(struct IOClipReq
))))
147 if (!(OpenDevice("clipboard.device", unit
, ior
, 0)))
149 return (struct IOClipReq
*)ior
;
158 /*** CBCLose ****************************************************************/
159 static void CBClose(struct IOClipReq
*ior
)
163 struct MsgPort
*mp
= ior
->io_Message
.mn_ReplyPort
;
165 CloseDevice((struct IORequest
*)ior
);
166 DeleteExtIO((struct IORequest
*)ior
);
171 /*** CBWriteFTXT ************************************************************/
172 static BOOL
CBWriteFTXT(struct IOClipReq
*ior
, CONST_STRPTR string
)
174 LONG length
, slen
, temp
;
180 slen
= strlen(string
);
183 length
= (odd
) ? slen
+1 : slen
;
189 CBWriteLong(ior
, (LONG
*) "FORM");
192 temp
= AROS_LONG2BE(length
);
193 CBWriteLong(ior
, &temp
);
194 CBWriteLong(ior
, (LONG
*) "FTXT");
195 CBWriteLong(ior
, (LONG
*) "CHRS");
196 temp
= AROS_LONG2BE(slen
);
197 CBWriteLong(ior
, &temp
);
199 ior
->io_Data
= (STRPTR
)string
;
200 ior
->io_Length
= slen
;
201 ior
->io_Command
= CMD_WRITE
;
202 DoIO((struct IORequest
*)ior
);
206 ior
->io_Data
= (APTR
)"";
208 DoIO((struct IORequest
*)ior
);
211 ior
->io_Command
=CMD_UPDATE
;
212 DoIO ((struct IORequest
*)ior
);
214 return ior
->io_Error
? FALSE
: TRUE
;
217 /*** WriteLong **************************************************************/
218 static BOOL
CBWriteLong(struct IOClipReq
*ior
, LONG
*ldata
)
220 ior
->io_Data
= (APTR
)ldata
;
222 ior
->io_Command
= CMD_WRITE
;
223 DoIO( (struct IORequest
*) ior
);
225 if (ior
->io_Actual
== 4)
227 return ior
->io_Error
? FALSE
: TRUE
;
233 /*** MakeButton *************************************************************/
234 static Object
*MakeButton(LONG code
)
236 char buffer
[2] = {0};
239 Object
*btn
= (Object
*)TextObject
,
241 MUIA_Font
, MUIV_Font_Button
,
242 MUIA_Text_Contents
, (IPTR
)buffer
,
243 MUIA_Text_PreParse
, (IPTR
)"\33c",
244 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
245 MUIA_Background
, MUII_ButtonBack
,
246 MUIA_CycleChain
, TRUE
,
251 /*** OM_NEW *****************************************************************/
252 IPTR
ASCIITable__OM_NEW(Class
*CLASS
, Object
*self
, struct opSet
*message
)
254 struct ASCIITable_DATA
*data
= NULL
;
255 Object
*copy_button
, *clear_button
, *ascii_string
, *key_group
;
256 struct TagItem key_group_tags
[200];
259 for (code
= 32 , i
= 0 ; code
< 128 ; code
++ , i
++)
261 key_group_tags
[i
].ti_Tag
= Child
;
262 key_group_tags
[i
].ti_Data
= (IPTR
)MakeButton(code
);
264 for (code
= 160 ; code
< 256 ; code
++, i
++)
266 key_group_tags
[i
].ti_Tag
= Child
;
267 key_group_tags
[i
].ti_Data
= (IPTR
)MakeButton(code
);
269 key_group_tags
[i
].ti_Tag
= MUIA_Group_Columns
;
270 key_group_tags
[i
].ti_Data
= 16;
271 key_group_tags
[++i
].ti_Tag
= TAG_DONE
;
272 key_group
= MUI_NewObjectA(MUIC_Group
, key_group_tags
);
274 self
= (Object
*) DoSuperNewTags
278 Child
, (IPTR
) (RectangleObject
,
279 MUIA_Rectangle_HBar
, TRUE
,
282 Child
, (IPTR
)(ascii_string
= (Object
*)StringObject
,
284 MUIA_String_MaxLen
, MAXLEN
,
286 Child
, (IPTR
) (HGroup
,
288 MUIA_Group_SameSize
, TRUE
,
290 Child
, (IPTR
) (copy_button
= SimpleButton(_(MSG_ASCIITABLE_GAD_COPY
))),
291 Child
, (IPTR
) (clear_button
= SimpleButton(_(MSG_ASCIITABLE_GAD_CLEAR
))),
293 TAG_MORE
, message
->ops_AttrList
298 /*-- Store important variables -------------------------------------*/
299 data
= INST_DATA(CLASS
, self
);
300 data
->copy_button
= copy_button
;
301 data
->clear_button
= clear_button
;
302 data
->ascii_string
= ascii_string
;
304 /*-- Setup notifications -------------------------------------------*/
307 copy_button
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
308 (IPTR
) self
, 1, MUIM_ASCIITable_Copy
312 clear_button
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
313 (IPTR
) self
, 1, MUIM_ASCIITable_Clear
316 for (i
= 0 ; i
< 192 ; i
++)
318 code
= (i
< 96) ? i
+ 32 : i
+ 64;
319 sprintf(data
->shorthelp
[i
], "%c\n%d\n0x%x", (int)code
, (int)code
, (unsigned int)code
);
320 set((Object
*)key_group_tags
[i
].ti_Data
, MUIA_ShortHelp
, data
->shorthelp
[i
]);
323 (Object
*)key_group_tags
[i
].ti_Data
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
324 (IPTR
) self
, 2, MUIM_ASCIITable_Insert
, code
327 data
->clip_req
= CBOpen(0);
330 showSimpleMessage(_(MSG_CANT_OPEN_CLIPDEVICE
));
337 /*** OM_DISPOSE *************************************************************/
338 IPTR
ASCIITable__OM_DISPOSE(Class
*CLASS
, Object
*self
, Msg message
)
340 struct ASCIITable_DATA
*data
= INST_DATA(CLASS
, self
);
342 CBClose(data
->clip_req
);
344 return DoSuperMethodA(CLASS
, self
, message
);
347 /*** MUIM_ASCIITable_Copy ***************************************************/
348 IPTR
ASCIITable__MUIM_ASCIITable_Copy(Class
*CLASS
, Object
*self
, Msg msg
)
350 struct ASCIITable_DATA
*data
= INST_DATA(CLASS
, self
);
351 CBWriteFTXT(data
->clip_req
, (CONST_STRPTR
)XGET(data
->ascii_string
, MUIA_String_Contents
));
355 /*** MUIM_ASCIITable_Clear **************************************************/
356 IPTR
ASCIITable__MUIM_ASCIITable_Clear(Class
*CLASS
, Object
*self
, Msg msg
)
358 struct ASCIITable_DATA
*data
= INST_DATA(CLASS
, self
);
359 data
->buffer
[0] = '\0';
360 set(data
->ascii_string
, MUIA_String_Contents
, "");
364 /*** MUIM_ASCIITable_Insert *************************************************/
365 IPTR
ASCIITable__MUIM_ASCIITable_Insert(Class
*CLASS
, Object
*self
, struct MUIP_ASCIITable_Insert
*msg
)
367 struct ASCIITable_DATA
*data
= INST_DATA(CLASS
, self
);
369 D(bug("insert code %d\n", msg
->code
));
370 strcpy(data
->buffer
, (CONST_STRPTR
)XGET(data
->ascii_string
, MUIA_String_Contents
));
371 len
= strlen(data
->buffer
);
374 data
->buffer
[len
] = msg
->code
;
375 data
->buffer
[len
+1] = '\0';
376 set(data
->ascii_string
, MUIA_String_Contents
, data
->buffer
);
381 /*** Setup ******************************************************************/
384 ASCIITable
, NULL
, MUIC_Group
, NULL
,
385 OM_NEW
, struct opSet
*,
387 MUIM_ASCIITable_Copy
, Msg
,
388 MUIM_ASCIITable_Clear
, Msg
,
389 MUIM_ASCIITable_Insert
, struct MUIP_ASCIITable_Insert
*
394 /*** Begin application ******************************************************/
397 static CONST_STRPTR
_(ULONG id
)
399 if (LocaleBase
!= NULL
&& catalog
!= NULL
)
401 return GetCatalogStr(catalog
, id
, CatCompArray
[id
].cca_Str
);
405 return CatCompArray
[id
].cca_Str
;
409 #define __(id) ((IPTR) _(id)) /* Get a message, as an IPTR */
411 /*** Locale_Initialize ******************************************************/
412 static int Locale_Initialize(VOID
)
414 if (LocaleBase
!= NULL
)
416 catalog
= OpenCatalog
418 NULL
, CATALOG_NAME
, OC_Version
, CATALOG_VERSION
, TAG_DONE
428 /*** Locale_Deinitialize ****************************************************/
429 static VOID
Locale_Deinitialize(VOID
)
431 if (LocaleBase
!= NULL
&& catalog
!= NULL
) CloseCatalog(catalog
);
434 /*** GetArguments ***********************************************************/
435 static void GetArguments(int argc
, char **argv
)
437 static struct RDArgs
*myargs
;
438 static IPTR args
[NUM_ARGS
];
439 static UBYTE
**wbargs
;
442 if (!(myargs
= ReadArgs(ARG_TEMPLATE
, args
, NULL
)))
444 Fault(IoErr(), 0, s
, 256);
447 if (args
[ARG_CXPRI
]) cx_pri
= *(LONG
*)args
[ARG_CXPRI
];
448 if (args
[ARG_CXPOPKEY
])
450 cx_popkey
= StrDup((char *)args
[ARG_CXPOPKEY
]);
454 cx_popkey
= StrDup(DEF_POPKEY
);
456 if (args
[ARG_CXPOPUP
]) cx_popup
= TRUE
;
461 wbargs
= ArgArrayInit(argc
, (UBYTE
**)argv
);
462 cx_pri
= ArgInt(wbargs
, "CX_PRIORITY", 0);
463 cx_popkey
= StrDup(ArgString(wbargs
, "CX_POPKEY", DEF_POPKEY
));
464 if (strnicmp(ArgString(wbargs
, "CX_POPUP", "NO"), "Y", 1) == 0)
470 D(bug("ASCIITable Arguments pri %d popkey %s popup %d\n", cx_pri
, cx_popkey
, cx_popup
));
473 /****************************************************************************/
474 static struct NewMenu nm
[] =
476 {NM_TITLE
, (STRPTR
)MSG_MEN_PROJECT
},
477 {NM_ITEM
, (STRPTR
)MSG_MEN_PROJECT_HIDE
},
478 {NM_ITEM
, (STRPTR
)MSG_MEN_PROJECT_ICONIFY
},
479 {NM_ITEM
, NM_BARLABEL
},
480 {NM_ITEM
, (STRPTR
)MSG_MEN_PROJECT_QUIT
},
484 /*** InitMenus **************************************************************/
485 static void InitMenus(void)
487 struct NewMenu
*actnm
= nm
;
489 for(actnm
= nm
; actnm
->nm_Type
!= NM_END
; actnm
++)
491 if (actnm
->nm_Label
!= NM_BARLABEL
)
493 ULONG id
= (IPTR
)actnm
->nm_Label
;
494 CONST_STRPTR str
= _(id
);
496 if (actnm
->nm_Type
== NM_TITLE
)
498 actnm
->nm_Label
= str
;
500 actnm
->nm_Label
= str
+ 2;
501 if (str
[0] != ' ') actnm
->nm_CommKey
= str
;
503 actnm
->nm_UserData
= (APTR
)(IPTR
)id
;
505 } /* if (actnm->nm_Label != NM_BARLABEL) */
507 } /* for(actnm = nm; nm->nm_Type != NM_END; nm++) */
510 /*** showSimpleMessage ******************************************************/
511 static void showSimpleMessage(CONST_STRPTR msgString
)
513 struct EasyStruct easyStruct
;
515 easyStruct
.es_StructSize
= sizeof(easyStruct
);
516 easyStruct
.es_Flags
= 0;
517 easyStruct
.es_Title
= _(MSG_ASCIITABLE_CXNAME
);
518 easyStruct
.es_TextFormat
= msgString
;
519 easyStruct
.es_GadgetFormat
= _(MSG_OK
);
521 if (IntuitionBase
!= NULL
&& !Cli() )
523 EasyRequestArgs(NULL
, &easyStruct
, NULL
, NULL
);
531 /*** broker_func ************************************************************/
532 AROS_UFH3(void, broker_func
,
533 AROS_UFHA(struct Hook
*, h
, A0
),
534 AROS_UFHA(Object
* , object
, A2
),
535 AROS_UFHA(CxMsg
* , msg
, A1
))
539 D(bug("ASCIITable: Broker hook called\n"));
540 if (CxMsgType(msg
) == CXM_COMMAND
)
542 if (CxMsgID(msg
) == CXCMD_APPEAR
)
544 //This opens window if application was started with cx_popup=no
545 set(app
, MUIA_Application_Iconified
, FALSE
);
551 /*** MakeGUI ****************************************************************/
552 static void MakeGUI(void)
555 static TEXT wintitle
[100];
558 menu
= MUI_MakeObject(MUIO_MenustripNM
, &nm
, 0);
560 broker_hook
.h_Entry
= (HOOKFUNC
)broker_func
;
562 snprintf(wintitle
, sizeof(wintitle
), _(MSG_ASCIITABLE_WINTITLE
), cx_popkey
);
564 app
= (Object
*)ApplicationObject
,
565 MUIA_Application_Title
, __(MSG_ASCIITABLE_CXNAME
),
566 MUIA_Application_Version
, (IPTR
)version
,
567 MUIA_Application_Copyright
, (IPTR
)"Copyright © 2009, The AROS Development TEAM",
568 MUIA_Application_Author
, (IPTR
)"The AROS Development Team",
569 MUIA_Application_Description
, __(MSG_ASCIITABLE_CXDESCR
),
570 MUIA_Application_BrokerPri
, cx_pri
,
571 MUIA_Application_BrokerHook
, (IPTR
)&broker_hook
,
572 MUIA_Application_Base
, (IPTR
)"ASCIITABLE",
573 MUIA_Application_SingleTask
, TRUE
,
574 MUIA_Application_Menustrip
, (IPTR
)menu
,
575 SubWindow
, (IPTR
)(wnd
= (Object
*)WindowObject
,
576 MUIA_Window_Title
, (IPTR
)wintitle
,
577 MUIA_Window_ID
, MAKE_ID('A', 'I', 'T', 'B'),
578 WindowContents
, (IPTR
)ASCIITableObject
,
584 Cleanup(NULL
); // Propably double start
587 maintask
= FindTask(NULL
);
588 get(app
, MUIA_Application_Broker
, &broker
);
589 get(app
, MUIA_Application_BrokerPort
, &brokermp
);
590 if ( ! broker
|| ! brokermp
)
591 Cleanup(_(MSG_CANT_CREATE_BROKER
));
593 popfilter
= CxFilter(cx_popkey
);
596 CxObj
*popsig
= CxSignal(maintask
, SIGBREAKB_CTRL_F
);
600 AttachCxObj(popfilter
, popsig
);
601 trans
= CxTranslate(NULL
);
602 if (trans
) AttachCxObj(popfilter
, trans
);
604 AttachCxObj(broker
, popfilter
);
607 DoMethod(wnd
, MUIM_Notify
, MUIA_Window_CloseRequest
, TRUE
,
608 (IPTR
)app
, 3, MUIM_Set
, MUIA_Application_Iconified
, TRUE
);
610 DoMethod(app
, MUIM_Notify
, MUIA_Application_DoubleStart
, TRUE
,
611 (IPTR
)app
, 3, MUIM_Set
, MUIA_Application_Iconified
, FALSE
);
613 // Open the window when app isn't iconified
614 DoMethod(app
, MUIM_Notify
, MUIA_Application_Iconified
, FALSE
,
615 (IPTR
)wnd
, 3, MUIM_Set
, MUIA_Window_Open
, TRUE
);
617 DoMethod(wnd
, MUIM_Notify
, MUIA_Window_MenuAction
, MSG_MEN_PROJECT_QUIT
,
618 (IPTR
)app
, 2, MUIM_Application_ReturnID
, MUIV_Application_ReturnID_Quit
);
620 DoMethod(wnd
, MUIM_Notify
, MUIA_Window_MenuAction
, MSG_MEN_PROJECT_HIDE
,
621 (IPTR
)app
, 3, MUIM_Set
, MUIA_Application_Iconified
, TRUE
);
623 DoMethod(wnd
, MUIM_Notify
, MUIA_Window_MenuAction
, MSG_MEN_PROJECT_ICONIFY
,
624 (IPTR
)app
, 3, MUIM_Set
, MUIA_Application_Iconified
, TRUE
);
627 /*** HandleAll **************************************************************/
628 static void HandleAll(void)
632 set(app
, MUIA_Application_Iconified
, cx_popup
? FALSE
: TRUE
);
634 while((LONG
) DoMethod(app
, MUIM_Application_NewInput
, (IPTR
)&sigs
)
635 != MUIV_Application_ReturnID_Quit
)
639 sigs
= Wait(sigs
| SIGBREAKF_CTRL_C
| SIGBREAKF_CTRL_F
);
640 if (sigs
& SIGBREAKF_CTRL_C
)
644 if (sigs
& SIGBREAKF_CTRL_F
)
646 set(app
, MUIA_Application_Iconified
, FALSE
);
652 /*** Cleanup ****************************************************************/
653 static void Cleanup(CONST_STRPTR txt
)
655 MUI_DisposeObject(app
);
659 showSimpleMessage(txt
);
665 /*** main *******************************************************************/
666 int main(int argc
, char **argv
)
668 D(bug("ASCIITable started\n"));
669 GetArguments(argc
, argv
);
677 /****************************************************************************/
678 ADD2INIT(Locale_Initialize
, 90);
679 ADD2EXIT(Locale_Deinitialize
, 90);