From: Daniel Caujolle-B. <f1...@us...> - 2001-12-21 04:33:31
|
Update of /cvsroot/xine/xine-ui/src/xitk/xine-toolkit In directory usw-pr-cvs1:/tmp/cvs-serv2767/src/xitk/xine-toolkit Modified Files: Makefile.am filebrowser.c mrlbrowser.c tips.c widget.h window.c window.h xitk.c xitk.h Log Message: Fixed deadlocks, focus behavior (one more time), stealth window (wm side). Index: Makefile.am =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/Makefile.am,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- Makefile.am 2001/12/17 02:03:52 1.21 +++ Makefile.am 2001/12/21 04:33:28 1.22 @@ -30,6 +30,9 @@ debug: @$(MAKE) CFLAGS="$(DEBUG_CFLAGS)" +debug-test: + @$(MAKE) CFLAGS="$(DEBUG_CFLAGS)" test + install-debug: debug @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am Index: filebrowser.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/filebrowser.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- filebrowser.c 2001/12/17 02:03:52 1.25 +++ filebrowser.c 2001/12/21 04:33:28 1.26 @@ -1033,7 +1033,7 @@ Imlib_get_colormap(fb->imlibdata), "black", &black, &dummy); - attr.override_redirect = True; + attr.override_redirect = False; attr.background_pixel = black.pixel; /* * XXX:multivis @@ -1059,8 +1059,7 @@ None, NULL, 0, &hint); XSelectInput(fb->imlibdata->x.disp, private_data->window, - EnterWindowMask | LeaveWindowMask | FocusChangeMask | - ButtonPressMask | ButtonReleaseMask | PointerMotionMask + ButtonPressMask | ButtonReleaseMask | KeymapStateMask | PointerMotionMask | KeyPressMask | ExposureMask | StructureNotifyMask); /* Index: mrlbrowser.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/mrlbrowser.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- mrlbrowser.c 2001/12/17 02:03:52 1.22 +++ mrlbrowser.c 2001/12/21 04:33:28 1.23 @@ -784,7 +784,7 @@ Imlib_get_colormap(mb->imlibdata), "black", &black, &dummy); - attr.override_redirect = True; + attr.override_redirect = False; attr.background_pixel = black.pixel; /* * XXX:multivis @@ -811,8 +811,7 @@ None, NULL, 0, &hint); XSelectInput(mb->imlibdata->x.disp, private_data->window, - EnterWindowMask | LeaveWindowMask | FocusChangeMask | - ButtonPressMask | ButtonReleaseMask | PointerMotionMask + ButtonPressMask | ButtonReleaseMask | KeymapStateMask | PointerMotionMask | KeyPressMask | ExposureMask | StructureNotifyMask); /* Index: tips.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/tips.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- tips.c 2001/12/18 08:52:19 1.5 +++ tips.c 2001/12/21 04:33:28 1.6 @@ -60,8 +60,6 @@ pthread_detach(pthread_self()); - pthread_mutex_init(&tp->mutex, NULL); - /* Waiting enought time to read the tips */ xitk_usec_sleep(1500000); @@ -69,6 +67,7 @@ /* Kill tips window */ xitk_window_destroy_window(tp->w->imlibdata, tp->xwin); + xitk_unregister_event_handler(&tp->key); /* We are flushing here, otherwise tips window will stay displayed */ XLOCK(tp->w->imlibdata->x.disp); @@ -103,18 +102,11 @@ xitk_usec_sleep((tp->w->tips_timeout * 1000)); /* Get parent window position */ - XLOCK(tp->w->imlibdata->x.disp); - status = XGetWindowAttributes(tp->w->imlibdata->x.disp, tp->wl->win, &wattr); - XUNLOCK(tp->w->imlibdata->x.disp); + xitk_get_window_position(tp->w->imlibdata->x.disp, tp->wl->win, &x, &y, NULL, NULL); - x = tp->w->x; - y = (tp->w->y + tp->w->height); + x += tp->w->x; + y += (tp->w->y + tp->w->height); - if((status != BadDrawable) && (status != BadWindow)) { - x += wattr.x; - y += wattr.y; - } - fs = xitk_font_load_font(tp->w->imlibdata->x.disp, DEFAULT_FONT_10); xitk_font_set_font(fs, tp->wl->gc); string_length = xitk_font_get_string_length(fs, tp->w->tips_string); @@ -123,14 +115,26 @@ cblack = xitk_get_pixel_color_black(tp->w->imlibdata); cyellow = xitk_get_pixel_color_from_rgb(tp->w->imlibdata, 255, 255, 0); - i = xitk_image_create_image_with_colors_from_string(tp->w->imlibdata, DEFAULT_FONT_10, - string_length + 1, ALIGN_LEFT, - tp->w->tips_string, cblack, cyellow); + i = xitk_image_create_image_with_colors_from_string(tp->w->imlibdata, DEFAULT_FONT_10, + string_length + 1, ALIGN_LEFT, + tp->w->tips_string, cblack, cyellow); tp->xwin = xitk_window_create_simple_window(tp->w->imlibdata, x, y, i->width + 10, i->height + 10); + + /* WM should ignore tips windows */ + { + XSetWindowAttributes tp_attr; + + tp_attr.override_redirect = True; + + XLOCK(tp->w->imlibdata->x.disp); + XChangeWindowAttributes(tp->w->imlibdata->x.disp, + (xitk_window_get_window(tp->xwin)), CWOverrideRedirect, &tp_attr); + XUNLOCK(tp->w->imlibdata->x.disp); + + } - /* Draw the text area */ { Pixmap bg; int width, height; @@ -166,13 +170,17 @@ } XLOCK(tp->w->imlibdata->x.disp); + + status = XGetWindowAttributes(tp->w->imlibdata->x.disp, tp->wl->win, &wattr); + XMapRaised(tp->w->imlibdata->x.disp, (xitk_window_get_window(tp->xwin))); - if(wattr.map_state == IsViewable) - XSetInputFocus(tp->w->imlibdata->x.disp, tp->wl->win, RevertToNone, CurrentTime); + if((status != BadDrawable) && (status != BadWindow) && (wattr.map_state == IsViewable)) + XSetInputFocus(tp->w->imlibdata->x.disp, tp->wl->win, RevertToParent, CurrentTime); XUNLOCK(tp->w->imlibdata->x.disp); + /* TODO: forward key event to parent window */ tp->key = xitk_register_event_handler("xitk tips", (xitk_window_get_window(tp->xwin)), NULL, @@ -191,6 +199,8 @@ pth_params.sched_priority = sched_get_priority_min(SCHED_OTHER); pthread_attr_setschedparam(&pth_attrs, &pth_params); + pthread_mutex_init(&tp->mutex, NULL); + pthread_create(&tp->thread, &pth_attrs, xitk_tips_destroy_thread, (void *)tp); } @@ -209,6 +219,7 @@ return; /* If there a current tips displayed, hide it */ + if(disptips != NULL) { pthread_mutex_lock(&disptips->mutex); @@ -216,8 +227,8 @@ pthread_cancel(disptips->thread); xitk_window_destroy_window(disptips->w->imlibdata, disptips->xwin); + xitk_unregister_event_handler(&disptips->key); - /* We are flushing here, otherwise tips window will stay displayed */ XLOCK(disptips->w->imlibdata->x.disp); XFlush(disptips->w->imlibdata->x.disp); XUNLOCK(disptips->w->imlibdata->x.disp); @@ -228,13 +239,12 @@ XITK_FREE(disptips); disptips = NULL; } - + if((w->tips_string != NULL) && w->tips_timeout) { tp = (tips_private_t *) xitk_xmalloc(sizeof(tips_private_t)); tp->w = w; tp->wl = wl; - pthread_attr_init(&pth_attrs); pthread_attr_getschedparam(&pth_attrs, &pth_params); @@ -243,8 +253,7 @@ pthread_create(&w->tips_thread, &pth_attrs, xitk_tips_thread, (void *)tp); } - // else - // w->tips_thread = 0; + } /* Index: widget.h =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/widget.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- widget.h 2001/12/17 02:03:52 1.17 +++ widget.h 2001/12/21 04:33:28 1.18 @@ -390,10 +390,37 @@ * small utility function to debug xlock races */ -/* #define DEBUG_XLOCK */ +/* #define DEBUG_XLOCK */ #ifdef DEBUG_XLOCK +#if 1 + +static int displ; #define XLOCK(DISP) { \ + int i; \ + displ++; \ + for(i = 0; i < displ; i++) printf("%d",i); \ + printf(">%s: %s(%d) XLock\n", \ + __FILE__, __FUNCTION__, __LINE__); \ + fflush(stdout); \ + XLockDisplay(DISP); \ + printf(" %s: %s(%d) got the lock\n", \ + __FILE__, __FUNCTION__, __LINE__); \ + } + +#define XUNLOCK(DISP) { \ + int i; \ + for(i = 0; i < displ; i++) printf("%d",i); \ + displ--; \ + printf("<%s: %s(%d) XUnlockDisplay\n", \ + __FILE__, __FUNCTION__, __LINE__); \ + fflush(stdout); \ + XUnlockDisplay(DISP); \ + } + +#else + +#define XLOCK(DISP) { \ printf("%s: %s(%d) XLockDisplay (%d)\n", \ __FILE__, __FUNCTION__, __LINE__, DISP); \ fflush(stdout); \ @@ -408,6 +435,8 @@ fflush(stdout); \ XUnlockDisplay(DISP); \ } + +#endif #else Index: window.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/window.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- window.c 2001/12/17 02:03:52 1.8 +++ window.c 2001/12/21 04:33:28 1.9 @@ -71,6 +71,79 @@ #define TITLE_BAR_HEIGHT 20 /* + * Set/Change window title. + */ +void xitk_set_window_title(Display *display, Window window, char *title) { + + if((display == NULL) || (window == None) || (title == NULL)) + return; + + XLOCK(display); + XmbSetWMProperties(display, window, title, title, NULL, 0, NULL, NULL, NULL); + XUNLOCK(display); +} + +/* + * Set/Change window title. + */ +void xitk_window_set_window_title(ImlibData *im, xitk_window_t *w, char *title) { + + if((im == NULL) || (w == NULL) || (title == NULL)) + return; + + xitk_set_window_title(im->x.disp, w->window, title); +} + +/* + * Get (safely) window pos. + */ +void xitk_get_window_position(Display *display, Window window, + int *x, int *y, int *width, int *height) { + XWindowAttributes wattr; + Window wdummy; + int xx = 0, yy = 0; + + if((display == NULL) || (window == None)) + return; + + XLOCK(display); + if(!XGetWindowAttributes(display, window, &wattr)) { + XITK_WARNING("XGetWindowAttributes() failed.n"); + wattr.width = wattr.height = 0; + goto __failure; + } + + (void) XTranslateCoordinates (display, window, wattr.root, + -wattr.border_width, -wattr.border_width, + &xx, &yy, &wdummy); + + __failure: + + XUNLOCK(display); + + if(x) + *x = xx; + if(y) + *y = yy; + if(width) + *width = wattr.width; + if(height) + *height = wattr.height; +} + +/* + * Get (safely) window pos. + */ +void xitk_window_get_window_position(ImlibData *im, xitk_window_t *w, + int *x, int *y, int *width, int *height) { + + if((im == NULL) || (w == NULL)) + return; + + xitk_get_window_position(im->x.disp, w->window, x, y, width, height); +} + +/* * Center a window in root window. */ void xitk_window_move_window(ImlibData *im, xitk_window_t *w, int x, int y) { @@ -81,6 +154,7 @@ XLOCK(im->x.disp); XMoveResizeWindow (im->x.disp, w->window, x, y, w->width, w->height); XUNLOCK(im->x.disp); + } /* @@ -125,35 +199,42 @@ if((im == NULL) || (width == 0 || height == 0)) return NULL; - xwin = (xitk_window_t *) xitk_xmalloc(sizeof(xitk_window_t)); + xwin = (xitk_window_t *) xitk_xmalloc(sizeof(xitk_window_t)); xwin->background = None; - xwin->width = width; - xwin->height = height; + xwin->width = width; + xwin->height = height; XLOCK(im->x.disp); - hint.x = x; - hint.y = y; - hint.width = width; - hint.height = height; - hint.flags = PPosition | PSize; + memset(&hint, 0, sizeof(hint)); + hint.x = x; + hint.y = y; + hint.width = width; + hint.base_width = width; + hint.min_width = width; + hint.height = height; + hint.base_height = height; + hint.min_height = width; + hint.win_gravity = NorthWestGravity; + hint.flags = PWinGravity | PBaseSize | PMinSize | USSize | USPosition; XAllocNamedColor(im->x.disp, Imlib_get_colormap(im), "black", &black, &dummy); - attr.override_redirect = True; + attr.override_redirect = False; attr.background_pixel = black.pixel; attr.border_pixel = black.pixel; attr.colormap = Imlib_get_colormap(im); + attr.win_gravity = NorthWestGravity; xwin->window = XCreateWindow(im->x.disp, im->x.root, hint.x, hint.y, hint.width, hint.height, - 0, im->x.depth, CopyFromParent, im->x.visual, - CWBackPixel | CWBorderPixel | CWColormap | CWOverrideRedirect, + 0, im->x.depth, InputOutput, im->x.visual, + CWBackPixel | CWBorderPixel | CWColormap + | CWOverrideRedirect | CWWinGravity , &attr); XSetStandardProperties(im->x.disp, xwin->window, title, title, None, NULL, 0, &hint); XSelectInput(im->x.disp, xwin->window, - EnterWindowMask | LeaveWindowMask | FocusChangeMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask | KeymapStateMask | ExposureMask | StructureNotifyMask); @@ -176,8 +257,9 @@ xclasshint->res_name = "Xine Window"; xclasshint->res_class = "Xitk"; XSetClassHint(im->x.disp, xwin->window, xclasshint); + XFree(xclasshint); } - + wm_hint = XAllocWMHints(); if (wm_hint != NULL) { wm_hint->input = True; @@ -187,9 +269,6 @@ XFree(wm_hint); } - - // XSetInputFocus(im->x.disp, PointerRoot, RevertToNone, CurrentTime); - XUNLOCK(im->x.disp); return xwin; @@ -245,6 +324,8 @@ xwin = xitk_window_create_simple_window(im, x, y, width, height); + xitk_window_set_window_title(im, xwin, title); + bar = xitk_image_create_pixmap(im, width, TITLE_BAR_HEIGHT); pix_bg = xitk_image_create_pixmap(im, width, height); @@ -395,12 +476,6 @@ switch(event->type) { - case Expose: - XLOCK(wd->imlibdata->x.disp); - XSetInputFocus(wd->imlibdata->x.disp, wd->xwin->window, RevertToParent, CurrentTime); - XLOCK(wd->imlibdata->x.disp); - break; - case MappingNotify: XLOCK(wd->imlibdata->x.disp); XRefreshKeyboardMapping((XMappingEvent *) event); @@ -443,7 +518,7 @@ XLOCK(im->x.disp); XUnmapWindow(im->x.disp, w->window); - if(w->background != None) + if(w->background != None) XFreePixmap(im->x.disp, w->background); w->width = -1; w->height = -1; Index: window.h =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/window.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- window.h 2001/11/15 22:42:40 1.2 +++ window.h 2001/12/21 04:33:28 1.3 @@ -35,6 +35,19 @@ #define XITK_WINDOW_ANSWER_CANCEL 4 /* + * Set/Change window title. + */ +void xitk_set_window_title(Display *display, Window window, char *title); +void xitk_window_set_window_title(ImlibData *im, xitk_window_t *w, char *title); + +/* + * Get (safely) window pos. + */ +void xitk_get_window_position(Display *display, Window window, + int *x, int *y, int *width, int *height); +void xitk_window_get_window_position(ImlibData *im, xitk_window_t *w, + int *x, int *y, int *width, int *height); +/* * Move window to xy coords. */ void xitk_window_move_window(ImlibData *im, xitk_window_t *w, int x, int y); Index: xitk.c =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/xitk.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- xitk.c 2001/12/17 02:03:52 1.26 +++ xitk.c 2001/12/21 04:33:28 1.27 @@ -443,20 +443,6 @@ switch(event->type) { - case EnterNotify: - XLOCK(gXitk->display); - XSetInputFocus(gXitk->display, fx->window, RevertToParent, CurrentTime); - XUNLOCK(gXitk->display); - break; - - case LeaveNotify: - /* - XLOCK(gXitk->display); - XSetInputFocus(gXitk->display, PointerRoot, RevertToNone, CurrentTime); - XUNLOCK(gXitk->display); - */ - break; - case Expose: if (fx->widget_list && (event->xexpose.count == 0)) { xitk_paint_widget_list (fx->widget_list); @@ -517,8 +503,27 @@ } break; - case ButtonPress: + case ButtonPress: { + XWindowAttributes wattr; + Status status; + Window focused_window; + int revert; + XLOCK(gXitk->display); + status = XGetWindowAttributes(gXitk->display, fx->window, &wattr); + XGetInputFocus(gXitk->display, &focused_window, &revert); + + /* + * Give focus(and raise) to a window after a click, and + * only if window isn't the current focused one. + */ + if((status != BadDrawable) && (status != BadWindow) + && (wattr.map_state == IsViewable) && (focused_window != fx->window)) { + XRaiseWindow(gXitk->display, fx->window); + XSetInputFocus(gXitk->display, fx->window, RevertToParent, CurrentTime); + } + XUNLOCK(gXitk->display); + if(fx->widget_list) { fx->move.enabled = !xitk_click_notify_widget_list (fx->widget_list, @@ -544,7 +549,8 @@ } } - break; + } + break; case ButtonRelease: Index: xitk.h =================================================================== RCS file: /cvsroot/xine/xine-ui/src/xitk/xine-toolkit/xitk.h,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- xitk.h 2001/12/17 02:03:52 1.39 +++ xitk.h 2001/12/21 04:33:28 1.40 @@ -1657,6 +1657,28 @@ */ void xitk_window_get_window_size(xitk_window_t *w, int *width, int *height); +/* + * + */ +void xitk_get_window_position(Display *display, Window window, + int *x, int *y, int *width, int *height); + +/* + * + */ +void xitk_window_get_window_position(ImlibData *im, xitk_window_t *w, + int *x, int *y, int *width, int *height); + +/* + * + */ +void xitk_set_window_title(Display *display, Window window, char *title); + +/* + * + */ +void xitk_window_set_window_title(ImlibData *im, xitk_window_t *w, char *title); + #define ALIGN_LEFT 1 #define ALIGN_CENTER 2 #define ALIGN_RIGHT 3 |