diff options
author | Jon Turney <jon.turney@dronecode.org.uk> | 2016-07-22 18:54:28 +0100 |
---|---|---|
committer | Jon Turney <jon.turney@dronecode.org.uk> | 2016-07-22 18:54:28 +0100 |
commit | 5f29e0ff272777eaef3a2710d23a126df3f89e0b (patch) | |
tree | d6a96b570f89d69be6e6398e90e4735690ed7c78 /hw/xwin | |
parent | b0d8401365baec49b540cc7a0e3fc760f8c52fff (diff) | |
parent | eb3597a699e49130fa63121b2c3ef24b6fcb4d8c (diff) |
Merge branch 'cygwin-patches-for-1.18' into cygwin-release-1.18xserver-cygwin-1.18.4-1cygwin-release-1.18
Diffstat (limited to 'hw/xwin')
-rw-r--r-- | hw/xwin/InitOutput.c | 2 | ||||
-rw-r--r-- | hw/xwin/glx/indirect.c | 205 | ||||
-rw-r--r-- | hw/xwin/glx/indirect.h | 1 | ||||
-rw-r--r-- | hw/xwin/man/XWin.man | 6 | ||||
-rw-r--r-- | hw/xwin/man/XWinrc.man | 29 | ||||
-rw-r--r-- | hw/xwin/system.XWinrc | 12 | ||||
-rw-r--r-- | hw/xwin/win.h | 4 | ||||
-rw-r--r-- | hw/xwin/wincreatewnd.c | 20 | ||||
-rw-r--r-- | hw/xwin/winmultiwindowwindow.c | 2 | ||||
-rw-r--r-- | hw/xwin/winmultiwindowwndproc.c | 23 | ||||
-rw-r--r-- | hw/xwin/winprefs.c | 74 | ||||
-rw-r--r-- | hw/xwin/winprefs.h | 4 | ||||
-rw-r--r-- | hw/xwin/winprocarg.c | 38 | ||||
-rw-r--r-- | hw/xwin/winvalargs.c | 10 |
14 files changed, 295 insertions, 135 deletions
diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c index d8c8e8655..3d7ab8e9e 100644 --- a/hw/xwin/InitOutput.c +++ b/hw/xwin/InitOutput.c @@ -783,6 +783,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/glx/indirect.c b/hw/xwin/glx/indirect.c index c86fcf191..46622e99e 100644 --- a/hw/xwin/glx/indirect.c +++ b/hw/xwin/glx/indirect.c @@ -104,8 +104,6 @@ typedef struct { int notOpenGL; - int rgbaFloat; - int unsignedRgbaFloat; int unknownPixelType; int unaccelerated; } PixelFormatRejectStats; @@ -298,23 +296,26 @@ static void fbConfigsDump(unsigned int n, __GLXconfig * c, PixelFormatRejectStats *rejects) { LogMessage(X_INFO, "%d fbConfigs\n", n); - LogMessage(X_INFO, "ignored pixel formats: %d not OpenGL, %d RBGA float, %d RGBA unsigned float, %d unknown pixel type, %d unaccelerated\n", - rejects->notOpenGL, rejects->rgbaFloat, rejects->unsignedRgbaFloat, - rejects->unknownPixelType, rejects->unaccelerated); + LogMessage(X_INFO, "ignored pixel formats: %d not OpenGL, %d unknown pixel type, %d unaccelerated\n", + rejects->notOpenGL, rejects->unknownPixelType, rejects->unaccelerated); if (g_iLogVerbose < 3) return; ErrorF - ("pxf vis fb render Ste aux accum MS drawable Group/\n"); + ("pxf vis fb render Ste aux accum MS drawable Group/ sRGB\n"); ErrorF - ("idx ID ID VisualType Depth Lvl RGB CI DB Swap reo R G B A Z S buf AR AG AB AA bufs num W P Pb Float Trans Caveat\n"); + ("idx ID ID VisualType Depth Lvl RGB CI DB Swap reo R G B A Z S buf AR AG AB AA bufs num W P Pb Float Trans Caveat cap \n"); ErrorF - ("-----------------------------------------------------------------------------------------------------------------------------\n"); + ("----------------------------------------------------------------------------------------------------------------------------------\n"); while (c != NULL) { unsigned int i = ((GLXWinConfig *) c)->pixelFormatIndex; + const char *float_col = "."; + if (c->renderType & GLX_RGBA_FLOAT_BIT_ARB) float_col = "s"; + if (c->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) float_col = "u"; + ErrorF("%3d %3x %3x " "%-11s" " %3d %3d %s %s %s %s %s " @@ -326,7 +327,8 @@ fbConfigsDump(unsigned int n, __GLXconfig * c, PixelFormatRejectStats *rejects) " %s %s %s " " %s " " %s " - " %d %s" + " %d %s " + " %s" "\n", i, c->visualID, c->fbconfigID, visual_class_name(c->visualType), @@ -345,11 +347,11 @@ fbConfigsDump(unsigned int n, __GLXconfig * c, PixelFormatRejectStats *rejects) (c->drawableType & GLX_WINDOW_BIT) ? "y" : ".", (c->drawableType & GLX_PIXMAP_BIT) ? "y" : ".", (c->drawableType & GLX_PBUFFER_BIT) ? "y" : ".", - (c->renderType & (GLX_RGBA_FLOAT_BIT_ARB | - GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT)) ? "y" : ".", + float_col, (c->transparentPixel != GLX_NONE_EXT) ? "y" : ".", c->visualSelectGroup, - (c->visualRating == GLX_SLOW_VISUAL_EXT) ? "*" : " "); + (c->visualRating == GLX_SLOW_VISUAL_EXT) ? "*" : " ", + c->sRGBCapable ? "y" : "."); c = c->next; } @@ -689,11 +691,34 @@ glxWinScreenProbe(ScreenPtr pScreen) } { + int i; Bool glx_sgi_make_current_read = FALSE; + const struct + { + const char *wglext; + const char *glxext; + Bool mandatory; + } extensionMap[] = { + { "WGL_ARB_make_current_read", "GLX_SGI_make_current_read", 0 }, + { "WGL_EXT_swap_control", "GLX_SGI_swap_control", 0 }, + { "WGL_EXT_swap_control", "GLX_MESA_swap_control", 0 }, + // { "WGL_ARB_render_texture", "GLX_EXT_texture_from_pixmap", 0 }, + // Sufficiently different that it's not obvious if this can be done... + { "WGL_ARB_pbuffer", "GLX_SGIX_pbuffer", 0 }, + { "WGL_ARB_multisample", "GLX_ARB_multisample", 0 }, + { "WGL_ARB_multisample", "GLX_SGIS_multisample", 0 }, + { "WGL_ARB_pixel_format_float", "GLX_ARB_fbconfig_float", 0 }, + { "WGL_EXT_pixel_format_packed_float", "GLX_EXT_fbconfig_packed_float", 0 }, + { "WGL_ARB_create_context", "GLX_ARB_create_context", 0 }, + { "WGL_ARB_create_context_profile", "GLX_ARB_create_context_profile", 0 }, + { "WGL_ARB_create_context_robustness", "GLX_ARB_create_context_robustness", 0 }, + { "WGL_EXT_create_context_es2_profile", "GLX_EXT_create_context_es2_profile", 0 }, + { "WGL_ARB_framebuffer_sRGB", "GLX_ARB_framebuffer_sRGB", 0 }, + }; + // // Based on the WGL extensions available, enable various GLX extensions - // XXX: make this table-driven ? // memset(screen->glx_enable_bits, 0, __GLX_EXT_BYTES); @@ -703,52 +728,40 @@ glxWinScreenProbe(ScreenPtr pScreen) __glXEnableExtension(screen->glx_enable_bits, "GLX_OML_swap_method"); __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_fbconfig"); + for (i = 0; i < sizeof(extensionMap)/sizeof(extensionMap[0]); i++) { + if (strstr(wgl_extensions, extensionMap[i].wglext)) { + __glXEnableExtension(screen->glx_enable_bits, extensionMap[i].glxext); + LogMessage(X_INFO, "GLX: enabled %s\n", extensionMap[i].glxext); + } + else if (extensionMap[i].mandatory) { + LogMessage(X_ERROR, "required WGL extension %s is missing\n", extensionMap[i].wglext); + } + } + if (strstr(wgl_extensions, "WGL_ARB_make_current_read")) { - __glXEnableExtension(screen->glx_enable_bits, - "GLX_SGI_make_current_read"); - LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n"); glx_sgi_make_current_read = TRUE; } + // Because it pre-dates WGL_EXT_extensions_string, GL_WIN_swap_hint might + // only be in GL_EXTENSIONS if (strstr(gl_extensions, "GL_WIN_swap_hint")) { __glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer"); LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n"); } - if (strstr(wgl_extensions, "WGL_EXT_swap_control")) { - __glXEnableExtension(screen->glx_enable_bits, - "GLX_SGI_swap_control"); - __glXEnableExtension(screen->glx_enable_bits, - "GLX_MESA_swap_control"); - LogMessage(X_INFO, - "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n"); - } - -/* // Hmm? screen->texOffset */ -/* if (strstr(wgl_extensions, "WGL_ARB_render_texture")) */ -/* { */ -/* __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_texture_from_pixmap"); */ -/* LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n"); */ -/* screen->has_WGL_ARB_render_texture = TRUE; */ -/* } */ - if (strstr(wgl_extensions, "WGL_ARB_pbuffer")) { - __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_pbuffer"); - LogMessage(X_INFO, "AIGLX: enabled GLX_SGIX_pbuffer\n"); screen->has_WGL_ARB_pbuffer = TRUE; } if (strstr(wgl_extensions, "WGL_ARB_multisample")) { - __glXEnableExtension(screen->glx_enable_bits, - "GLX_ARB_multisample"); - __glXEnableExtension(screen->glx_enable_bits, - "GLX_SGIS_multisample"); - LogMessage(X_INFO, - "AIGLX: enabled GLX_ARB_multisample and GLX_SGIS_multisample\n"); screen->has_WGL_ARB_multisample = TRUE; } + if (strstr(wgl_extensions, "WGL_ARB_framebuffer_sRGB")) { + screen->has_WGL_ARB_framebuffer_sRGB = TRUE; + } + screen->base.destroy = glxWinScreenDestroy; screen->base.createContext = glxWinCreateContext; screen->base.createDrawable = glxWinCreateDrawable; @@ -1146,14 +1159,14 @@ glxWinDeferredCreateDrawable(__GLXWinDrawable *draw, __GLXconfig *config) #define RASTERWIDTHBYTES(bmi) (((((bmi)->biWidth*(bmi)->biBitCount)+31)&~31)>>3) size = bmpHeader.biHeight * RASTERWIDTHBYTES(&bmpHeader); - ErrorF("shared memory region size %zu + %u\n", sizeof(BITMAPINFOHEADER), (unsigned int)size); + GLWIN_DEBUG_MSG("shared memory region size %zu + %u\n", sizeof(BITMAPINFOHEADER), (unsigned int)size); // Create unique name for mapping based on XID // // XXX: not quite unique as potentially this name could be used in // another server instance. Not sure how to deal with that. snprintf(name, sizeof(name), "Local\\CYGWINX_WINDOWSDRI_%08x", (unsigned int)draw->base.pDraw->id); - ErrorF("shared memory region name %s\n", name); + GLWIN_DEBUG_MSG("shared memory region name %s\n", name); // Create a file mapping backed by the pagefile draw->hSection = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, @@ -1827,13 +1840,34 @@ fbConfigToPixelFormatIndex(HDC hdc, __GLXconfig * mode, int attribList[60]; SET_ATTR_VALUE(WGL_SUPPORT_OPENGL_ARB, TRUE); - SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, - (mode->visualType == - GLX_TRUE_COLOR) ? WGL_TYPE_RGBA_ARB : - WGL_TYPE_COLORINDEX_ARB); - SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, - (mode->visualType == - GLX_TRUE_COLOR) ? mode->rgbBits : mode->indexBits); + + switch (mode->renderType) + { + case GLX_COLOR_INDEX_BIT: + case GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT: + SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_COLORINDEX_ARB); + SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->indexBits); + break; + + default: + ErrorF("unexpected renderType %x\n", mode->renderType); + /* fall-through */ + case GLX_RGBA_BIT: + SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB); + SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->rgbBits); + break; + + case GLX_RGBA_FLOAT_BIT_ARB: + SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_FLOAT_ARB); + SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->rgbBits); + break; + + case GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT: + SET_ATTR_VALUE(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT); + SET_ATTR_VALUE(WGL_COLOR_BITS_ARB, mode->rgbBits); + break; + } + SET_ATTR_VALUE(WGL_RED_BITS_ARB, mode->redBits); SET_ATTR_VALUE(WGL_GREEN_BITS_ARB, mode->greenBits); SET_ATTR_VALUE(WGL_BLUE_BITS_ARB, mode->blueBits); @@ -1863,6 +1897,11 @@ fbConfigToPixelFormatIndex(HDC hdc, __GLXconfig * mode, if (mode->visualRating == GLX_SLOW_VISUAL_EXT) SET_ATTR_VALUE(WGL_ACCELERATION_ARB, WGL_NO_ACCELERATION_ARB); + if (winScreen->has_WGL_ARB_multisample) { + SET_ATTR_VALUE(WGL_SAMPLE_BUFFERS_ARB, mode->sampleBuffers); + SET_ATTR_VALUE(WGL_SAMPLES_ARB, mode->samples); + } + // must support all the drawable types the mode supports if ((mode->drawableType | drawableTypeOverride) & GLX_WINDOW_BIT) SET_ATTR_VALUE(WGL_DRAW_TO_WINDOW_ARB, TRUE); @@ -1886,6 +1925,9 @@ fbConfigToPixelFormatIndex(HDC hdc, __GLXconfig * mode, SET_ATTR_VALUE(WGL_DRAW_TO_PBUFFER_ARB, TRUE); } + if (winScreen->has_WGL_ARB_framebuffer_sRGB) + SET_ATTR_VALUE(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, TRUE); + SET_ATTR_VALUE(0, 0); // terminator /* choose the first match */ @@ -2251,6 +2293,11 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen, PixelFormatRejectStats * ADD_ATTR(WGL_MAX_PBUFFER_HEIGHT_ARB); } + if (screen->has_WGL_ARB_framebuffer_sRGB) { + // we may not query these attrs if WGL_ARB_framebuffer_sRGB is not offered + ADD_ATTR(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); + } + /* fill in configs */ for (i = 0; i < numConfigs; i++) { int values[num_attrs]; @@ -2304,25 +2351,42 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen, PixelFormatRejectStats * c->base.indexBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0); c->base.rgbBits = 0; c->base.visualType = GLX_STATIC_COLOR; + c->base.renderType = GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT; + + /* + Assume RGBA rendering is available on all single-channel visuals + (it is specified to render to red component in single-channel + visuals, if supported, but there doesn't seem to be any mechanism + to check if it is supported) + + Color index rendering is only supported on single-channel visuals + */ + + break; + + case WGL_TYPE_RGBA_ARB: + c->base.indexBits = 0; + c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0); + c->base.visualType = GLX_TRUE_COLOR; + c->base.renderType = GLX_RGBA_BIT; break; case WGL_TYPE_RGBA_FLOAT_ARB: - rejects->rgbaFloat++; - GLWIN_DEBUG_MSG - ("pixelFormat %d is WGL_TYPE_RGBA_FLOAT_ARB, skipping", i + 1); - continue; + c->base.indexBits = 0; + c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0); + c->base.visualType = GLX_TRUE_COLOR; + c->base.renderType = GLX_RGBA_FLOAT_BIT_ARB; + // assert pbuffer drawable + // assert WGL_ARB_pixel_format_float + break; case WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT: - rejects->unsignedRgbaFloat++; - GLWIN_DEBUG_MSG - ("pixelFormat %d is WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT, skipping", - i + 1); - continue; - - case WGL_TYPE_RGBA_ARB: c->base.indexBits = 0; c->base.rgbBits = ATTR_VALUE(WGL_COLOR_BITS_ARB, 0); c->base.visualType = GLX_TRUE_COLOR; + c->base.renderType = GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT; + // assert pbuffer drawable + // assert WGL_EXT_pixel_format_packed_float break; default: @@ -2422,21 +2486,6 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen, PixelFormatRejectStats * | (ATTR_VALUE(WGL_DRAW_TO_BITMAP_ARB, 0) ? GLX_PIXMAP_BIT : 0) | (ATTR_VALUE(WGL_DRAW_TO_PBUFFER_ARB, 0) ? GLX_PBUFFER_BIT : 0)); - /* - Assume OpenGL RGBA rendering is available on all visuals - (it is specified to render to red component in single-channel visuals, - if supported, but there doesn't seem to be any mechanism to check if it - is supported) - - Color index rendering is only supported on single-channel visuals - */ - if (c->base.visualType == GLX_STATIC_COLOR) { - c->base.renderType = GLX_RGBA_BIT | GLX_COLOR_INDEX_BIT; - } - else { - c->base.renderType = GLX_RGBA_BIT; - } - c->base.xRenderable = GL_TRUE; c->base.fbconfigID = -1; // will be set by __glXScreenInit() @@ -2518,7 +2567,9 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen, PixelFormatRejectStats * GLX_TEXTURE_1D_BIT_EXT | GLX_TEXTURE_2D_BIT_EXT | GLX_TEXTURE_RECTANGLE_BIT_EXT; c->base.yInverted = -1; - c->base.sRGBCapable = 0; + + /* WGL_ARB_framebuffer_sRGB */ + c->base.sRGBCapable = ATTR_VALUE(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, 0); n++; diff --git a/hw/xwin/glx/indirect.h b/hw/xwin/glx/indirect.h index 163375556..a63477bfd 100644 --- a/hw/xwin/glx/indirect.h +++ b/hw/xwin/glx/indirect.h @@ -71,6 +71,7 @@ struct __GLXWinScreen { Bool has_WGL_ARB_pixel_format; Bool has_WGL_ARB_pbuffer; Bool has_WGL_ARB_render_texture; + Bool has_WGL_ARB_framebuffer_sRGB; /* wrapped screen functions */ RealizeWindowProcPtr RealizeWindow; diff --git a/hw/xwin/man/XWin.man b/hw/xwin/man/XWin.man index 6b6fbe7e3..2695d9aa8 100644 --- a/hw/xwin/man/XWin.man +++ b/hw/xwin/man/XWin.man @@ -1,3 +1,4 @@ + .TH XWIN 1 __vendorversion__ .SH NAME XWin \- X Server for the Cygwin environment on Microsoft Windows @@ -108,6 +109,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\fB +Override the window icon for the screen window from the default. +The \fIicon-specifier\fB is as defined in XWinrc(__filemansuffix__). +.TP 8 .B \-nodecoration Do not give the Cygwin/X window a \fIWindows\fP window border, title bar, etc. @@ -212,6 +217,7 @@ The default is enabled. .TP 8 .B \-swcursor Disable the usage of the \fIWindows\fP cursor and use the X11 software cursor instead. +This option is ignored if \fB-compositewm\fP is also enabled. .TP 8 .B \-[no]trayicon Do not create a tray icon. Default is to create one diff --git a/hw/xwin/man/XWinrc.man b/hw/xwin/man/XWinrc.man index 60b8ce1ec..29edc55be 100644 --- a/hw/xwin/man/XWinrc.man +++ b/hw/xwin/man/XWinrc.man @@ -163,31 +163,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 87d714a68..c2e9ceb9a 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 7c29037ce..774c3ae63 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 e6e587f9f..ac663b9f4 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 */ @@ -184,18 +178,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/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c index 7ff598743..0f65bd93a 100644 --- a/hw/xwin/winmultiwindowwindow.c +++ b/hw/xwin/winmultiwindowwindow.c @@ -282,6 +282,8 @@ winAdjustWindowsWindow(WindowPtr pWin, HWND hWnd) MoveWindow(hWnd, iX - parentOrigin.x, iY - parentOrigin.y, iWidth, iHeight, TRUE); + + return; } /* Get the Windows window style and extended style */ diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c index 66b37aefd..c58de0ef3 100644 --- a/hw/xwin/winmultiwindowwndproc.c +++ b/hw/xwin/winmultiwindowwndproc.c @@ -1173,10 +1173,29 @@ winTopLevelWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK winChildWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { + WindowPtr pWin = NULL; + #if CYGDEBUG winDebugWin32Message("winChildWindowProc", hwnd, message, wParam, lParam); #endif + /* + If this is WM_CREATE, set up the Windows window properties which point to + X window information + */ + if (message == WM_CREATE) { + SetProp(hwnd, + WIN_WINDOW_PROP, + (HANDLE) ((LPCREATESTRUCT) lParam)->lpCreateParams); + SetProp(hwnd, + WIN_WID_PROP, + (HANDLE) (INT_PTR)winGetWindowID(((LPCREATESTRUCT) lParam)-> + lpCreateParams)); + } + + /* Retrieve the Windows window property for our X window pointer */ + pWin = GetProp(hwnd, WIN_WINDOW_PROP); + switch (message) { case WM_ERASEBKGND: return TRUE; @@ -1197,6 +1216,10 @@ winChildWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) return 0; } /* XXX: this is exactly what DefWindowProc does? */ + + case WM_ASYNCMOVE: + winAdjustWindowsWindow(pWin, hwnd); + break; } return DefWindowProc(hwnd, message, wParam, lParam); diff --git a/hw/xwin/winprefs.c b/hw/xwin/winprefs.c index ed1154b90..5e4c6ae22 100644 --- a/hw/xwin/winprefs.c +++ b/hw/xwin/winprefs.c @@ -39,6 +39,7 @@ #include <sys/resource.h> #include <sys/wait.h> #include <pthread.h> +#include <sys/cygwin.h> #endif #include "win.h" @@ -61,9 +62,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 */ @@ -585,7 +583,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); @@ -607,9 +605,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 */ @@ -624,17 +625,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]) @@ -650,31 +652,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; } @@ -696,7 +734,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 36f3f4152..d1fef2ed9 100644 --- a/hw/xwin/winprefs.h +++ b/hw/xwin/winprefs.h @@ -173,4 +173,8 @@ 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 0f3a89610..3e03c16f4 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" #ifdef XWIN_CLIPBOARD #include "winclipboard/winclipboard.h" @@ -148,6 +149,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; @@ -347,7 +355,7 @@ ddxProcessArgument(int argc, char *argv[], int i) ("ddxProcessArgument - screen - Invalid monitor number %d\n", iMonitor); UseMsg(); - exit(0); + exit(1); return 0; } } @@ -396,7 +404,7 @@ ddxProcessArgument(int argc, char *argv[], int i) ("ddxProcessArgument - screen - Invalid monitor number %d\n", iMonitor); UseMsg(); - exit(0); + exit(1); return 0; } @@ -427,7 +435,7 @@ ddxProcessArgument(int argc, char *argv[], int i) ("ddxProcessArgument - screen - Invalid monitor number %d\n", iMonitor); UseMsg(); - exit(0); + exit(1); return 0; } @@ -1104,6 +1112,30 @@ 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); + return 0; + } + + /* Indicate that we have processed the argument */ + return 2; + } + return 0; } diff --git a/hw/xwin/winvalargs.c b/hw/xwin/winvalargs.c index c3359f45a..7e896ba9f 100644 --- a/hw/xwin/winvalargs.c +++ b/hw/xwin/winvalargs.c @@ -175,6 +175,16 @@ winValidateArgs(void) "-scrollbars, -resize, -nodecoration, or -lesspointer.\n"); return FALSE; } + +#ifdef XWIN_MULTIWINDOW + /* Ignore -swcursor if -multiwindow -compositewm is requested */ + if (g_ScreenInfo[i].fMultiWindow && g_ScreenInfo[i].fCompositeWM) { + if (g_fSoftwareCursor) { + g_fSoftwareCursor = FALSE; + winMsg(X_WARNING, "Ignoring -swcursor due to -compositewm\n"); + } + } +#endif } winDebug("winValidateArgs - Returning.\n"); |