Cygwin/X: Make winOverrrideStyle() thread-safe

Make winOverrrideStyle() thread-safe

winOverrideStyle() is called from the internal WM client thread.

Accessing server-internal data structures to get window name and
class is not safe, as there is no lock to ensure we do not collide
with these data structures being updated in the server thread.

Rewrite so the internal client thread uses X client calls to
obtain this data safely

Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
Tested-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
Jon TURNEY 2010-03-23 20:06:33 +00:00
parent 0c603509eb
commit ce6136f8c5
3 changed files with 24 additions and 26 deletions

View File

@ -1576,7 +1576,6 @@ winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
Atom type, *pAtom = NULL;
int format;
unsigned long hint = 0, maxmin = 0, style, nitems = 0 , left = 0;
WindowPtr pWin = GetProp (hWnd, WIN_WINDOW_PROP);
MwmHints *mwm_hint = NULL;
if (!hWnd) return;
@ -1669,7 +1668,26 @@ winApplyHints (Display *pDisplay, Window iWindow, HWND hWnd, HWND *zstyle)
}
/* Override hint settings from above with settings from config file */
style = winOverrideStyle((unsigned long)pWin);
{
XClassHint class_hint = {0,0};
char *window_name = 0;
if (XGetClassHint(pDisplay, iWindow, &class_hint))
{
XFetchName(pDisplay, iWindow, &window_name);
style = winOverrideStyle(class_hint.res_name, class_hint.res_class, window_name);
if (class_hint.res_name) XFree(class_hint.res_name);
if (class_hint.res_class) XFree(class_hint.res_class);
if (window_name) XFree(window_name);
}
else
{
style = STYLE_NONE;
}
}
if (style & STYLE_TOPMOST) *zstyle = HWND_TOPMOST;
else if (style & STYLE_MAXIMIZE) maxmin = (hint & ~HINT_MIN) | HINT_MAX;
else if (style & STYLE_MINIMIZE) maxmin = (hint & ~HINT_MAX) | HINT_MIN;

View File

@ -813,40 +813,20 @@ LoadPreferences (void)
* STYLES{} section in the prefs file, and return the style type
*/
unsigned long
winOverrideStyle (unsigned long longpWin)
winOverrideStyle (char *res_name, char *res_class, char *wmName)
{
WindowPtr pWin = (WindowPtr) longpWin;
char *res_name, *res_class;
int i;
char *wmName;
if (pWin==NULL)
return STYLE_NONE;
/* If we can't find the class, we can't override from default! */
if (!winMultiWindowGetClassHint (pWin, &res_name, &res_class))
return STYLE_NONE;
winMultiWindowGetWMName (pWin, &wmName);
for (i=0; i<pref.styleItems; i++) {
if (!strcmp(pref.style[i].match, res_name) ||
!strcmp(pref.style[i].match, res_class) ||
if ((res_name && !strcmp(pref.style[i].match, res_name)) ||
(res_class && !strcmp(pref.style[i].match, res_class)) ||
(wmName && strstr(wmName, pref.style[i].match)))
{
free (res_name);
free (res_class);
free(wmName);
if (pref.style[i].type)
return pref.style[i].type;
}
}
/* Didn't find the style, fail gracefully */
free (res_name);
free (res_class);
free(wmName);
return STYLE_NONE;
}

View File

@ -180,7 +180,7 @@ HICON
winOverrideIcon (unsigned long longpWin);
unsigned long
winOverrideStyle (unsigned long longpWin);
winOverrideStyle (char *res_name, char *res_class, char *wmName);
HICON
winTaskbarIcon(void);