xref: /plan9-contrib/sys/src/cmd/aux/antiword/icons.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier  * icons.c
3f5736e95SDavid du Colombier  * Copyright (C) 1998-2001 A.J. van Os; Released under GPL
4f5736e95SDavid du Colombier  *
5f5736e95SDavid du Colombier  * Description:
6f5736e95SDavid du Colombier  * Update window icons
7f5736e95SDavid du Colombier  */
8f5736e95SDavid du Colombier 
9f5736e95SDavid du Colombier #include <string.h>
10*25b329d5SDavid du Colombier #include "DeskLib:Error.h"
11*25b329d5SDavid du Colombier #include "DeskLib:WimpSWIs.h"
12f5736e95SDavid du Colombier #include "antiword.h"
13f5736e95SDavid du Colombier 
14f5736e95SDavid du Colombier void
vUpdateIcon(window_handle tWindow,icon_block * pIcon)15*25b329d5SDavid du Colombier vUpdateIcon(window_handle tWindow, icon_block *pIcon)
16f5736e95SDavid du Colombier {
17*25b329d5SDavid du Colombier 	window_redrawblock	tRedraw;
18f5736e95SDavid du Colombier 	BOOL		bMore;
19f5736e95SDavid du Colombier 
20*25b329d5SDavid du Colombier 	tRedraw.window = tWindow;
21*25b329d5SDavid du Colombier 	tRedraw.rect = pIcon->workarearect;
22*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_UpdateWindow(&tRedraw, &bMore));
23f5736e95SDavid du Colombier 	while (bMore) {
24*25b329d5SDavid du Colombier 		Error_CheckFatal(Wimp_PlotIcon(pIcon));
25*25b329d5SDavid du Colombier 		Error_CheckFatal(Wimp_GetRectangle(&tRedraw, &bMore));
26f5736e95SDavid du Colombier 	}
27f5736e95SDavid du Colombier } /* end of vUpdateIcon */
28f5736e95SDavid du Colombier 
29f5736e95SDavid du Colombier void
vUpdateRadioButton(window_handle tWindow,icon_handle tIconNumber,BOOL bSelected)30*25b329d5SDavid du Colombier vUpdateRadioButton(window_handle tWindow, icon_handle tIconNumber,
31*25b329d5SDavid du Colombier 	BOOL bSelected)
32f5736e95SDavid du Colombier {
33*25b329d5SDavid du Colombier 	icon_block	tIcon;
34f5736e95SDavid du Colombier 
35*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_GetIconState(tWindow, tIconNumber, &tIcon));
36f5736e95SDavid du Colombier 	DBG_DEC(tIconNumber);
37*25b329d5SDavid du Colombier 	DBG_HEX(tIcon.flags.data.selected);
38*25b329d5SDavid du Colombier 	if (bSelected == (tIcon.flags.data.selected == 1)) {
39f5736e95SDavid du Colombier 		/* No update needed */
40f5736e95SDavid du Colombier 		return;
41f5736e95SDavid du Colombier 	}
42*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_SetIconState(tWindow, tIconNumber,
43*25b329d5SDavid du Colombier 			bSelected ? 0x00200000 : 0, 0x00200000));
44f5736e95SDavid du Colombier 	vUpdateIcon(tWindow, &tIcon);
45f5736e95SDavid du Colombier } /* end of vUpdateRadioButton */
46f5736e95SDavid du Colombier 
47f5736e95SDavid du Colombier /*
48f5736e95SDavid du Colombier  * vUpdateWriteable - update a writeable icon with a string
49f5736e95SDavid du Colombier  */
50f5736e95SDavid du Colombier void
vUpdateWriteable(window_handle tWindow,icon_handle tIconNumber,const char * szString)51*25b329d5SDavid du Colombier vUpdateWriteable(window_handle tWindow, icon_handle tIconNumber,
52*25b329d5SDavid du Colombier 	const char *szString)
53f5736e95SDavid du Colombier {
54*25b329d5SDavid du Colombier 	icon_block	tIcon;
55*25b329d5SDavid du Colombier 	caret_block	tCaret;
56f5736e95SDavid du Colombier 	int		iLen;
57f5736e95SDavid du Colombier 
58f5736e95SDavid du Colombier 	fail(szString == NULL);
59f5736e95SDavid du Colombier 
60f5736e95SDavid du Colombier 	NO_DBG_DEC(tIconNumber);
61f5736e95SDavid du Colombier 	NO_DBG_MSG(szString);
62f5736e95SDavid du Colombier 
63*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_GetIconState(tWindow, tIconNumber, &tIcon));
64f5736e95SDavid du Colombier 	NO_DBG_HEX(tIcon.flags);
65*25b329d5SDavid du Colombier 	if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) {
66f5736e95SDavid du Colombier 		werr(1, "Icon %d must be indirected text", (int)tIconNumber);
67f5736e95SDavid du Colombier 		return;
68f5736e95SDavid du Colombier 	}
69f5736e95SDavid du Colombier 	strncpy(tIcon.data.indirecttext.buffer,
70f5736e95SDavid du Colombier 		szString,
71f5736e95SDavid du Colombier 		tIcon.data.indirecttext.bufflen - 1);
72f5736e95SDavid du Colombier 	/* Ensure the caret is behind the last character of the text */
73*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_GetCaretPosition(&tCaret));
74*25b329d5SDavid du Colombier 	if (tCaret.window == tWindow && tCaret.icon == tIconNumber) {
75f5736e95SDavid du Colombier 		iLen = strlen(tIcon.data.indirecttext.buffer);
76f5736e95SDavid du Colombier 		if (tCaret.index != iLen) {
77f5736e95SDavid du Colombier 			tCaret.index = iLen;
78*25b329d5SDavid du Colombier 			Error_CheckFatal(Wimp_SetCaretPosition(&tCaret));
79f5736e95SDavid du Colombier 		}
80f5736e95SDavid du Colombier 	}
81*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_SetIconState(tWindow, tIconNumber, 0, 0));
82f5736e95SDavid du Colombier 	vUpdateIcon(tWindow, &tIcon);
83f5736e95SDavid du Colombier } /* end of vUpdateWriteable */
84f5736e95SDavid du Colombier 
85f5736e95SDavid du Colombier /*
86f5736e95SDavid du Colombier  * vUpdateWriteableNumber - update a writeable icon with a number
87f5736e95SDavid du Colombier  */
88f5736e95SDavid du Colombier void
vUpdateWriteableNumber(window_handle tWindow,icon_handle tIconNumber,int iNumber)89*25b329d5SDavid du Colombier vUpdateWriteableNumber(window_handle tWindow, icon_handle tIconNumber,
90*25b329d5SDavid du Colombier 	int iNumber)
91f5736e95SDavid du Colombier {
92*25b329d5SDavid du Colombier 	char	szTmp[1+3*sizeof(int)+1];
93f5736e95SDavid du Colombier 
94f5736e95SDavid du Colombier 	(void)sprintf(szTmp, "%d", iNumber);
95f5736e95SDavid du Colombier 	vUpdateWriteable(tWindow, tIconNumber, szTmp);
96f5736e95SDavid du Colombier } /* end of vUpdateWriteableNumber */
97