home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 February
/
VPR9902A.BIN
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
SPEAK.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-10-17
|
24KB
|
1,022 lines
// WZ Editor 音声化
// WZ32 3.0以降専用 (WZ16は開発専用)
// 96.4.29 start
// WZを音声化するには、WZのメニューから「ツール|カスタマイズ」を選択し、
// カスタマイズダイアログの[その他]-[音声化]をONにしてWZを再起動してください。
// WZをネットワークで使用している場合、ユーザ毎に音声化するかどうか設定できます。
//3.00A 970501 WZ3.0対応
// ああ、ああ。いい、いい。うう、うう。ええ、ええ。おお、おお。
// かか、かか。きききき。くくくく。けけけけ。ここここ。
//{###音声化}
// 日本障害者雇用促進協会の「95Reader Version 1.0」を使って、
// WZ Editorを音声化します。
// WZを音声化するには、95Readerを起動しておいてから、
// WZのメニューから「ツール|カスタマイズ」を選択し、
// カスタマイズダイアログの[その他]-[音声化]をONにして、
// WZを再起動してください。
// 音声化をやめるには[その他]-[音声化]をOFFにしてください。
// ※WZ16は音声化できません。
#include <windows.h>
#include "dialog.h"
#include "word.h"
//##音声発生DLL
//3.00A3 970508 soundp.hをWZに添付 許諾済
extern "soundp.dll" {
#include "soundp.h"
}
#define SPEAK_SENTENCE 0 // 滑らか読み
#define SPEAK_CHAR 2 // 1文字説明読み
#define SPEAK_CURSOR 3 // カーソル移動読み
#define SPEAK_ABSOLUTE_OUT 0x40 //3.00A2 970504 必ず出力する
//##設定,内部変数
permanent int _fSpeakLine = TRUE; // 行末まで読む?
permanent int _msWaitDelete = 1000; //3.00A5 970511 「削除」を発声してから待つ時間をカスタマイズできるようにした
static int _nRepeatDelete = 0; // {Delete}が連続して押された回数
static int _nRepeatBackspace = 0; // {Backspace}が連続して押された回数
static int _idmSearch; // [検索]-[検索]のidm
//##内部関数
static mchar* GetTxeName(mchar sztxename[CCHPATHNAME])
{
// 現在のWZがTXEならそのモジュール名(filerなど)を返す。
// そうでなければ""を返す
sztxename[0] = 0;
//
wzlock(LOCK_WZPROCESS);
{
int i = textSearch(text->hwndbase);
if (i != -1) {
strcpymax(sztxename,text->share->tWzprocess[i].szTxeName,CCHPATHNAME);
}
}
wzunlock(LOCK_WZPROCESS);
return sztxename;
}
static BOOL speak(LPCSTR lpszText,UINT fuType)
{
// 文字列を指定したモードで読み上げる
#ifdef __FLAT__
#if 1
if (lpszText[0]) {
int mode = 0;
if (fuType & SPEAK_ABSOLUTE_OUT) {//3.00A2 970504
mode = PF_ABSOLUTE_OUT;
}
switch(fuType) {
case SPEAK_SENTENCE: mode |= 0;break;
case SPEAK_CHAR: mode |= PF_DETAIL;break;
case SPEAK_CURSOR: mode |= PF_CURSOR_MOVE;break;
}
SoundMessage(lpszText,mode);
}
return TRUE;
#else
// for DEBUG
printf("%s\n",lpszText);
return TRUE;
#endif
#else
printf("%s\n",lpszText);
return TRUE;
#endif
}
static BOOL speakwait(LPCSTR lpszText,UINT fuType)
{
// 文字列を指定したモードで読み上げ、読み上げが終わるまで制御を返さない
int ret = speak(lpszText,fuType|SPEAK_ABSOLUTE_OUT);
#ifdef __FLAT__
//3.00A2 970504 読み上げが終わるまで制御を返さない方法がわからないので、
// とりあえずSleepで待つ。これしないと"削除"や"後退"が読み上げされない。
Sleep(_msWaitDelete);
#endif
return ret;
}
void TXAPI TXCMD txspeakCurChar(TX* text)
{
// カーソル位置の文字を説明読みで読み上げ
int size = txGetCharSize(text,text->cur);
mchar buff[CCHWORD];
strcpylenmax(buff,text->buff + text->cur,size,CCHWORD);
speak(buff,SPEAK_CHAR);
}
void TXAPI TXCMD txspeakCur(TX* text)
{
// カーソル位置の文字をカーソル移動読みで読み上げ
int size = txGetCharSize(text,text->cur);
mchar buff[CCHWORD];
strcpylenmax(buff,text->buff + text->cur,size,CCHWORD);
speak(buff,SPEAK_CURSOR);
}
void TXAPI TXCMD txspeakCurPrev(TX* text)
{
// カーソルの一つ手前の文字をカーソル移動読みで読み上げ
if (text->cur0) {
IMEM off = formchar(text->buff,text->cur0 - 1);
int size = txGetCharSize(text,off);
mchar buff[CCHWORD];
strcpylenmax(buff,text->buff + off,size,CCHWORD);
speak(buff,SPEAK_CURSOR);
}
}
void TXAPI TXCMD txspeakCurLinePrim(TX* text)
{
// カーソル位置から表示行末まで文字列をなめらか読みで読み上げ
// 最大CCHLINE-1バイトまでの文字列を読めます
//3.00C 971016 new
mchar buff[CCHLINE];
IMEM len = text->curysize - (text->cur0 - text->cury);
if (len) {
strcpylenmax(buff,text->buff + text->cur,len,CCHLINE);
speak(buff,SPEAK_SENTENCE);
}
}
void TXAPI TXCMD txspeakCurLine(TX* text)
{
// カーソル位置から表示行末まで文字列をなめらか読みで読み上げ
// 最大CCHLINE-1バイトまでの文字列を読めます
// 設定によっては、カーソル位置の一文字しか読み上げない
if (_fSpeakLine) {
txspeakCurLinePrim(text);
} else {
txspeakCur(text);
}
}
static void speakAddressCur(TX* text,IFILE adr0)
{
// adr0からカーソル位置までの文字列をなめらか読みで読み上げ
// 最大CCHLINE-1バイトまでの文字列を読めます
mchar buff[CCHLINE];
IFILE adr = txGetAddress(text);
if (adr0 <= adr) {
// カーソルが右に移動した
IMEM off0 = 0;
if (text->temp1 < adr0) {
off0 = adr0 - text->temp1;
}
strcpylenmax(buff,text->buff + off0,text->cur0 - off0,CCHLINE);
speak(buff,SPEAK_SENTENCE);
} else {
// カーソルが左に移動した
IMEM off0 = text->sizebuff;
adr0 -= text->temp1;
adr0 += (text->cur - text->cur0);
if (adr0 < text->sizebuff) {
off0 = (IMEM)adr0;
}
strcpylenmax(buff,text->buff + text->cur,off0 - text->cur,CCHLINE);
speak(buff,SPEAK_SENTENCE);
}
}
static int txSearchKuten(TX* text,SEARCHMODE mode)
{
return txSearchEx(text,"[。。..]",SEARCH_RE|SEARCH_NOSELECT|mode);
}
static int txSearchDokuten(TX* text,SEARCHMODE mode)
{
return txSearchEx(text,"[、、,,]",SEARCH_RE|SEARCH_NOSELECT|mode);
}
static void speakCurKuten(TX* text)
{
// カーソル位置の次の文字から次の句点までを読む
txSetUndispEx(text);
{
txRight(text);
IFILE adr = txGetAddress(text);
if (txSearchKuten(text,0)) {
} else {
txJumpFileEnd(text);
}
speakAddressCur(text,adr);
}
txSetDispEx(text);
}
static void speakCurDokuten(TX* text)
{
// カーソル位置の次の文字から次の読点までを読む
txSetUndispEx(text);
{
txRight(text);
IFILE adr = txGetAddress(text);
if (txSearchDokuten(text,0)) {
} else {
txJumpFileEnd(text);
}
speakAddressCur(text,adr);
}
txSetDispEx(text);
}
static void speakSelect(TX* text)
{
// 選択されている文字列をなめらか読みで読み上げる
// 読み上げることができる文字列に制限はありません
if (text->fClip) {
HCLIP hclip = HCLIP_TS;
txSelectTsPush(text);
DWORD size = memClipPaste(NULL,hclip);
if (size) {
LPBYTE pmem = memAlloc(size + 1);
if (pmem) {
memClipPaste(pmem,hclip);
pmem[size] = 0;
speak(pmem,SPEAK_SENTENCE);
memFree(pmem);
}
}
clipDeleteTop(hclip);
}
}
static void speakLine(TX* text)
{
// カーソルの行の内容をなめらか読みで読み上げる
// 最大CCHLINE-1バイトまでの文字列を読めます
txstr sz(CCHLINE);
txGetLine(text,sz);
speak(sz,SPEAK_SENTENCE);
}
static void speakPara(TX* text)
{
// カーソルの段落の内容をなめらか読みで読み上げる
// 最大CCHLINE-1バイトまでの文字列を読めます
txstr sz(CCHLINE);
txGetPara(text,sz);
speak(sz,SPEAK_SENTENCE);
}
static void selectStart(TX* text)
{
if (!text->fClipMouse) {
txSelectVz(text);
text->fClipMouse = TRUE;
}
}
// 選択を取り消したかどうか返す
static BOOL selectEnd(TX* text,int vk)
{
if (text->fClip && text->fClipMouse) {
switch(vk) {
case VK_LEFT: {
txJumpSelectTop(text);
txspeakCur(text);
break;
}
case VK_RIGHT: {
txJumpSelectEnd(text);
txspeakCur(text);
break;
}
case VK_BACK:
case VK_DELETE: {
speakwait("削除",SPEAK_SENTENCE);
speakSelect(text);
txSelectDelete(text);
return TRUE;
}
}
return txSelectQuit(text);
}
return FALSE;
}
static BOOL txspeakLineIsNull(TX* text)
{
//3.00C 971016 方向キーで移動中、空行に移動したら「空行」と読み上げる
txstr buff(10);
if (txGetPara(text,buff) == 0) {
speak("空行",SPEAK_SENTENCE);
return TRUE;
}
return FALSE;
}
static BOOL txspeakCurIsLineTopOrEnd(TX* text)
{
//3.00C 971016 左右方向キーで「行頭」「行末」読み上げ
#if 0 //3.00C 971016 とりあえずOFFにしておく、"行頭"の後の文字が読まれないため
if (txIsCurLineTop(text)) {
speak("行頭",SPEAK_SENTENCE);
return TRUE;
} else if (text->cur0 - text->cury + txGetCharSize(text,text->cur) == text->curysize) {
speak("行末",SPEAK_SENTENCE);
return TRUE;
}
#endif
return FALSE;
}
//##コマンド
int TXAPI TXCMD txspeakLeft(TX* text)
{
// カーソルを1つ前の文字へ移動
// カーソルを1つ前の文字へ移動して、カーソル位置の文字を読み上げる
// 選択中は、カーソルを範囲の先頭に移動して選択を解除し、カーソル位置の文字を読み上げ
if (selectEnd(text,VK_LEFT)) return 0;
int ret = txLeft(text);
if (ret) {
if (!txspeakLineIsNull(text)) {
txspeakCurIsLineTopOrEnd(text);
txspeakCur(text);
}
}
return ret;
}
int TXAPI TXCMD txspeakRight(TX* text)
{
// カーソルを1つ後の文字へ移動
// カーソルを1つ後の文字へ移動して、カーソル位置の文字を読み上げる
// 選択中は、カーソルを範囲の末尾に移動して選択を解除し、カーソル位置の文字を読み上げ
if (selectEnd(text,VK_RIGHT)) return 0;
int ret = txRight(text);
if (ret) {
if (!txspeakLineIsNull(text)) {
txspeakCurIsLineTopOrEnd(text);
txspeakCur(text);
}
}
return ret;
}
int TXAPI TXCMD txspeakLinetop(TX* text)
{
// 行頭からカーソルまでを読み上げる
// 選択中は、選択を解除する
//3.00C 971016 new
selectEnd(text,0);
speakAddressCur(text,txGetLineTop(text));
return TRUE;
}
int TXAPI TXCMD txspeakLineend(TX* text)
{
// カーソル位置から行末までを読み上げる
// 選択中は、選択を解除する
//3.00C 971016 new
selectEnd(text,0);
speakAddressCur(text,txGetLineTail(text));
return TRUE;
}
int TXAPI TXCMD txspeakUp(TX* text)
{
// カーソルを1つ上の行へ移動
// カーソルを1つ上の行へ移動して、カーソル位置から表示行末まで文字列をなめらか読みで読み上げる
// 選択中は、カーソルを範囲の先頭に移動して選択を解除し、カーソル位置の文字を読み上げ
if (selectEnd(text,VK_LEFT)) return 0;
int ret = txUp(text);
if (ret) {
if (!txspeakLineIsNull(text)) txspeakCurLine(text);
}
return ret;
}
int TXAPI TXCMD txspeakDown(TX* text)
{
// カーソルを1つ下の行へ移動
// カーソルを1つ下の行へ移動して、カーソル位置から表示行末まで文字列をなめらか読みで読み上げる
// 選択中は、カーソルを範囲の末尾に移動して選択を解除し、カーソル位置の文字を読み上げ
if (selectEnd(text,VK_RIGHT)) return 0;
int ret = txDown(text);
if (ret) {
if (!txspeakLineIsNull(text)) txspeakCurLine(text);
}
return ret;
}
int TXAPI TXCMD txspeakLineprev(TX* text)
{
// カーソルの前の表示行の内容を読み上げ
// 選択中は、選択を解除する
//3.00C 971016 new
selectEnd(text,0);
txSetUndispExSilent(text);
int ret = txUp(text);
if (ret) {
txJumpLineTop(text);
if (!txspeakLineIsNull(text)) txspeakCurLinePrim(text);
} else {
speak("先頭行",SPEAK_SENTENCE);
}
txSetDispExSilent(text);
return ret;
}
int TXAPI TXCMD txspeakLinenext(TX* text)
{
// カーソルの次の表示行の内容を読み上げ
// 選択中は、選択を解除する
//3.00C 971016 new
selectEnd(text,0);
txSetUndispExSilent(text);
int ret = txDown(text);
if (ret) {
txJumpLineTop(text);
if (!txspeakLineIsNull(text)) txspeakCurLinePrim(text);
} else {
speak("最終行",SPEAK_SENTENCE);
}
txSetDispExSilent(text);
return ret;
}
int TXAPI TXCMD txspeakLeftWord(TX* text)
{
// カーソルを1つ前の単語へ移動
// カーソルを1つ前の単語へ移動して、移動した部分の文字列をなめらか読みで読み上げる
// 選択中は、選択を解除する
selectEnd(text,0);
IFILE adr = txGetAddress(text);
txSelectEx(text,CLIP_MOUSE);//3.00C 971016 Ctrl+左右で読み上げた文節を反転表示
{
int ret = txLeftWord(text);
if (ret) {
speakAddressCur(text,adr);
}
return ret;
}
}
int TXAPI TXCMD txspeakRightWord(TX* text)
{
// カーソルを1つ後の単語へ移動
// カーソルを1つ後の単語へ移動して、移動した部分の文字列をなめらか読みで読み上げる
// 選択中は、選択を解除する
selectEnd(text,0);
IFILE adr = txGetAddress(text);
txSelectEx(text,CLIP_MOUSE);//3.00C 971016 Ctrl+左右で読み上げた文節を反転表示
{
int ret = txRightWord(text);
if (ret) {
speakAddressCur(text,adr);
}
return ret;
}
}
int TXAPI TXCMD txspeakDeleteChar(TX* text)
{
// カーソル位置の文字を読み上げてから削除
// 削除するまえに"削除"を読み上げるが、
// このコマンドを連続して実行したときは、一回目だけ"削除"という。
// 選択中は、"削除"を読み上げてから範囲内を読み上げて、範囲内を削除
if (selectEnd(text,VK_DELETE)) return 0;
if (_nRepeatDelete >= 2) {
// {Delete}が連続して押されたら「削除」と言わない
} else {
speakwait("削除",SPEAK_SENTENCE);
}
txspeakCur(text);
return txDeleteChar(text);
}
int TXAPI TXCMD txspeakDeletePrev(TX* text)
{
// カーソル位置の1つ前の文字を読み上げてから削除
// 削除するまえに"後退"を読み上げるが、
// このコマンドを連続して実行したときは、一回目だけ"後退"という。
// 選択中は、"削除"を読み上げてから範囲内を読み上げて、範囲内を削除
if (selectEnd(text,VK_BACK)) return 0;
if (_nRepeatBackspace >= 2) {
// {Backspace}が連続して押されたら「後退」と言わない
} else {
speakwait("後退",SPEAK_SENTENCE);
}
if (txLeft(text)) {
txspeakCur(text);
return txDeleteChar(text);
}
return 0;
}
int TXAPI TXCMD txspeakselectLeft(TX* text)
{
// 選択してカーソルを1つ前の文字へ移動
// 選択してカーソルを1つ前の文字へ移動して、カーソル位置の文字を読み上げる
selectStart(text);
int ret = txLeft(text);
if (ret) {
txspeakCur(text);
}
return ret;
}
int TXAPI TXCMD txspeakselectRight(TX* text)
{
// 選択してカーソルを1つ後の文字へ移動
// 選択してカーソルを1つ後の文字へ移動して、カーソル位置の文字を読み上げる
selectStart(text);
txspeakCur(text);
return txRight(text);
}
int TXAPI TXCMD txspeakselectUp(TX* text)
{
// 選択してカーソルを1つ上の行へ移動
// 選択してカーソルを1つ上の行へ移動して、カーソル位置の文字を読み上げる
selectStart(text);
int ret = txUp(text);
if (ret) {
txspeakCur(text);
}
return ret;
}
int TXAPI TXCMD txspeakselectDown(TX* text)
{
// 選択してカーソルを1つ下の行へ移動
// 選択してカーソルを1つ下の行へ移動して、カーソル位置の文字を読み上げる
selectStart(text);
int ret = txDown(text);
if (ret) {
txspeakCurPrev(text);
}
return ret;
}
void TXAPI TXCMD txspeakSwitchInsert(TX* text)
{
// 上書き/挿入モードを切替
// 上書き/挿入モードを切り替えて、現在のモードを読み上げる
txSwitchInsert(text);
if (text->fOverWrite) {
speak("上書き",SPEAK_SENTENCE);
} else {
speak("挿入",SPEAK_SENTENCE);
}
}
int TXAPI TXCMD txspeakPrevPara(TX* text)
{
// 1つ上の段落の先頭へ移動
// 1つ上の段落の先頭へ移動して、段落の内容をなめらか読みで読み上げる
int ret = txPrevPara(text);
if (ret) {
speakPara(text);
}
return ret;
}
int TXAPI TXCMD txspeakNextPara(TX* text)
{
// 1つ下の段落の先頭へ移動
// 1つ下の段落の先頭へ移動して、段落の内容をなめらか読みで読み上げる
int ret = txNextPara(text);
if (ret) {
speakPara(text);
}
return ret;
}
int TXAPI TXCMD txspeakuiSearch(TX* text)
{
// 音声化検索
// 検索文字列を見つけたら、行の内容をなめらかよみで読み上げ
static txstr szFind; // 以前に検索した文字列を覚えておく
BOOL ret = FALSE;
HDIALOG hd = dialog("検索(音声付き)");
dialogStr(hd,"検索(&S):",szFind,12,30);
if (dialogOpen(hd)) {
histAdd(HIST_SEARCH,szFind);//3.00A2 970504
if (txSearchEx(text,szFind,SEARCH_SELECT)) {
speakLine(text);
ret = TRUE;
}
}
return ret;
}
int TXAPI TXCMD txspeakuiSearchCharkind(TX* text)
{
// 音声化文字種検索
// 指定した文字種を見つけたら、行の内容をなめらかよみで読み上げ
// 検索できる文字種は次のとおり。
// "全角カタカナ","半角カタカナ","全角英文字","半角英文字","漢字"
static int kind; // 以前に文字種を覚えておく
BOOL ret = FALSE;
HDIALOG hd = dialog("文字種で検索(音声付き)");
dialogControlRadioV(hd);
dialogRadioID(hd,&kind,"全角カタカナ","半角カタカナ","全角英文字","半角英文字","漢字");
if (dialogOpen(hd)) {
static mchar *tsz[] = {
"[ァ-ヶ]","[ヲ-ン]","[A-Za-z]","[A-Za-z]","[亜-黑]",
};
if (txSearchEx(text,tsz[kind],SEARCH_RE)) {
speakLine(text);
}
}
return ret;
}
void TXAPI TXCMD txspeakCurAtr(TX* text)
{
// カーソル位置の段落体裁、文字装飾を読み上げ
mchar sz[CCHLINE];
mchar*p = sz;
// 段落書式
if (text->paraatr.modeTitle) {
sprintf(p,"見出%d ",text->paraatr.modeTitle);
p += strlen(p);
}
if (text->paraatr.modeArticle) {
strcpy(p,"箇条書き ");
p += strlen(p);
}
if (text->paraatr.lcxIndent) {
strcpy(p,"字下げ ");
p += strlen(p);
}
switch(paraatrGetAlign(text,&text->paraatr)) {
case ALIGN_CENTER: {
strcpy(p,"中央揃え ");
p += strlen(p);
break;
}
case ALIGN_RIGHT: {
strcpy(p,"右揃え ");
p += strlen(p);
break;
}
}
if (txIsCurTable(text)) {
strcpy(p,"表 ");
p += strlen(p);
} else if (txIsCurTab(text)) {
strcpy(p,"桁揃え ");
p += strlen(p);
}
*p = 0;
// 文字装飾
if (text->charatr.fBold) {
strcpy(p,"太字 ");
p += strlen(p);
}
if (text->charatr.fUnderline) {
strcpy(p,"下線 ");
p += strlen(p);
}
if (text->charatr.fItalic) {
strcpy(p,"斜体 ");
p += strlen(p);
}
*p = 0;
speak(sz,SPEAK_SENTENCE);
}
void TXAPI TXCMD txspeakCurLocate(TX* text)
{
// カーソル位置の段落数、列数を読み上げ
// スクロールバーでのスクロールには対応していない
int lx = text->lx + 1;
mchar buff[CCHLINE];
if (text->editmode == 2) {
sprintf(buff,"%d頁%d行%d列 %d段落",text->npage,text->nlineByPage,lx,text->npara);
} else {
sprintf(buff,"%d段落 %d列",text->npara,lx);
}
speak(buff,SPEAK_SENTENCE);
}
int TXAPI TXCMD txspeakLeftKuten(TX* text)
{
// 1つ前の文へ移動
// 1つ前の句点(。。..)の1つ後ろの文字へ移動し、次の句点までの文章を読み上げる
txLeft(text);
if (txSearchKuten(text,SEARCH_PREV)) {
txRight(text);
speakCurKuten(text);
return TRUE;
}
return FALSE;
}
int TXAPI TXCMD txspeakRightKuten(TX* text)
{
// 1つ後の文へ移動
// 1つ後の句点(。。..)の1つ後ろの文字へ移動し、次の句点までの文章を読み上げ
if (txSearchKuten(text,0)) {
txRight(text);
speakCurKuten(text);
return TRUE;
}
return FALSE;
}
int TXAPI TXCMD txspeakLeftDokuten(TX* text)
{
// 1つ前のセンテンスへ移動
// 1つ前の読点(、、,,)の1つ後ろの文字へ移動し、次の読点までの文章を読み上げ
txLeft(text);
if (txSearchDokuten(text,SEARCH_PREV)) {
txRight(text);
speakCurDokuten(text);
return TRUE;
}
return FALSE;
}
int TXAPI TXCMD txspeakRightDokuten(TX* text)
{
// 1つ後のセンテンスへ移動
// 1つ後の読点(、、,,)の1つ後ろの文字へ移動し、次の読点までの文章を読み上げ
if (txSearchDokuten(text,0)) {
txRight(text);
speakCurDokuten(text);
return TRUE;
}
return FALSE;
}
int TXAPI TXCMD txspeakSearchTitlePrev(TX* text)
{
// カーソル位置の1つ前の見出し行へ移動し、行を読み上げ
int ret = txSearchTitlePrev(text);
if (ret) {
speakLine(text);
}
return ret;
}
int TXAPI TXCMD txspeakSearchTitle(TX* text)
{
// カーソル位置の1つ後の見出し行へ移動し、行を読み上げ
int ret = txSearchTitle(text);
if (ret) {
speakLine(text);
}
return ret;
}
//## 設定
//3.00A5 970511 WZ音声化の設定を付けた
txspeakConfig
{
// WZ音声化の設定
//3.00A5 970511 new
HDIALOG hd = dialog("WZ音声化の設定");
dialogSelectID(hd,"上下方向キーで移動後の読み上げ(&Y):",&_fSpeakLine,40,22,"カーソル位置の文字","カーソル位置から行末まで");
dialogControlGuide(hd,"ミリ秒",6);
dialogInt(hd,"「削除」・「後退」を発声後の待ち時間(&W):",&_msWaitDelete,40,6);
dialogOpen(hd);
}
//## WZ filer 音声化
#include "filer.h"
static void speakfilerLine(void)
{
// カーソルの行の内容をなめらか読みで読み上げる
// 最大CCHLINE-1バイトまでの文字列を読めます
txstr sz(CCHLINE);
#if 1//3.00C1 971017 ファイラーの読み上げで必ずファイル名を最初に読み上げる様にした
filerGetLineEx(sz);
#else
filerGetLine(sz);
#endif
speak(sz,SPEAK_SENTENCE);
}
static void speakfilerFilename(void)
{
// カーソルの行のファイル名をなめらか読みで読み上げる
// 最大CCHLINE-1バイトまでの文字列を読めます
txstr sz(CCHLINE);
filerGetFilename(sz);
speak(sz,SPEAK_SENTENCE);
}
// WZ Filerでカーソルを1行上に移動し、カーソル行の内容を読み上げ
txspeakfilerUp
{
#if 1///3.00A 970501
txkeyUp(text,1);
speakfilerLine();
#else
call("filer.up");
speakfilerLine();
#endif
}
// WZ Filerでカーソルを1行下に移動し、カーソル行の内容を読み上げ
txspeakfilerDown
{
#if 1///3.00A 970501
txkeyDown(text,1);
speakfilerLine();
#else
call("filer.down");
speakfilerLine();
#endif
}
// WZ Filerでカーソルを1行上に移動してから行を選択し、カーソル行のファイル名を読み上げ
txspeakfilerSelectUp
{
call("filer.sup");
speakfilerFilename();
}
// WZ Filerで現在行を選択してカーソルを1行上に移動し、カーソル行のファイル名を読み上げ
txspeakfilerSelectDown
{
speakfilerFilename();
call("filer.sdown");
}
// WZ Filerのファイル一覧ウィンドウのタイトルを読み上げ
txspeakfilerTitle
{
txstr sz;
filerGetTitle(sz);
speak(sz,SPEAK_SENTENCE);
}
//##初期化、終了処理、フックプロシジャー
void TXAPI txspeakSetKey(TX* text)
{
//3.00C 971016 関数化
if (text->fSpeakOn) {
mchar sztxename[CCHPATHNAME];
GetTxeName(sztxename);
//information(sztxename);
if (!stricmp(sztxename,"filer")) {
#key
.txspeakfilerUp {Up}
.txspeakfilerDown {Down}
.txspeakfilerSelectUp +{Up}
.txspeakfilerSelectDown +{Down}
.txspeakfilerTitle ^%R
#end
} else if (
!stricmp(sztxename,"") ||
!stricmp(sztxename,"grep") ||
!stricmp(sztxename,"stdout") //3.00B1 970613 WZ Stdoutも音声化対応
) {
#key
.txspeakLeft {Left}
.txspeakRight {Right}
.txspeakUp {Up}
.txspeakDown {Down}
.txspeakLeftWord ^{Left}
.txspeakRightWord ^{Right}
.txspeakDeleteChar {Delete}
.txspeakDeletePrev {Backspace}
.txspeakselectLeft +{Left}
.txspeakselectRight +{Right}
.txspeakselectUp +{Up}
.txspeakselectDown +{Down}
.txspeakSwitchInsert {Insert}
.txspeakuiSearch ^F
.txspeakCurAtr ^%I
.txspeakCurChar ^%H
.txspeakCurLocate ^%L
.txspeakLeftKuten +^%K
.txspeakRightKuten ^%K
.txspeakLeftDokuten +^%D
.txspeakRightDokuten ^%D
.txspeakLinetop ^%{Home} //3.00C 971016
.txspeakLineend ^%{End} //3.00C 971016
.txspeakLineprev %{Up} //3.00C 971016
.txspeakLinenext %{Down} //3.00C 971016
#end
#if 1//3.00A2 970504 95Readerを起動するとCtrl+Up,Ctrl+Down,Shift+Ctrl+F入力できない
#key
.txspeakPrevPara ^%{Up}
.txspeakNextPara ^%{Down}
.txspeakuiSearchCharkind ^%F
#end
#else
#key
.txspeakPrevPara ^{Up}
.txspeakNextPara ^{Down}
.txspeakuiSearchCharkind +^F
#end
#endif
if (!stricmp(GetTxeName(sztxename),"grep")) {
#if 1//3.00A2 970504 Ctrl+TabはWZ3.0から使えないのでキー割り当て変更
#key
.txspeakSearchTitlePrev ^R
.txspeakSearchTitle ^C
#end
#else
#key
.txspeakSearchTitlePrev +^{Tab}
.txspeakSearchTitle ^{Tab}
#end
#endif
}
}
}
}
main
{
text->fSpeakOn = text->fSpeakOn ^ 1;
if (text->fSpeakOn) {
text->fReport++;//3.00A2 970504
txspeakSetKey(text);
statprintf("スピークモード");
} else {
text->fReport--;//3.00A2 970504
txKeyLoad(text);
statprintf("通常モード");
}
}
HOOKRESULT __wndproctext(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TX* text = textTarget;
if (!text->fSpeakOn) return HOOK_CONTINUE;
switch(message) {
case WM_KEYDOWN: {
if (wParam == VK_DELETE) {
_nRepeatDelete++;
} else {
_nRepeatDelete = 0;
}
if (wParam == VK_BACK) {
_nRepeatBackspace++;
} else {
_nRepeatBackspace = 0;
}
break;
}
case WM_KEYUP: {
if (wParam == VK_SHIFT) {
if (text->fClipMouse) {
speakSelect(text);
}
}
break;
}
case WM_TXREPORT: {
if (wParam == TXREPORT_KEY_INSERTSTR) {
if (!imeGetOpen()) {
TXREPORT* r = (LPVOID)lParam;
speak(r->pStr,SPEAK_CURSOR);
}
}
break;
}
}
return HOOK_CONTINUE;
}
HOOKRESULT __wndprocbase(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TX* text = textTarget;
if (!text->fSpeakOn) return HOOK_CONTINUE;
switch(message) {
case WM_COMMAND: {
int idm = LOWORD(wParam);
if (idm == _idmSearch) {
txspeakuiSearch(text);
return HOOK_CAPTURE;
}
break;
}
}
return HOOK_CONTINUE;
}
__new
{
macroHookWndText();
macroHookWndBase();
#if 1//3.00A2 970504
_idmSearch = IDM_WZCMDTOP + wzcmdRegister("search.txkeySearch");
#else
_idmSearch = IDM_WZCMDTOP + wzcmdRegister("search.uiSearchModeless");
#endif
}