Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
6c9e7948
Commit
6c9e7948
authored
Nov 30, 2023
by
Rémi Bernon
Committed by
Alexandre Julliard
Apr 05, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winex11: Keep the client window colormap on the GL drawable.
Making sure it is kept alive as long as the client window lives.
parent
ffc02008
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
14 additions
and
13 deletions
+14
-13
opengl.c
dlls/winex11.drv/opengl.c
+10
-2
vulkan.c
dlls/winex11.drv/vulkan.c
+1
-1
window.c
dlls/winex11.drv/window.c
+2
-8
x11drv.h
dlls/winex11.drv/x11drv.h
+1
-2
No files found.
dlls/winex11.drv/opengl.c
View file @
6c9e7948
...
...
@@ -223,6 +223,7 @@ struct gl_drawable
enum
dc_gl_type
type
;
/* type of GL surface */
GLXDrawable
drawable
;
/* drawable for rendering with GL */
Window
window
;
/* window if drawable is a GLXWindow */
Colormap
colormap
;
/* colormap for the client window */
Pixmap
pixmap
;
/* base pixmap if drawable is a GLXPixmap */
const
struct
wgl_pixel_format
*
format
;
/* pixel format for the drawable */
SIZE
pixmap_size
;
/* pixmap size for GLXPixmap drawables */
...
...
@@ -1158,6 +1159,7 @@ static void release_gl_drawable( struct gl_drawable *gl )
TRACE
(
"destroying %lx drawable %lx
\n
"
,
gl
->
window
,
gl
->
drawable
);
pglXDestroyWindow
(
gdi_display
,
gl
->
drawable
);
XDestroyWindow
(
gdi_display
,
gl
->
window
);
XFreeColormap
(
gdi_display
,
gl
->
colormap
);
break
;
case
DC_GL_PIXMAP_WIN
:
TRACE
(
"destroying pixmap %lx drawable %lx
\n
"
,
gl
->
pixmap
,
gl
->
drawable
);
...
...
@@ -1332,7 +1334,10 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct wgl_pixel
NtUserGetAncestor
(
hwnd
,
GA_PARENT
)
==
NtUserGetDesktopWindow
())
/* childless top-level window */
{
gl
->
type
=
DC_GL_WINDOW
;
gl
->
window
=
create_client_window
(
hwnd
,
visual
);
gl
->
colormap
=
XCreateColormap
(
gdi_display
,
get_dummy_parent
(),
visual
->
visual
,
(
visual
->
class
==
PseudoColor
||
visual
->
class
==
GrayScale
||
visual
->
class
==
DirectColor
)
?
AllocAll
:
AllocNone
);
gl
->
window
=
create_client_window
(
hwnd
,
visual
,
gl
->
colormap
);
if
(
gl
->
window
)
gl
->
drawable
=
pglXCreateWindow
(
gdi_display
,
gl
->
format
->
fbconfig
,
gl
->
window
,
NULL
);
TRACE
(
"%p created client %lx drawable %lx
\n
"
,
hwnd
,
gl
->
window
,
gl
->
drawable
);
...
...
@@ -1341,7 +1346,10 @@ static struct gl_drawable *create_gl_drawable( HWND hwnd, const struct wgl_pixel
else
if
(
usexcomposite
)
{
gl
->
type
=
DC_GL_CHILD_WIN
;
gl
->
window
=
create_client_window
(
hwnd
,
visual
);
gl
->
colormap
=
XCreateColormap
(
gdi_display
,
get_dummy_parent
(),
visual
->
visual
,
(
visual
->
class
==
PseudoColor
||
visual
->
class
==
GrayScale
||
visual
->
class
==
DirectColor
)
?
AllocAll
:
AllocNone
);
gl
->
window
=
create_client_window
(
hwnd
,
visual
,
gl
->
colormap
);
if
(
gl
->
window
)
{
gl
->
drawable
=
pglXCreateWindow
(
gdi_display
,
gl
->
format
->
fbconfig
,
gl
->
window
,
NULL
);
...
...
dlls/winex11.drv/vulkan.c
View file @
6c9e7948
...
...
@@ -194,7 +194,7 @@ static VkResult X11DRV_vkCreateWin32SurfaceKHR(VkInstance instance,
x11_surface
->
ref
=
1
;
x11_surface
->
hwnd
=
create_info
->
hwnd
;
x11_surface
->
window
=
create_client_window
(
create_info
->
hwnd
,
&
default_visual
);
x11_surface
->
window
=
create_client_window
(
create_info
->
hwnd
,
&
default_visual
,
default_colormap
);
x11_surface
->
hwnd_thread_id
=
NtUserGetWindowThread
(
x11_surface
->
hwnd
,
NULL
);
if
(
!
x11_surface
->
window
)
...
...
dlls/winex11.drv/window.c
View file @
6c9e7948
...
...
@@ -1591,7 +1591,7 @@ Window get_dummy_parent(void)
/**********************************************************************
* create_client_window
*/
Window
create_client_window
(
HWND
hwnd
,
const
XVisualInfo
*
visual
)
Window
create_client_window
(
HWND
hwnd
,
const
XVisualInfo
*
visual
,
Colormap
colormap
)
{
Window
dummy_parent
=
get_dummy_parent
();
struct
x11drv_win_data
*
data
=
get_win_data
(
hwnd
);
...
...
@@ -1616,12 +1616,7 @@ Window create_client_window( HWND hwnd, const XVisualInfo *visual )
TRACE
(
"%p reparent xwin %lx/%lx
\n
"
,
data
->
hwnd
,
data
->
whole_window
,
data
->
client_window
);
}
if
(
data
->
client_colormap
)
XFreeColormap
(
gdi_display
,
data
->
client_colormap
);
data
->
client_colormap
=
XCreateColormap
(
gdi_display
,
dummy_parent
,
visual
->
visual
,
(
visual
->
class
==
PseudoColor
||
visual
->
class
==
GrayScale
||
visual
->
class
==
DirectColor
)
?
AllocAll
:
AllocNone
);
attr
.
colormap
=
data
->
client_colormap
;
attr
.
colormap
=
colormap
;
attr
.
bit_gravity
=
NorthWestGravity
;
attr
.
win_gravity
=
NorthWestGravity
;
attr
.
backing_store
=
NotUseful
;
...
...
@@ -1881,7 +1876,6 @@ void X11DRV_DestroyWindow( HWND hwnd )
if
(
thread_data
->
last_xic_hwnd
==
hwnd
)
thread_data
->
last_xic_hwnd
=
0
;
if
(
data
->
icon_pixmap
)
XFreePixmap
(
gdi_display
,
data
->
icon_pixmap
);
if
(
data
->
icon_mask
)
XFreePixmap
(
gdi_display
,
data
->
icon_mask
);
if
(
data
->
client_colormap
)
XFreeColormap
(
data
->
display
,
data
->
client_colormap
);
free
(
data
->
icon_bits
);
XDeleteContext
(
gdi_display
,
(
XID
)
hwnd
,
win_data_context
);
release_win_data
(
data
);
...
...
dlls/winex11.drv/x11drv.h
View file @
6c9e7948
...
...
@@ -604,7 +604,6 @@ struct x11drv_win_data
Display
*
display
;
/* display connection for the thread owning the window */
XVisualInfo
vis
;
/* X visual used by this window */
Colormap
whole_colormap
;
/* colormap if non-default visual */
Colormap
client_colormap
;
/* colormap for the client window */
HWND
hwnd
;
/* hwnd that this private data belongs to */
Window
whole_window
;
/* X window for the complete window */
Window
client_window
;
/* X window for the client area */
...
...
@@ -650,7 +649,7 @@ extern void update_user_time( Time time );
extern
void
read_net_wm_states
(
Display
*
display
,
struct
x11drv_win_data
*
data
);
extern
void
update_net_wm_states
(
struct
x11drv_win_data
*
data
);
extern
void
make_window_embedded
(
struct
x11drv_win_data
*
data
);
extern
Window
create_client_window
(
HWND
hwnd
,
const
XVisualInfo
*
visual
);
extern
Window
create_client_window
(
HWND
hwnd
,
const
XVisualInfo
*
visual
,
Colormap
colormap
);
extern
void
set_window_visual
(
struct
x11drv_win_data
*
data
,
const
XVisualInfo
*
vis
,
BOOL
use_alpha
);
extern
void
change_systray_owner
(
Display
*
display
,
Window
systray_window
);
extern
HWND
create_foreign_window
(
Display
*
display
,
Window
window
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment