hw/xwin: Add -icon option to set the screen window icon in windowed mode
Add an -icon option to set the screen window icon in windowed mode Allow cygwin paths in an icon-specification Update man pages and system.XWinrc appropriately Also, log an error if the icon specified for TRAYICON cannot be loaded Also, fix a bug in appending a '\' to IconDirectory only if it doesn't already end with one, which was fortunately benign. Note: LoadImageComma would be simpler if we just stated that XWinrc paths are Cygwin paths on Cygwin, Windows paths on MinGW, but that could break existing .XWinrc files Note: Given that we can specify paths in an icon-specifier, I'm not sure what IconDirectory wins us. v2: Fix formatting problems in man page additions v3: Fix some more s/_/@/g in man pages
This commit is contained in:
parent
ac5d3a200a
commit
bcf2dd0cd2
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 <name> {
|
||||
# <Menu Text> EXEC <command>
|
||||
|
@ -55,15 +51,15 @@
|
|||
|
||||
# To define where ICO files live (** Windows path**)
|
||||
# ICONDIRECTORY <windows-path i.e. c:\cygwin\usr\icons>
|
||||
# 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 <name-of-windows-ico-file-in-icondirectory>
|
||||
# TRAYICON <icon-specifier>
|
||||
|
||||
# To define a replacement for the standard X icon for apps w/o specified icons
|
||||
# DEFAULTICON <name-of-windows-ico-file-in-icondirectory>
|
||||
# DEFAULTICON <icon-specifier>
|
||||
|
||||
# To define substitute icons on a per-window basis use...
|
||||
# ICONS {
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <stdlib.h>
|
||||
#ifdef __CYGWIN__
|
||||
#include <sys/resource.h>
|
||||
#include <sys/cygwin.h>
|
||||
#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 <fname>,<index> */
|
||||
|
||||
*(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 <fname>,<index> */
|
||||
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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue