diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c index c336820df..2e07464ff 100644 --- a/hw/xwin/InitOutput.c +++ b/hw/xwin/InitOutput.c @@ -757,6 +757,8 @@ winUseMsg(void) ErrorF("-[no]hostintitle\n" "\tIn multiwindow mode, add remote host names to window titles.\n"); + ErrorF("-icon icon_specifier\n" "\tSet screen window icon in windowed mode.\n"); + ErrorF("-ignoreinput\n" "\tIgnore keyboard and mouse input.\n"); #ifdef XWIN_XF86CONFIG diff --git a/hw/xwin/man/XWin.man b/hw/xwin/man/XWin.man index f9305f592..56bea1c12 100644 --- a/hw/xwin/man/XWin.man +++ b/hw/xwin/man/XWin.man @@ -108,6 +108,10 @@ The X server window takes the full screen, covering completely the \fIWindows\fP desktop. Currently \fB\-fullscreen\fP may only be applied to one X screen. .TP 8 +.B "\-icon" \fIicon-specifier\fP +Override the window icon for the screen window from the default. +The \fIicon-specifier\fP is as defined in \fIXWinrc(@filemansuffix@)\fP. +.TP 8 .B \-nodecoration Do not give the Cygwin/X window a \fIWindows\fP window border, title bar, etc. diff --git a/hw/xwin/man/XWinrc.man b/hw/xwin/man/XWinrc.man index 0cc2d9d44..bc51a7a64 100644 --- a/hw/xwin/man/XWinrc.man +++ b/hw/xwin/man/XWinrc.man @@ -134,31 +134,34 @@ such items should be included at the start or at the end of the menu. .SH Icon Instructions -When specifying an \fIicon-file\fP in the following commands several different formats are allowed: +When specifying an \fIicon-specifier\fP in the following commands several different formats are allowed: +.PP +.IP \fI"NAME.ICO"\fP 16 +filename of an .ico format file .br -\fB"NAME.ICO"\fP\fI of an .ico format file\fP +(e.g. "cygwin.ico", "apple.ico", "C:\\icons\\cheese.ico", "/usr/share/icons/moon.ico") +.IP \fI"NAME.DLL,nnn"\fP 16 +filename of a DLL with an index into it's ICON resources .br -\t \t ("cygwin.ico", "apple.ico") +(e.g. "c:\\windows\\system32\\shell32.dll,4", the default folder icon, + "/usr/bin/cygicons-0.dll,10", the hippo icon) +.IP \fI",nnn"\fP 16 +index into the XWin executable's internal ICON resources .br -\fB"NAME.DLL,nn"\fP\fI of a .DLL and icon index\fP -.br -\t \t ("c:\\windows\\system32\\shell32.dll,4" is the default folder icon) -.br -\fB",nnn"\fP\fI index into XWin.EXE internal ICON resources\fP -.br -\t \t (",101" is the 1st icon inside \fIXWin.EXE\fP) +(e.g. ",101" is the 1st icon in \fIXWin\fP) .TP 8 .B ICONDIRECTORY \fIWindows-path-to-icon-directory\fP -Defines the default directory to search for \ficon-file\fP files. +Defines the default directory for the file when an \fIicon-specifier\fP doesn't +contain an absolute path. It should be a \fIWindows\fP style path (e.g. C:\\cygwin\\usr\\local\\icons). .TP 8 -.B DEFAULTICON \fIicon-file\fP +.B DEFAULTICON \fIicon-specifier\fP Defines a replacement for the standard X icon for applications without specified icons. .TP 8 .B ICONS { .br - \fIclass-or-name-of-window\fP \fIicon-file\fP + \fIclass-or-name-of-window\fP \fIicon-specifier\fP .br \fI...\fP .br diff --git a/hw/xwin/system.XWinrc b/hw/xwin/system.XWinrc index f0771c610..fb44be37d 100644 --- a/hw/xwin/system.XWinrc +++ b/hw/xwin/system.XWinrc @@ -8,10 +8,6 @@ # Comments begin with "#" or "//" and go to the end-of-line -# Paths to commands are **cygwin** based (i.e. /usr/local/bin/xcalc) - -# Paths to icons are **WINDOWS** based (i.e. c:\windows\icons) - # Menus are defined as... # MENU { # EXEC @@ -55,15 +51,15 @@ # To define where ICO files live (** Windows path**) # ICONDIRECTORY -# NOTE: If you specify a fully qualified path to an ICON below -# (i.e. "c:\xxx" or "d:\xxxx") +# NOTE: If you specify an absolute path in Windows or Cygwin format to an ICON below +# (i.e. "c:\icons\xxx.ico" or "/usr/share/icons/xxx.ico") # this ICONDIRECTORY will not be prepended # To change the taskbar icon use... -# TRAYICON +# TRAYICON # To define a replacement for the standard X icon for apps w/o specified icons -# DEFAULTICON +# DEFAULTICON # To define substitute icons on a per-window basis use... # ICONS { diff --git a/hw/xwin/win.h b/hw/xwin/win.h index 8eabeae31..6f3437284 100644 --- a/hw/xwin/win.h +++ b/hw/xwin/win.h @@ -404,6 +404,10 @@ typedef struct { /* Did the user explicitly set this screen? */ Bool fExplicitScreen; + + /* Icons for screen window */ + HICON hIcon; + HICON hIconSm; } winScreenInfo, *winScreenInfoPtr; /* diff --git a/hw/xwin/wincreatewnd.c b/hw/xwin/wincreatewnd.c index d304f248f..a69c9c643 100644 --- a/hw/xwin/wincreatewnd.c +++ b/hw/xwin/wincreatewnd.c @@ -72,18 +72,12 @@ winCreateBoundingWindowFullScreen(ScreenPtr pScreen) wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hInstance; - wc.hIcon = - (HICON) LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, - GetSystemMetrics(SM_CXICON), - GetSystemMetrics(SM_CYICON), 0); + wc.hIcon = pScreenInfo->hIcon; wc.hCursor = 0; wc.hbrBackground = 0; wc.lpszMenuName = NULL; wc.lpszClassName = WINDOW_CLASS; - wc.hIconSm = - (HICON) LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTSIZE); + wc.hIconSm = pScreenInfo->hIconSm; RegisterClassEx(&wc); /* Set display and screen-specific tooltip text */ @@ -179,18 +173,12 @@ winCreateBoundingWindowWindowed(ScreenPtr pScreen) wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hInstance; - wc.hIcon = - (HICON) LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, - GetSystemMetrics(SM_CXICON), - GetSystemMetrics(SM_CYICON), 0); + wc.hIcon = pScreenInfo->hIcon; wc.hCursor = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = WINDOW_CLASS; - wc.hIconSm = - (HICON) LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTSIZE); + wc.hIconSm = pScreenInfo->hIconSm; RegisterClassEx(&wc); /* Get size of work area */ diff --git a/hw/xwin/winprefs.c b/hw/xwin/winprefs.c index 0ac5b4fea..a948e4a7d 100644 --- a/hw/xwin/winprefs.c +++ b/hw/xwin/winprefs.c @@ -37,6 +37,7 @@ #include #ifdef __CYGWIN__ #include +#include #endif #include "win.h" @@ -59,9 +60,6 @@ extern int parse_file(FILE * fp); /* Currently in use command ID, incremented each new menu item created */ static int g_cmdid = STARTMENUID; -/* Local function to handle comma-ified icon names */ -static HICON LoadImageComma(char *fname, int sx, int sy, int flags); - /* * Creates or appends a menu from a MENUPARSED structure */ @@ -474,7 +472,7 @@ winOverrideDefaultIcon(int size) HICON hicon; if (pref.defaultIconName[0]) { - hicon = LoadImageComma(pref.defaultIconName, size, size, 0); + hicon = LoadImageComma(pref.defaultIconName, pref.iconDirectory, size, size, 0); if (hicon == NULL) ErrorF("winOverrideDefaultIcon: LoadImageComma(%s) failed\n", pref.defaultIconName); @@ -496,9 +494,12 @@ winTaskbarIcon(void) hicon = 0; /* First try and load an overridden, if success then return it */ if (pref.trayIconName[0]) { - hicon = LoadImageComma(pref.trayIconName, + hicon = LoadImageComma(pref.trayIconName, pref.iconDirectory, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); + if (hicon == NULL) + ErrorF("winTaskbarIcon: LoadImageComma(%s) failed\n", + pref.trayIconName); } /* Otherwise return the default */ @@ -513,17 +514,18 @@ winTaskbarIcon(void) } /* + * Handle comma-ified icon names + * * Parse a filename to extract an icon: * If fname is exactly ",nnn" then extract icon from our resource * else if it is "file,nnn" then extract icon nnn from that file * else try to load it as an .ico file and if that fails return NULL */ -static HICON -LoadImageComma(char *fname, int sx, int sy, int flags) +HICON +LoadImageComma(char *fname, char *iconDirectory, int sx, int sy, int flags) { HICON hicon; int i; - char file[PATH_MAX + NAME_MAX + 2]; /* Some input error checking */ if (!fname || !fname[0]) @@ -539,31 +541,67 @@ LoadImageComma(char *fname, int sx, int sy, int flags) MAKEINTRESOURCE(i), IMAGE_ICON, sx, sy, flags); } else { + char *file = malloc(PATH_MAX + NAME_MAX + 2); + Bool convert = FALSE; + + if (!file) + return NULL; + file[0] = 0; - /* Prepend path if not given a "X:\" filename */ + + /* If fname starts 'X:\', it's an absolute Windows path, do nothing */ if (!(fname[0] && fname[1] == ':' && fname[2] == '\\')) { - strcpy(file, pref.iconDirectory); - if (pref.iconDirectory[0]) - if (fname[strlen(fname) - 1] != '\\') - strcat(file, "\\"); +#ifdef __CYGWIN__ + /* If fname starts with '/', it's an absolute cygwin path, we'll + need to convert it */ + if (fname[0] == '/') { + convert = TRUE; + } + else +#endif + if (iconDirectory) { + /* Otherwise, prepend the default icon directory, which + currently must be in absolute Windows path form */ + strcpy(file, iconDirectory); + if (iconDirectory[0]) + if (iconDirectory[strlen(iconDirectory) - 1] != '\\') + strcat(file, "\\"); + } } strcat(file, fname); + /* Trim off any ',index' */ if (strrchr(file, ',')) { - /* Specified as , */ - *(strrchr(file, ',')) = 0; /* End string at comma */ i = atoi(strrchr(fname, ',') + 1); + } + else { + i = -1; + } + +#ifdef __CYGWIN__ + /* Convert from Cygwin path to Windows path */ + if (convert) { + char *converted_file = cygwin_create_path(CCP_POSIX_TO_WIN_A | CCP_ABSOLUTE, file); + if (converted_file) { + free(file); + file = converted_file; + } + } +#endif + + if (i >= 0) { + /* Specified as , */ hicon = ExtractIcon(g_hInstance, file, i); } else { - /* Just an .ico file... */ - + /* Specified as just an .ico file */ hicon = (HICON) LoadImage(NULL, file, IMAGE_ICON, sx, sy, LR_LOADFROMFILE | flags); } + free(file); } return hicon; } @@ -585,7 +623,7 @@ winOverrideIcon(char *res_name, char *res_class, char *wmName) if (pref.icon[i].hicon) return pref.icon[i].hicon; - hicon = LoadImageComma(pref.icon[i].iconFile, 0, 0, LR_DEFAULTSIZE); + hicon = LoadImageComma(pref.icon[i].iconFile, pref.iconDirectory, 0, 0, LR_DEFAULTSIZE); if (hicon == NULL) ErrorF("winOverrideIcon: LoadImageComma(%s) failed\n", pref.icon[i].iconFile); diff --git a/hw/xwin/winprefs.h b/hw/xwin/winprefs.h index 936a42f22..597398ee2 100644 --- a/hw/xwin/winprefs.h +++ b/hw/xwin/winprefs.h @@ -175,4 +175,7 @@ unsigned long HICON winTaskbarIcon(void); HICON winOverrideDefaultIcon(int size); + +HICON LoadImageComma(char *fname, char *iconDirectory, int sx, int sy, int flags); + #endif diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c index cb03b00e0..b5c2643be 100644 --- a/hw/xwin/winprocarg.c +++ b/hw/xwin/winprocarg.c @@ -40,6 +40,7 @@ from The Open Group. #include "winconfig.h" #include "winmsg.h" #include "winmonitors.h" +#include "winprefs.h" #include "winclipboard/winclipboard.h" @@ -139,6 +140,13 @@ winInitializeScreenDefaults(void) defaultScreenInfo.fUseUnixKillKey = WIN_DEFAULT_UNIX_KILL; defaultScreenInfo.fIgnoreInput = FALSE; defaultScreenInfo.fExplicitScreen = FALSE; + defaultScreenInfo.hIcon = (HICON) + LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, + GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), 0); + defaultScreenInfo.hIconSm = (HICON) + LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_XWIN), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + LR_DEFAULTSIZE); /* Note that the default screen has been initialized */ fInitializedScreenDefaults = TRUE; @@ -1066,6 +1074,29 @@ ddxProcessArgument(int argc, char *argv[], int i) return 1; } + if (IS_OPTION("-icon")) { + char *iconspec; + CHECK_ARGS(1); + iconspec = argv[++i]; + screenInfoPtr->hIcon = LoadImageComma(iconspec, NULL, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), + 0); + screenInfoPtr->hIconSm = LoadImageComma(iconspec, NULL, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_DEFAULTSIZE); + if ((screenInfoPtr->hIcon == NULL) || + (screenInfoPtr->hIconSm == NULL)) { + ErrorF("ddxProcessArgument - icon - Invalid icon specification %s\n", + iconspec); + exit(1); + } + + /* Indicate that we have processed the argument */ + return 2; + } + return 0; }