欢迎您使用《汉王简》中文输入引擎 江毅 二OO四年九月 www.hanwj.com hanwj178@gmail.com
Linux源码及编程交流
(声明:本处所登程序仅供参考,不能保证百分之百正确。欢迎各位寄电邮给我(hanwj178@gmail.com),对程序评论、指正、增添功能,以及增添小程序。)版权要求:程序随便用,但务请保留作者名和作者网址。谢谢。Copyright: Free to copy/use, but please keep author name and author website name intact. Thanks.
在应用程序中打开html文件。
int FindInstalledWebBrowser(char *buf); void OpenHtml(LPSTR htmlfilepath) {//Author: Jiang,Yi HanWJ.com char browserPath[512]; if(!FindInstalledWebBrowser(browserPath) || 0 == browserPath[0]) return; char cmd[1024]; sprintf(cmd, "%s %s", browserPath, htmlfilepath); pid_t pid = fork(); if(0==pid) system(cmd); } int FindInstalledWebBrowser(char *buf); {//Author: Jiang,Yi HanWJ.com char str[1024]; char *veryPossibles[] = {"/usr/local/mozilla/mozilla", "/usr/local/mozilla/firefox", "/usr/local/netscape/netscape", "/usr/mozilla/mozilla", "/usr/mozilla/firefox", "/usr/netscape/netscape", 0, }; char *possiblePaths[] = {"/usr/bin/", "/usr/local/bin/", "", }; char *possibleNms[] = {"konqueror", "kfmbrowser", "mozilla", "firefox", "netscape", }; int i=0, j; //try direct paths while(veryPossibles[i] && veryPossibles[i][0]) { if(0 == _access(veryPossibles[i], X_OK) ) {//if exist and executable strcpy(buf, veryPossibles[i]); return 1; } i++; } //try path/nm combinations for(i=0; i<2; i++) { for(j=0; j<4; j++) {//if exist and executable sprintf(str, "%s%s", possiblePaths[i], possibleNms[j]); if(0 == _access(str, X_OK) ) { strcpy(buf, veryPossibles[i]); return 1; } } } return 0; } }
对于从微软视窗移植过来的程序,对于文件名的大小写常常是不加区别的。一下程序给定一个大小写随便的文件名,找到某一目录下相对应的真实文件名(假定在大小写不限情况下,该目录下文件名具有唯一性)。
int GetMatchingRealFileNameForCaseInSensitiveName(char * szPath, char * szCaseInsensitiveName, char *szResult) {//Author: Jiang,Yi HanWJ.com struct dirent **nmlst; szResult[0] = 0; int ret=0, n = scandir(szPath, &nmlst, 0, alphasort); for(int i=0; id_name) ) { strcpy(szResult, nmlst[i]->d_name); ret = 1; } free(nmlst[i]); } if(-1 < n) free(nmlst); return ret; ; }
取系统时间。相当于微软视窗上的GetTickCount().
DWORD GetMiliSecCount() {//Author: Jiang,Yi HanWJ.com timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec*1000L+tv.tv_usec/1000L; }
检查自己程序是否是第一个运行实例。(instance here means app process)
int IsFirstInstance() {//Author: Jiang,Yi HanWJ.com char line[2048], *p; int myProcessId = getpid(); FILE *fp = popen("ps -x", "r"); if(fp) { int pid; while(fgets(line, sizeof(line), fp) ) { if(strstr(line, szMyAppName) && 0!=(p = strstr(line, szMyAppPath) ) ) { int m = p-line; if(0 < m && IsWhiteSpace(line[m-1]) && m<100) { pid = 0; sscanf(line, "%d ", &pid); if(0 < pid) { if(pid < myProcessId)//1st instance has smallest pid { return 0; } } } } } pclose(fp);//fclose(fp); } return 1; }
取桌面尺寸。
void GetWindowsWorkArea(Rect *prc) {//Author: Jiang,Yi HanWJ.com prc->left = prc->top = 0; prc->right = DisplayWidth (dsply, 0); prc->bottom= DisplayHeight(dsply, 0); }
取视窗尺寸。
Size GetWinSize(Window win) {//Author: Jiang,Yi HanWJ.com XWindowAttributes attr; Status retStatus = XGetWindowAttributes(dsply, win, &attr); if(!retStatus) return 0; Size siz; siz.cx = attr.width; siz.cy = attr.height; return siz; }
察看视窗显示状态。
BOOL IsWinShown(Window win) {//Author: Jiang,Yi HanWJ.com XWindowAttributes attr; Status ret = XGetWindowAttributes(dsply, win, &attr); return 1==ret && IsUnmapped != attr.map_state; }
取视窗大小。
int GetWinRect(Window win, CRect*rc) {//Author: Jiang,Yi HanWJ.com XWindowAttributes attr; Window wParent; Status retStatus = XGetWindowAttributes(dsply, win, &attr); if(!retStatus) return 0; rc->left = attr.x; rc->top = attr.y; rc->right = rc->left+ attr.width; rc->bottom = rc->top+ attr.height; Window rt = DefaultRootWindow(dsply); while(0!=(wParent=GetWinParent(win) ) && wParent != rt ) { retStatus = XGetWindowAttributes(dsply, wParent, &attr); if(!retStatus) return 0; win = wParent; rc->OffsetRect(attr.x, attr.y); } return 1; }
取父视窗。
Window GetWinParent(Window w) {//Author: Jiang,Yi HanWJ.com Window root_return; Window parent_return; Window *children_return; unsigned int nchildren_return; Status retStatus = XQueryTree(dsply, w, &root_return, &parent_return, &children_return, &nchildren_return); if(!retStatus) return 0; return parent_return; }