summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-11-12 14:23:05 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-11-12 14:23:05 (GMT)
commitee3ae55bac759d265eec2e41e17864f1486d073f (patch)
treec41ad809015e984cab014058bc21d75f3fd97d1c /win
parent011db3181f22da410d14abd5df6dc1da7d0fed6f (diff)
parent98049a4d7041f1aa0f5a9a8419b8c8fe2c83af60 (diff)
downloadtk-ee3ae55bac759d265eec2e41e17864f1486d073f.zip
tk-ee3ae55bac759d265eec2e41e17864f1486d073f.tar.gz
tk-ee3ae55bac759d265eec2e41e17864f1486d073f.tar.bz2
Make "_systray" and "_sysnotify" real ObjCommands on Win32. Make tkWinSysTray.c fully Unicode-proof on Win32.
Diffstat (limited to 'win')
-rw-r--r--win/tkWinSysTray.c225
1 files changed, 112 insertions, 113 deletions
diff --git a/win/tkWinSysTray.c b/win/tkWinSysTray.c
index a00cea1..59255ec 100644
--- a/win/tkWinSysTray.c
+++ b/win/tkWinSysTray.c
@@ -417,10 +417,10 @@ FreeIcoPtr(Tcl_Interp * interp, IcoInfo * icoPtr) {
*----------------------------------------------------------------------
*/
-static IcoInfo * GetIcoPtr(Tcl_Interp * interp, char * string) {
+static IcoInfo * GetIcoPtr(Tcl_Interp * interp, const char *string) {
IcoInfo * icoPtr;
int id;
- char * end;
+ char *end;
if (strncmp(string, "ico#", 4) != 0) {
return NULL;
@@ -435,7 +435,7 @@ static IcoInfo * GetIcoPtr(Tcl_Interp * interp, char * string) {
return icoPtr;
}
}
- Tcl_AppendResult(interp, " icon \"", string,
+ Tcl_AppendResult(interp, "icon \"", string,
"\" doesn't exist", (char * ) NULL);
return NULL;
}
@@ -519,8 +519,8 @@ TaskbarExpandPercents(IcoInfo *icoPtr, const char *msgstring,
case 'M':
case 'm': {
before++;
- len=(int)strlen(msgstring);
- ptr=msgstring;
+ len = strlen(msgstring);
+ ptr = msgstring;
break;
}
/* case 'W': {
@@ -533,58 +533,58 @@ TaskbarExpandPercents(IcoInfo *icoPtr, const char *msgstring,
case 'i': {
before++;
snprintf(buffer, sizeof(buffer) - 1, "ico#%d", icoPtr->id);
- len=(int)strlen(buffer);
- ptr=buffer;
+ len = strlen(buffer);
+ ptr = buffer;
break;
}
case 'w': {
before++;
- len=GetInt((long)wParam,buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetInt((long)wParam,buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 'l': {
before++;
- len=GetInt((long)lParam,buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetInt((long)lParam,buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 't': {
before++;
- len=GetInt((long)GetTickCount(), buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetInt((long)GetTickCount(), buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 'x': {
POINT pt;
GetCursorPos(&pt);
before++;
- len=GetIntDec((long)pt.x, buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetIntDec((long)pt.x, buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 'y': {
POINT pt;
GetCursorPos(&pt);
before++;
- len=GetIntDec((long)pt.y,buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetIntDec((long)pt.y,buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 'X': {
DWORD dw;
dw=GetMessagePos();
before++;
- len=GetIntDec((long)LOWORD(dw),buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetIntDec((long)LOWORD(dw),buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 'Y': {
DWORD dw;
- dw=GetMessagePos();
+ dw = GetMessagePos();
before++;
- len=GetIntDec((long)HIWORD(dw),buffer, sizeof(buffer));
- ptr=buffer;
+ len = GetIntDec((long)HIWORD(dw),buffer, sizeof(buffer));
+ ptr = buffer;
break;
}
case 'H': {
@@ -595,8 +595,8 @@ TaskbarExpandPercents(IcoInfo *icoPtr, const char *msgstring,
}
case '%': {
before++;
- len=1;
- ptr="%";
+ len = 1;
+ ptr = "%";
break;
}
}
@@ -605,23 +605,26 @@ TaskbarExpandPercents(IcoInfo *icoPtr, const char *msgstring,
char *newspace;
ptrdiff_t dist = dst - after;
int alloclen = ALLOCLEN;
- newspace = (char *) ckalloc(alloclen);
- if(dist>0)
- memcpy((VOID *) newspace, (VOID *) after, dist);
- if(after && *aftersize)
+ newspace = (char *)ckalloc(alloclen);
+ if (dist>0)
+ memcpy(newspace, after, dist);
+ if (after && *aftersize) {
ckfree(after);
+ }
*aftersize =alloclen;
after = newspace;
- dst=after+dist;
+ dst = after + dist;
+ }
+ if (len > 0) {
+ memcpy(dst, ptr, len);
}
- if(len>0)
- memcpy(dst,ptr,len);
- dst+=len;
- if((dst-after)>(*aftersize-1))
+ dst += len;
+ if ((dst-after)>(*aftersize-1)) {
printf("oops\n");
+ }
before++;
}
- *dst=0;
+ *dst = 0;
return after;
}
@@ -1065,7 +1068,7 @@ CreateIcoFromTkImage(
/*
*----------------------------------------------------------------------
*
- * WinIcoCmd --
+ * WinSystrayCmd --
*
* Main command for creating, displaying, and removing icons from taskbar.
*
@@ -1079,36 +1082,36 @@ CreateIcoFromTkImage(
*/
static int
-WinIcoCmd(
+WinSystrayCmd(
TCL_UNUSED(void *),
Tcl_Interp * interp,
- int argc, const char * argv[]) {
+ int objc,
+ Tcl_Obj * const objv[])
+{
size_t length;
HICON hIcon;
int i;
IcoInfo * icoPtr;
BlockOfIconImagesPtr lpIR = NULL;
- if (argc < 2) {
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " option arg arg ...\"", (char * ) NULL);
- return TCL_ERROR;
+ if (objc < 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "option arg arg ...");
+ return TCL_ERROR;
}
- length = strlen(argv[1]);
- if ((strncmp(argv[1], "createfrom", length) == 0) && (length >= 2)) {
+ length = strlen(Tcl_GetString(objv[1]));
+ if ((strncmp(Tcl_GetString(objv[1]), "createfrom", length) == 0) && (length >= 2)) {
int pos = 0;
- if (argc < 3) {
- Tcl_AppendResult(interp, "wrong # args: should be:",
- argv[0], " createfrom <Tk image> ", (char * ) NULL);
+ if (objc < 3) {
+ Tcl_WrongNumArgs(interp, 1, objv, "createfrom <Tk image>");
return TCL_ERROR;
}
- CreateIcoFromTkImage(interp, argv[2]);
+ CreateIcoFromTkImage(interp, Tcl_GetString(objv[2]));
lpIR = iconBits;
if (lpIR == NULL) {
- Tcl_AppendResult(interp, " reading of ", argv[2], " failed!", (char * ) NULL);
+ Tcl_AppendResult(interp, "reading of ", Tcl_GetString(objv[2]), " failed!", NULL);
return TCL_ERROR;
}
hIcon = NULL;
@@ -1123,81 +1126,77 @@ WinIcoCmd(
}
if (hIcon == NULL) {
FreeIconResource(lpIR);
- Tcl_AppendResult(interp, " Could not find an icon in ", argv[2], (char * ) NULL);
+ Tcl_AppendResult(interp, "Could not find an icon in ", Tcl_GetString(objv[2]), NULL);
return TCL_ERROR;
}
NewIcon(interp, hIcon, ICO_FILE, lpIR, pos);
- } else if ((strncmp(argv[1], "delete", length) == 0) &&
+ } else if ((strncmp(Tcl_GetString(objv[1]), "delete", length) == 0) &&
(length >= 2)) {
- if (argc != 3) {
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " delete id\"", (char * ) NULL);
+ if (objc != 3) {
+ Tcl_WrongNumArgs(interp, 1, objv, "delete id");
return TCL_ERROR;
}
- icoPtr = GetIcoPtr(interp, (char * ) argv[2]);
+ icoPtr = GetIcoPtr(interp, Tcl_GetString(objv[2]));
if (icoPtr == NULL) {
Tcl_ResetResult(interp);
return TCL_OK;
}
FreeIcoPtr(interp, icoPtr);
return TCL_OK;
- } else if ((strncmp(argv[1], "text", length) == 0) && (length >= 2)) {
- if (argc < 2) {
- Tcl_AppendResult(interp, " wrong # args: should be \"",
- argv[0], " text <id> ?newtext?\"", (char * ) NULL);
+ } else if ((strncmp(Tcl_GetString(objv[1]), "text", length) == 0) && (length >= 2)) {
+ if (objc < 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "text <id> ?newtext?");
return TCL_ERROR;
}
- if ((icoPtr = GetIcoPtr(interp, (char * ) argv[2])) == NULL) return TCL_ERROR;
- if (argc > 3) {
- char * newtxt = (char * ) argv[3];
+ if ((icoPtr = GetIcoPtr(interp, Tcl_GetString(objv[2]))) == NULL) return TCL_ERROR;
+ if (objc > 3) {
+ const char * newtxt = Tcl_GetString(objv[3]);
if (icoPtr -> taskbar_txt != NULL) {
ckfree(icoPtr -> taskbar_txt);
}
- icoPtr -> taskbar_txt = ckalloc((int) strlen(newtxt) + 1);
+ icoPtr -> taskbar_txt = ckalloc(strlen(newtxt) + 1);
strcpy(icoPtr -> taskbar_txt, newtxt);
}
Tcl_AppendResult(interp, icoPtr -> taskbar_txt, (char * ) NULL);
return TCL_OK;
- } else if ((strncmp(argv[1], "taskbar", length) == 0) && (length >= 2)) {
+ } else if ((strncmp(Tcl_GetString(objv[1]), "taskbar", length) == 0) && (length >= 2)) {
char * callback = NULL;
int oper;
- char ** args;
+ Tcl_Obj * const * args;
int c;
- int length;
int count;
char * txt;
- if (argc < 4) {
- Tcl_AppendResult(interp, " wrong # args: should be \"",
- argv[0], " taskbar <add/delete/modify> <id> -callback <callback> \"", (char * ) NULL);
+ if (objc < 4) {
+ Tcl_WrongNumArgs(interp, 1, objv, "taskbar <add/delete/modify> <id> -callback <callback>");
return TCL_ERROR;
}
- if (strcmp(argv[2], "add") == 0) {
+ if (strcmp(Tcl_GetString(objv[2]), "add") == 0) {
oper = NIM_ADD;
- } else if (strncmp(argv[2], "del", 3) == 0) {
+ } else if (strncmp(Tcl_GetString(objv[2]), "del", 3) == 0) {
oper = NIM_DELETE;
- } else if (strncmp(argv[2], "mod", 3) == 0) {
+ } else if (strncmp(Tcl_GetString(objv[2]), "mod", 3) == 0) {
oper = NIM_MODIFY;
} else {
- Tcl_AppendResult(interp, " bad argument ", argv[2], " should be add, delete or modify", (char * ) NULL);
+ Tcl_AppendResult(interp, "bad argument ", Tcl_GetString(objv[2]), " should be add, delete or modify", (char * ) NULL);
return TCL_ERROR;
}
- if ((icoPtr = GetIcoPtr(interp, (char * ) argv[3])) == NULL)
+ if ((icoPtr = GetIcoPtr(interp, Tcl_GetString(objv[3]))) == NULL)
return TCL_ERROR;
hIcon = icoPtr -> hIcon;
txt = icoPtr -> taskbar_txt;
- if (argc > 4) {
- for (count = argc - 4, args = (char ** ) argv + 4; count > 1; count -= 2, args += 2) {
- if (args[0][0] != '-')
+ if (objc > 4) {
+ for (count = objc - 4, args = objv + 4; count > 1; count -= 2, args += 2) {
+ if (Tcl_GetString(args[0])[0] != '-')
goto wrongargs2;
- c = args[0][1];
- length = (int) strlen(args[0]);
+ c = Tcl_GetString(args[0])[1];
+ length = strlen(Tcl_GetString(args[0]));
if ((c == '-') && (length == 2)) {
break;
}
- if ((c == 'c') && (strncmp(args[0], "-callback", length) == 0)) {
- callback = args[1];
- } else if ((c == 't') && (strncmp(args[0], "-text", length) == 0)) {
- txt = args[1];
+ if ((c == 'c') && (strncmp(Tcl_GetString(args[0]), "-callback", length) == 0)) {
+ callback = Tcl_GetString(args[1]);
+ } else if ((c == 't') && (strncmp(Tcl_GetString(args[0]), "-text", length) == 0)) {
+ txt = Tcl_GetString(args[1]);
} else {
goto wrongargs2;
}
@@ -1219,11 +1218,11 @@ WinIcoCmd(
strcpy(icoPtr -> taskbar_txt, txt);
return TaskbarOperation(icoPtr, oper, hIcon, txt);
wrongargs2:
- Tcl_AppendResult(interp, " unknown option \"", args[0], "\",valid are:",
+ Tcl_AppendResult(interp, "unknown option \"", args[0], "\",valid are:",
"-callback <tcl-callback> -text <tooltiptext>", (char * ) NULL);
return TCL_ERROR;
} else {
- Tcl_AppendResult(interp, " bad argument \"", argv[1],
+ Tcl_AppendResult(interp, "bad argument \"", Tcl_GetString(objv[1]),
"\": must be createfrom, delete, text, taskbar",
(char * ) NULL);
return TCL_ERROR;
@@ -1235,7 +1234,7 @@ WinIcoCmd(
/*
*----------------------------------------------------------------------
*
- * WinSystrayCmd --
+ * WinSysNotifyCmd --
*
* Main command for creating and displaying notifications/balloons from system tray.
*
@@ -1249,29 +1248,27 @@ WinIcoCmd(
*/
static int
-WinSystrayCmd(
+WinSysNotifyCmd(
TCL_UNUSED(void *),
Tcl_Interp * interp,
- int argc,
- const char *argv[])
+ int objc,
+ Tcl_Obj * const objv[])
{
size_t length;
IcoInfo * icoPtr;
Tcl_DString infodst;
Tcl_DString titledst;
- NOTIFYICONDATAA ni;
- char * msgtitle;
- char * msginfo;
- char * title;
- char * info;
+ NOTIFYICONDATAW ni;
+ char *msgtitle;
+ char *msginfo;
- icoPtr = GetIcoPtr(interp, (char * ) argv[2]);
+ icoPtr = GetIcoPtr(interp, Tcl_GetString(objv[2]));
if (icoPtr == NULL) {
Tcl_ResetResult(interp);
return TCL_OK;
}
- ni.cbSize = sizeof(NOTIFYICONDATAA);
+ ni.cbSize = sizeof(NOTIFYICONDATAW);
ni.hWnd = CreateTaskbarHandlerWindow();
ni.uID = icoPtr -> id;
ni.uFlags = NIF_INFO;
@@ -1279,37 +1276,39 @@ WinSystrayCmd(
ni.hIcon = icoPtr -> hIcon;
ni.dwInfoFlags = NIIF_INFO; /*Use a sane platform-specific icon here.*/
- if (argc < 2) {
- Tcl_AppendResult(interp, " wrong # args: should be \"",
- argv[0], " option arg arg ...\"", (char * ) NULL);
+ if (objc < 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "option arg arg ...");
return TCL_ERROR;
}
- length = strlen(argv[1]);
- if ((strncmp(argv[1], "notify", length) == 0) &&
+ length = strlen(Tcl_GetString(objv[1]));
+ if ((strncmp(Tcl_GetString(objv[1]), "notify", length) == 0) &&
(length >= 2)) {
- if (argc != 5) {
- Tcl_AppendResult(interp, " wrong # args: should be \"",
- argv[0], " notify id title detail\"", (char * ) NULL);
+ if (objc != 5) {
+ Tcl_WrongNumArgs(interp, 1, objv, "notify id title detail");
return TCL_ERROR;
}
- msgtitle = (char * ) argv[3];
- msginfo = (char * ) argv[4];
+ msgtitle = Tcl_GetString(objv[3]);
+ msginfo = Tcl_GetString(objv[4]);
/* Balloon notification for system tray icon. */
if (msgtitle != NULL) {
- title = (CHAR * ) Tcl_UtfToExternalDString(NULL, msgtitle, -1, & titledst);
- strncpy(ni.szInfoTitle, msgtitle, Tcl_DStringLength( & titledst) + 1);
+ WCHAR *title;
+ Tcl_DStringInit(&titledst);
+ title = Tcl_UtfToWCharDString(msgtitle, -1, &titledst);
+ wcsncpy(ni.szInfoTitle, title, (Tcl_DStringLength(&titledst) + 2) / 2);
Tcl_DStringFree( & titledst);
}
if (msginfo != NULL) {
- info = (CHAR * ) Tcl_UtfToExternalDString(NULL, msginfo, -1, & infodst);
- strncpy(ni.szInfo, msginfo, Tcl_DStringLength( & infodst) + 1);
- Tcl_DStringFree( & infodst);
+ WCHAR *info;
+ Tcl_DStringInit(&infodst);
+ info = Tcl_UtfToWCharDString(msginfo, -1, &infodst);
+ wcsncpy(ni.szInfo, info, (Tcl_DStringLength(&infodst) + 2) / 2);
+ Tcl_DStringFree(&infodst);
}
- Shell_NotifyIconA(NIM_MODIFY, & ni);
+ Shell_NotifyIconW(NIM_MODIFY, &ni);
return TCL_OK;
}
return TCL_OK;
@@ -1344,9 +1343,9 @@ WinIcoInit(Tcl_Interp * interp) {
}
#endif
- Tcl_CreateCommand(interp, "_systray", WinIcoCmd, (ClientData)interp,
+ Tcl_CreateObjCommand(interp, "_systray", WinSystrayCmd, (ClientData)interp,
(Tcl_CmdDeleteProc *) WinIcoDestroy);
- Tcl_CreateCommand(interp, "_sysnotify", WinSystrayCmd, NULL, NULL);
+ Tcl_CreateObjCommand(interp, "_sysnotify", WinSysNotifyCmd, NULL, NULL);
return TCL_OK;
}