xserver: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Sep 18 19:19:56 UTC 2019


 hw/xwin/InitOutput.c   |    2 +
 hw/xwin/man/XWin.man   |    4 ++
 hw/xwin/man/XWinrc.man |   29 ++++++++++---------
 hw/xwin/system.XWinrc  |   12 ++-----
 hw/xwin/win.h          |    4 ++
 hw/xwin/wincreatewnd.c |   20 ++-----------
 hw/xwin/winprefs.c     |   74 +++++++++++++++++++++++++++++++++++++------------
 hw/xwin/winprefs.h     |    3 +
 hw/xwin/winprocarg.c   |   31 ++++++++++++++++++++
 9 files changed, 124 insertions(+), 55 deletions(-)

New commits:
commit bcf2dd0cd20825ccf4284c67f678ad37ecd1d2b1
Author: Jon Turney <jon.turney at dronecode.org.uk>
Date:   Fri Feb 19 21:53:00 2016 +0000

    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

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:
-.br
-\fB"NAME.ICO"\fP\fI of an .ico format file\fP
-.br
-\t \t ("cygwin.ico", "apple.ico")
-.br
-\fB"NAME.DLL,nn"\fP\fI of a .DLL and icon index\fP
+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
-\t \t ("c:\\windows\\system32\\shell32.dll,4" is the default folder icon)
+(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
-\fB",nnn"\fP\fI index into XWin.EXE internal ICON resources\fP
+(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
-\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 <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 {
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 <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);
-            hicon = ExtractIcon(g_hInstance, file, i);
         }
         else {
-            /* Just an .ico file... */
+            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 {
+            /* 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;
 }
 


More information about the xorg-commit mailing list