Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 14667 Details for
Bug 24751
Xinerama patch for WindowMaker
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
WindowMaker Xinerama patch
WindowMaker-Patch (text/plain), 26.04 KB, created by
Sam Cole
on 2003-07-18 10:48:26 UTC
(
hide
)
Description:
WindowMaker Xinerama patch
Filename:
MIME Type:
Creator:
Sam Cole
Created:
2003-07-18 10:48:26 UTC
Size:
26.04 KB
patch
obsolete
>Only in .: Makefile >Only in ./WINGs/Documentation: Makefile >Only in ./WINGs/Examples: Makefile >Only in ./WINGs/Extras: Makefile >Only in ./WINGs: Makefile >Only in ./WINGs/Resources: Makefile >Only in ./WINGs/Tests: Makefile >Only in ./WINGs/WINGs: Makefile >Only in ./WINGs: get-wings-flags >Only in ./WINGs: get-wutil-flags >Only in ./WINGs/po: Makefile >Only in ./WPrefs.app: Makefile >Only in ./WPrefs.app/po: Makefile >Only in ./WPrefs.app/po: Makefile.orig >Only in ./WPrefs.app/tiff: Makefile >Only in ./WPrefs.app/xpm: Makefile >Only in ./WindowMaker/Backgrounds: Makefile >Only in ./WindowMaker/Defaults: Makefile >Only in ./WindowMaker/Defaults: WMRootMenu >Only in ./WindowMaker/IconSets: Makefile >Only in ./WindowMaker/Icons: Makefile >Only in ./WindowMaker: Makefile >Only in ./WindowMaker/Pixmaps: Makefile >Only in ./WindowMaker/Styles: Makefile >Only in ./WindowMaker/Themes: Makefile >Only in .: config.log >Only in .: config.status >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/configure ./configure >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/configure Tue Jul 2 02:37:46 2002 >+++ ./configure Thu Oct 17 16:36:12 2002 >@@ -11747,7 +11747,7 @@ > fi > > >-xinerama=no >+xinerama=yes > #AC_ARG_ENABLE(xinerama, > #[ --disable-xinerama disable XInerama extension support], > # xinerama=$enableval, xinerama=yes) >Only in ./contrib: Makefile >Only in ./contrib: WindowMaker.spec >Only in ./doc: Makefile >Only in ./doc/sk: Makefile >Only in .: libtool >Only in ./po: Makefile >Only in ./po: Makefile.orig >Only in ./src: .GNUstep.h.swp >Only in ./src: .actions.c.swo >Only in ./src: .actions.c.swp >Only in ./src: .xinerama.c.swp >Only in ./src: Makefile >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/actions.c ./src/actions.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/actions.c Tue Jul 2 02:30:25 2002 >+++ ./src/actions.c Sun Oct 20 15:57:17 2002 >@@ -412,10 +412,9 @@ > WArea usableArea = wwin->screen_ptr->totalUsableArea; > WArea totalArea; > >- > if (WFLAGP(wwin, no_resizable)) > return; >- >+ > totalArea.x1 = 0; > totalArea.y1 = 0; > totalArea.x2 = wwin->screen_ptr->scr_width; >@@ -1502,10 +1501,22 @@ > /* > * Find out screen boundaries. > */ >+#ifdef XINERAMA >+ WMRect rect = wGetRectForHead(scr, wGetHeadForPointerLocation(scr)); >+ >+ sx1 = rect.pos.x; >+ sy1 = rect.pos.y; >+ sw = rect.size.width; >+ sh = rect.size.height; >+ sx2 = sx1 + sw; >+ sy2 = sy1 + sh; >+#else > sx1 = 0; > sy1 = 0; >- sx2 = scr->scr_width; >- sy2 = scr->scr_height; >+ sw = sx2 = scr->scr_width; >+ sh = sy2 = scr->scr_height; >+#endif >+ > if (scr->dock) { > if (scr->dock->on_right_side) > sx2 -= isize + DOCK_EXTRA_SPACE; >@@ -1513,8 +1524,8 @@ > sx1 += isize + DOCK_EXTRA_SPACE; > } > >- sw = isize * (scr->scr_width/isize); >- sh = isize * (scr->scr_height/isize); >+ sw = isize * (sw/isize); >+ sh = isize * (sh/isize); > fullW = (sx2-sx1)/isize; > fullH = (sy2-sy1)/isize; > >Only in ./src: actions.c~ >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/client.c ./src/client.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/client.c Tue Jan 8 14:45:07 2002 >+++ ./src/client.c Sun Oct 20 15:31:54 2002 >@@ -46,6 +46,7 @@ > #ifdef KWM_HINTS > #include "kwm.h" > #endif >+#include "xinerama.h" > > /****** Global Variables ******/ > >@@ -770,6 +771,18 @@ > if (wwin->normal_hints->flags & (USPosition|PPosition)) { > *x = wwin->normal_hints->x; > *y = wwin->normal_hints->y; >+#ifdef XINERAMA >+ { >+ WScreen *scr = wwin->screen_ptr; >+ if ( (unsigned)(*x - scr->scr_width/2 + 10) < 20 && >+ (unsigned)(*y - scr->scr_height/2 + 10) < 20) { >+ int head = wGetHeadForPointerLocation(scr); >+ WMRect rect = wGetRectForHead(scr, head); >+ *x = rect.pos.x + (*x * rect.size.width)/scr->scr_width; >+ *y = rect.pos.y + (*y * rect.size.height)/scr->scr_height; >+ } >+ } >+#endif > } > if (wwin->normal_hints->flags & (USSize|PSize)) { > *width = wwin->normal_hints->width; >Only in ./src: client.c~ >Only in ./src: config.h >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/cycling.c ./src/cycling.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/cycling.c Tue Jan 8 14:45:07 2002 >+++ ./src/cycling.c Sun Oct 20 15:17:56 2002 >@@ -37,6 +37,9 @@ > #include "stacking.h" > #include "funcs.h" > >+#include "xinerama.h" >+ >+ > /* Globals */ > extern WPreferences wPreferences; > >@@ -303,8 +306,18 @@ > } > > scr->flags.doing_alt_tab = 0; >- if (openedSwitchMenu) >- OpenSwitchMenu(scr, scr->scr_width/2, scr->scr_height/2, False); >+ if (openedSwitchMenu) { >+ int x, y; >+#ifdef XINERAMA >+ WMRect rect = wGetRectForHead(scr, wGetHeadForPointerLocation(scr)); >+ x = rect.pos.x + rect.size.width/2; >+ y = rect.pos.y + rect.size.height/2; >+#else >+ x = scr->scr_width/2; >+ y = scr->scr_height/2; >+#endif >+ OpenSwitchMenu(scr, x, y, False); >+ } > > if (somethingElse) { > WMHandleEvent(&ev); >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/dialog.c ./src/dialog.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/dialog.c Thu Feb 21 12:28:48 2002 >+++ ./src/dialog.c Sun Oct 20 15:40:00 2002 >@@ -70,12 +70,7 @@ > WMPoint pt; > > #ifdef XINERAMA >- WMRect rect; >- >- rect = wGetRectForHead(scr, wGetHeadForPointerLocation(scr)); >- >- pt.x = rect.pos.x + (rect.size.width - width)/2; >- pt.y = rect.pos.y + (rect.size.height - height)/2; >+ return wGetCenterForHead(scr, wGetHeadForPointerLocation(scr), width, height); > #else > pt.x = (scr->scr_width - width) / 2; > pt.y = (scr->scr_height - height) / 2; >@@ -144,6 +139,7 @@ > WMButton *saveSessionBtn; > Window parent; > WWindow *wwin; >+ WMPoint center; > int result; > > panel = WMCreateAlertPanel(scr->wmscreen, NULL, title, message, >@@ -163,9 +159,9 @@ > > XReparentWindow(dpy, WMWidgetXID(panel->win), parent, 0, 0); > >+ center = getCenter( scr, 400, 180); > wwin = wManageInternalWindow(scr, parent, None, NULL, >- (scr->scr_width - 400)/2, >- (scr->scr_height - 180)/2, 400, 180); >+ center.x, center.y, 400, 180); > wwin->client_leader = WMWidgetXID(panel->win); > > WMMapWidget(panel->win); >Only in ./src: dialog.c~ >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/dockedapp.c ./src/dockedapp.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/dockedapp.c Tue Jan 8 14:45:13 2002 >+++ ./src/dockedapp.c Sun Oct 20 15:17:57 2002 >@@ -39,12 +39,12 @@ > #include "defaults.h" > #include "framewin.h" > >+#include "xinerama.h" > > /**** Global variables ****/ > extern WPreferences wPreferences; > > >- > typedef struct _AppSettingsPanel { > WMWindow *win; > WAppIcon *editedIcon; >@@ -448,6 +448,26 @@ > > XReparentWindow(dpy, WMWidgetXID(panel->win), parent, 0, 0); > >+#ifdef XINERAMA >+ { >+ WMRect rect = wGetRectForHead( scr, wGetHeadForPointerLocation( scr)); >+ >+ y = aicon->y_pos; >+ if ( y < rect.pos.y) >+ y = rect.pos.y; >+ else if ( y + PHEIGHT > rect.pos.y + rect.size.height) >+ y = rect.pos.y + rect.size.height - PHEIGHT - 30; >+ >+ if (aicon->dock && aicon->dock->type == WM_DOCK) { >+ if (aicon->dock->on_right_side) >+ x = rect.pos.x + rect.size.width/2; >+ else >+ x = rect.pos.x + rect.size.width/2 - PWIDTH - 2; >+ } else { >+ x = rect.pos.x + (rect.size.width - PWIDTH)/2; >+ } >+ } >+#else > y = aicon->y_pos; > if (y < 0) > y = 0; >@@ -462,6 +482,7 @@ > } else { > x = (scr->scr_width - PWIDTH)/2; > } >+#endif > panel->wwin = wManageInternalWindow(scr, parent, None, > _("Docked Application Settings"), > x, y, PWIDTH, PHEIGHT); >Only in ./src: dockedapp.c~ >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/moveres.c ./src/moveres.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/moveres.c Tue Jan 8 14:45:13 2002 >+++ ./src/moveres.c Sun Oct 20 15:17:58 2002 >@@ -41,6 +41,8 @@ > #include "workspace.h" > > #include "geomview.h" >+#include "screen.h" >+#include "xinerama.h" > > > #ifdef KWM_HINTS >@@ -172,8 +174,16 @@ > WMUnmapWidget(scr->gview); > } else { > if (wPreferences.move_display == WDIS_CENTER) { >- moveGeometryDisplayCentered(scr, >- scr->scr_width/2, scr->scr_height/2); >+ WMPoint p; >+#ifdef XINERAMA >+ p = wGetCenterForHead(scr, >+ wGetHeadForPointerLocation(scr), >+ 0, 0); >+#else >+ p.x = scr->scr_width/2; >+ p.y = scr->scr_height/2; >+#endif >+ moveGeometryDisplayCentered(scr, p.x, p.y); > } else if (wPreferences.move_display == WDIS_TOPLEFT) { > moveGeometryDisplayCentered(scr, 1, 1); > } else if (wPreferences.move_display == WDIS_FRAME_CENTER) { >@@ -193,8 +203,16 @@ > || wPreferences.move_display == WDIS_NONE) { > return; > } else if (wPreferences.move_display == WDIS_CENTER) { >- moveGeometryDisplayCentered(scr, scr->scr_width / 2, >- scr->scr_height / 2); >+ WMPoint p; >+#ifdef XINERAMA >+ p = wGetCenterForHead(scr, >+ wGetHeadForPointerLocation(scr), >+ 0, 0); >+#else >+ p.x = scr->scr_width/2; >+ p.y = scr->scr_height/2; >+#endif >+ moveGeometryDisplayCentered(scr, p.x, p.y); > } else if (wPreferences.move_display == WDIS_TOPLEFT) { > moveGeometryDisplayCentered(scr, 1, 1); > } else if (wPreferences.move_display == WDIS_FRAME_CENTER) { >@@ -357,8 +375,16 @@ > WMUnmapWidget(scr->gview); > } else { > if (wPreferences.size_display == WDIS_CENTER) { >- moveGeometryDisplayCentered(scr, >- scr->scr_width / 2, scr->scr_height / 2); >+ WMPoint p; >+#ifdef XINERAMA >+ p = wGetCenterForHead(scr, >+ wGetHeadForPointerLocation(scr), >+ 0, 0); >+#else >+ p.x = scr->scr_width/2; >+ p.y = scr->scr_height/2; >+#endif >+ moveGeometryDisplayCentered(scr, p.x, p.y); > } else if (wPreferences.size_display == WDIS_TOPLEFT) { > moveGeometryDisplayCentered(scr, 1, 1); > } else if (wPreferences.size_display == WDIS_FRAME_CENTER) { >@@ -380,8 +406,16 @@ > return; > > if (wPreferences.size_display == WDIS_CENTER) { >- moveGeometryDisplayCentered(scr, scr->scr_width / 2, >- scr->scr_height / 2); >+ WMPoint p; >+#ifdef XINERAMA >+ p = wGetCenterForHead(scr, >+ wGetHeadForPointerLocation(scr), >+ 0, 0); >+#else >+ p.x = scr->scr_width/2; >+ p.y = scr->scr_height/2; >+#endif >+ moveGeometryDisplayCentered(scr, p.x, p.y); > } else if (wPreferences.size_display == WDIS_TOPLEFT) { > moveGeometryDisplayCentered(scr, 1, 1); > } else if (wPreferences.size_display == WDIS_FRAME_CENTER) { >@@ -398,8 +432,10 @@ > { > WWindow *tmpw; > int x, y; >+#if 0 > int scr_width = wwin->screen_ptr->scr_width; > int scr_height = wwin->screen_ptr->scr_height; >+#endif > > if (!array || !WMGetArrayItemCount(array)) { > wWindowMove(wwin, wwin->frame_x + dx, wwin->frame_y + dy); >@@ -412,6 +448,7 @@ > > /* don't let windows become unreachable */ > >+#if 0 > if (x + (int)tmpw->frame->core->width < 20) > x = 20 - (int)tmpw->frame->core->width; > else if (x + 20 > scr_width) >@@ -421,6 +458,11 @@ > y = 20 - (int)tmpw->frame->core->height; > else if (y + 20 > scr_height) > y = scr_height - 20; >+#else >+ wScreenBringInside(wwin->screen_ptr, &x, &y, >+ (int)tmpw->frame->core->width, >+ (int)tmpw->frame->core->height); >+#endif > > wWindowMove(tmpw, x, y); > } >@@ -462,9 +504,11 @@ > drawFrames(WWindow *wwin, WMArray *array, int dx, int dy) > { > WWindow *tmpw; >+ int x, y; >+#if 0 > int scr_width = wwin->screen_ptr->scr_width; > int scr_height = wwin->screen_ptr->scr_height; >- int x, y; >+#endif > > if (!array) { > >@@ -483,7 +527,7 @@ > y = tmpw->frame_y + dy; > > /* don't let windows become unreachable */ >- >+#if 0 > if (x + (int)tmpw->frame->core->width < 20) > x = 20 - (int)tmpw->frame->core->width; > else if (x + 20 > scr_width) >@@ -493,7 +537,11 @@ > y = 20 - (int)tmpw->frame->core->height; > else if (y + 20 > scr_height) > y = scr_height - 20; >- >+#else >+ wScreenBringInside(wwin->screen_ptr, &x, &y, >+ (int)tmpw->frame->core->width, >+ (int)tmpw->frame->core->height); >+#endif > drawTransparentFrame(tmpw, x, y, tmpw->frame->core->width, > tmpw->frame->core->height); > } >@@ -955,10 +1003,19 @@ > if (dx || dy) { > int i; > /* window is the leftmost window: check against screen edge */ >+#ifdef XINERAMA >+ WMRect rect = wGetRectForHead( scr, wGetHeadForPointerLocation( scr)); >+ >+ l_edge = WMAX( scr->totalUsableArea.x1, rect.pos.x); >+ edge_l = l_edge - resist; >+ edge_r = WMIN( scr->totalUsableArea.x2, rect.pos.x + rect.size.width); >+ r_edge = edge_r + resist; >+#else > l_edge = scr->totalUsableArea.x1; > r_edge = scr->totalUsableArea.x2 + resist; > edge_l = scr->totalUsableArea.x1 - resist; > edge_r = scr->totalUsableArea.x2; >+#endif > > /* 1 */ > if ((data->rightIndex >= 0) && (data->rightIndex <= data->count)) { >@@ -1054,10 +1111,17 @@ > } > > /* VeRT */ >+#ifdef XINERAMA >+ t_edge = WMAX( scr->totalUsableArea.y1, rect.pos.y); >+ edge_t = t_edge - resist; >+ edge_b = WMIN( scr->totalUsableArea.y2, rect.pos.y + rect.size.height); >+ b_edge = edge_b + resist; >+#else > t_edge = scr->totalUsableArea.y1; > b_edge = scr->totalUsableArea.y2 + resist; > edge_t = scr->totalUsableArea.y1 - resist; > edge_b = scr->totalUsableArea.y2; >+#endif > > if ((data->bottomIndex >= 0) && (data->bottomIndex <= data->count)) { > WWindow *looprw; >Only in ./src: moveres.c~ >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/placement.c ./src/placement.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/placement.c Tue Jan 8 14:45:13 2002 >+++ ./src/placement.c Sun Oct 20 15:37:11 2002 >@@ -40,6 +40,7 @@ > #include "appicon.h" > #include "dock.h" > >+#include "xinerama.h" > > extern WPreferences wPreferences; > >@@ -144,10 +145,22 @@ > /* > * Find out screen boundaries. > */ >+#ifdef XINERAMA >+ WMRect rect = wGetRectForHead( scr, wGetHeadForPointerLocation( scr)); >+ >+ sx1 = rect.pos.x; >+ sy1 = rect.pos.y; >+ sw = rect.size.width; >+ sh = rect.size.height; >+ sx2 = sx1 + sw; >+ sy2 = sy1 + sh; >+#else > sx1 = 0; > sy1 = 0; >- sx2 = scr->scr_width; >- sy2 = scr->scr_height; >+ sw = sx2 = scr->scr_width; >+ sh = sy2 = scr->scr_height; >+#endif >+ > if (scr->dock) { > if (scr->dock->on_right_side) > sx2 -= isize + DOCK_EXTRA_SPACE; >@@ -155,8 +168,8 @@ > sx1 += isize + DOCK_EXTRA_SPACE; > } > >- sw = isize * (scr->scr_width/isize); >- sh = isize * (scr->scr_height/isize); >+ sw = isize * (sw/isize); >+ sh = isize * (sh/isize); > fullW = (sx2-sx1)/isize; > fullH = (sy2-sy1)/isize; > >@@ -337,7 +350,8 @@ > > static void > smartPlaceWindow(WWindow *wwin, int *x_ret, int *y_ret, >- unsigned int width, unsigned int height) >+ unsigned int width, unsigned int height, >+ WArea usableArea) > { > WScreen *scr = wwin->screen_ptr; > int test_x = 0, test_y = Y_ORIGIN(scr); >@@ -346,7 +360,6 @@ > int min_isect, min_isect_x, min_isect_y; > int sum_isect; > int extra_height; >- WArea usableArea = scr->totalUsableArea; > > if (wwin->frame) > extra_height = wwin->frame->top_width + wwin->frame->bottom_width; >@@ -413,7 +426,8 @@ > > static Bool > autoPlaceWindow(WWindow *wwin, int *x_ret, int *y_ret, >- unsigned int width, unsigned int height, int tryCount) >+ unsigned int width, unsigned int height, int tryCount, >+ WArea usableArea) > { > WScreen *scr = wwin->screen_ptr; > int test_x = 0, test_y = Y_ORIGIN(scr); >@@ -421,7 +435,6 @@ > int swidth, sx; > WWindow *test_window; > int extra_height; >- WArea usableArea = scr->totalUsableArea; > > if (wwin->frame) > extra_height = wwin->frame->top_width + wwin->frame->bottom_width + 2; >@@ -527,10 +540,10 @@ > > static void > cascadeWindow(WScreen *scr, WWindow *wwin, int *x_ret, int *y_ret, >- unsigned int width, unsigned int height, int h) >+ unsigned int width, unsigned int height, int h, >+ WArea usableArea) > { > unsigned int extra_height; >- WArea usableArea = scr->totalUsableArea; > > if (wwin->frame) > extra_height = wwin->frame->top_width + wwin->frame->bottom_width; >@@ -555,6 +568,14 @@ > { > WScreen *scr = wwin->screen_ptr; > int h = WMFontHeight(scr->title_font) + (wPreferences.window_title_clearance + TITLEBAR_EXTEND_SPACE) * 2; >+ WArea usableArea; >+ >+#ifdef XINERAMA >+ int head = wGetHeadForPointerLocation(scr); >+ usableArea = wGetUsableAreaForHead(scr, head); >+#else >+ usableArea = wwin->screen_ptr->totalUsableArea; >+#endif /* XINERAMA */ > > switch (wPreferences.window_placement) { > case WPM_MANUAL: >@@ -562,13 +583,13 @@ > break; > > case WPM_SMART: >- smartPlaceWindow(wwin, x_ret, y_ret, width, height); >+ smartPlaceWindow(wwin, x_ret, y_ret, width, height, usableArea); > break; > > case WPM_AUTO: >- if (autoPlaceWindow(wwin, x_ret, y_ret, width, height, 0)) { >+ if (autoPlaceWindow(wwin, x_ret, y_ret, width, height, 0, usableArea)) { > break; >- } else if (autoPlaceWindow(wwin, x_ret, y_ret, width, height, 1)) { >+ } else if (autoPlaceWindow(wwin, x_ret, y_ret, width, height, 1, usableArea)) { > break; > } > /* there isn't a break here, because if we fail, it should fall >@@ -579,7 +600,7 @@ > if (wPreferences.window_placement == WPM_AUTO) > scr->cascade_index++; > >- cascadeWindow(scr, wwin, x_ret, y_ret, width, height, h); >+ cascadeWindow(scr, wwin, x_ret, y_ret, width, height, h, usableArea); > > if (wPreferences.window_placement == WPM_CASCADE) > scr->cascade_index++; >@@ -588,7 +609,6 @@ > case WPM_RANDOM: > { > int w, h, extra_height; >- WArea usableArea = scr->totalUsableArea; > > if (wwin->frame) > extra_height = wwin->frame->top_width + wwin->frame->bottom_width + 2; >@@ -611,16 +631,16 @@ > *y_ret = 0; > #endif > } >- >- if (*x_ret + width > scr->scr_width) >- *x_ret = scr->scr_width - width; >- if (*x_ret < 0) >- *x_ret = 0; >- >- if (*y_ret + height > scr->scr_height) >- *y_ret = scr->scr_height - height; >- if (*y_ret < 0) >- *y_ret = 0; >+ >+ if (*x_ret + width > usableArea.x2) >+ *x_ret = usableArea.x2 - width; >+ if (*x_ret < usableArea.x1) >+ *x_ret = usableArea.x1; >+ >+ if (*y_ret + height > usableArea.y2) >+ *y_ret = usableArea.y2 - height; >+ if (*y_ret < usableArea.y1) >+ *y_ret = usableArea.y1; > } > > >Only in ./src: placement.c~ >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/screen.c ./src/screen.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/screen.c Thu Feb 21 12:28:48 2002 >+++ ./src/screen.c Sun Oct 20 15:38:08 2002 >@@ -1155,6 +1155,30 @@ > int moved = 0; > int tol_w, tol_h; > >+ int sx1, sy1, sx2, sy2; >+ >+#ifdef XINERAMA >+ WMRect rect; >+ int head; >+ >+ rect.pos.x = *x; >+ rect.pos.y = *y; >+ rect.size.width = width; >+ rect.size.height = height; >+ >+ head = wGetHeadForRect(scr, rect); >+ rect = wGetRectForHead(scr, head); >+ >+ sx1 = rect.pos.x; >+ sy1 = rect.pos.y; >+ sx2 = sx1 + rect.size.width; >+ sy2 = sy1 + rect.size.height; >+#else >+ sx1 = sy1 = 0; >+ sx2 = scr->scr_width; >+ sy2 = scr->scr_height; >+#endif >+ > if (width > 20) > tol_w = width/2; > else >@@ -1165,15 +1189,15 @@ > else > tol_h = 20; > >- if (*x+width < 10) >- *x = -tol_w, moved = 1; >- else if (*x >= scr->scr_width - 10) >- *x = scr->scr_width - tol_w - 1, moved = 1; >- >- if (*y < -height + 10) >- *y = -tol_h, moved = 1; >- else if (*y >= scr->scr_height - 10) >- *y = scr->scr_height - tol_h - 1, moved = 1; >+ if (*x + width < sx1 + 10) >+ *x = sx1 - tol_w, moved = 1; >+ else if (*x >= sx2 - 10) >+ *x = sx2 - tol_w - 1, moved = 1; >+ >+ if (*y < sy1 - height + 10) >+ *y = sy1 - tol_h, moved = 1; >+ else if (*y >= sy2 - 10) >+ *y = sy2 - tol_h - 1, moved = 1; > > return moved; > } >Only in ./src: screen.c~ >Only in ./src: stamp-h >Only in ./src: tags >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/window.c ./src/window.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/window.c Tue Jul 2 02:30:25 2002 >+++ ./src/window.c Sun Oct 20 15:38:56 2002 >@@ -54,6 +54,7 @@ > #include "defaults.h" > #include "workspace.h" > >+#include "xinerama.h" > > #ifdef MWM_HINTS > # include "motif.h" >@@ -1109,6 +1110,30 @@ > y = transientOwner->frame_y + > abs((transientOwner->frame->core->height - height)/3) + offs; > >+#ifdef XINERAMA >+ { >+ WMRect rect; >+ int head; >+ >+ rect.pos.x = transientOwner->frame_x; >+ rect.pos.y = transientOwner->frame_y; >+ rect.size.width = transientOwner->frame->core->width; >+ rect.size.height = transientOwner->frame->core->height; >+ >+ head = wGetHeadForRect(scr, rect); >+ rect = wGetRectForHead(scr, head); >+ >+ if ( x < rect.pos.x) >+ x = rect.pos.x; >+ else if ( x + width > rect.pos.x + rect.size.width) >+ x = rect.pos.x + rect.size.width - width; >+ >+ if ( y < rect.pos.y) >+ y = rect.pos.y; >+ else if ( y + height > rect.pos.y + rect.size.height) >+ y = rect.pos.y + rect.size.height - height; >+ } >+#else > if (x < 0) > x = 0; > else if (x + width > scr->scr_width) >@@ -1118,6 +1143,7 @@ > y = 0; > else if (y + height > scr->scr_height) > y = scr->scr_height - height; >+#endif > } else { > PlaceWindow(wwin, &x, &y, width, height); > } >Only in ./src: window.c~ >Only in ./src: windowmaker.patch >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/xinerama.c ./src/xinerama.c >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/xinerama.c Sat Feb 16 05:53:33 2002 >+++ ./src/xinerama.c Sun Oct 20 15:40:27 2002 >@@ -53,6 +53,7 @@ > * 0 if the rectangles do not intersect, 1 otherwise. > */ > >+#if 0 > typedef struct { > int x1, y1, x2, y2; > } _Rectangle; >@@ -97,18 +98,60 @@ > rect1.x1 = x1; > rect1.y1 = y1; > rect1.x2 = x1+w1; >- rect1.x2 = y1+w1; >+ rect1.y2 = y1+h1; > > rect2.x1 = x2; > rect2.y1 = y2; > rect2.x2 = x2+w2; >- rect2.x2 = y2+w2; >+ rect2.y2 = y2+h2; > > if (intersect_rectangles(&rect1, &rect2, &result)) > return (result.x2-result.x1)*(result.y2-result.y1); > else > return 0; > } >+#else >+/* >+ * This function calculates the length of the intersection of two >+ * line sections. (Hey, is that english?) >+ */ >+static int >+calcIntersectionLength(int p1, int l1, int p2, int l2) >+{ >+ int isect; >+ int tmp; >+ >+ if (p1 > p2) { >+ tmp = p1; >+ p1 = p2; >+ p2 = tmp; >+ tmp = l1; >+ l1 = l2; >+ l2 = tmp; >+ } >+ >+ if (p1 + l1 < p2) >+ isect = 0; >+ else if (p2 + l2 < p1 + l1) >+ isect = l2; >+ else >+ isect = p1 + l1 - p2; >+ >+ return isect; >+} >+ >+ >+/* >+ * This function calculates the area of the intersection of two rectangles. >+ */ >+static int >+intersectArea(int x1, int y1, int w1, int h1, >+ int x2, int y2, int w2, int h2) >+{ >+ return calcIntersectionLength(x1, w1, x2, w2) >+ * calcIntersectionLength(y1, h1, y2, h2); >+} >+#endif > > > /* get the head that covers most of the rectangle */ >@@ -140,6 +183,9 @@ > } > } > >+ if ( best == -1) >+ best = wGetHeadForPointerLocation(scr); >+ > return best; > } > >@@ -162,6 +208,7 @@ > int i; > > for (i = 0; i < scr->xine_count; i++) { >+#if 0 > int yy, xx; > > xx = scr->xine_screens[i].x_org + scr->xine_screens[i].width; >@@ -171,6 +218,13 @@ > point.x < xx && point.y < yy) { > return i; > } >+#else >+ XineramaScreenInfo *xsi = &scr->xine_screens[i]; >+ >+ if ((unsigned)(point.x - xsi->x_org) < xsi->width && >+ (unsigned)(point.y - xsi->y_org) < xsi->height) >+ return i; >+#endif > } > > return scr->xine_primary_head; >@@ -184,7 +238,6 @@ > int ble; > unsigned int blo; > >- > if (!XQueryPointer(dpy, scr->root_win, &bla, &bla, > &point.x, &point.y, > &ble, &ble, >@@ -199,7 +252,14 @@ > { > WMRect rect; > >- if (head < scr->xine_count) { >+ if (scr->xine_count) { >+#if 0 >+ if ( head < 0) >+ head = 0; >+ else if ( head >= scr->xine_count) >+ head %= scr->xine_count; >+#endif >+ > rect.pos.x = scr->xine_screens[head].x_org; > rect.pos.y = scr->xine_screens[head].y_org; > rect.size.width = scr->xine_screens[head].width; >@@ -217,9 +277,11 @@ > } > } > >- >+#if 0 > WMRect wGetUsableRectForHead(WScreen *scr, int head) > { >+ WMRect rect; >+ > if (head < scr->xine_count) { > rect.pos.x = scr->xine_screens[head].x_org; > rect.pos.y = scr->xine_screens[head].y_org; >@@ -237,5 +299,35 @@ > return rect; > } > } >+#endif >+ >+WArea wGetUsableAreaForHead(WScreen *scr, int head) >+{ >+ WArea totalArea, usableArea = scr->totalUsableArea; >+ WMRect rect = wGetRectForHead(scr, head); >+ >+ totalArea.x1 = rect.pos.x; >+ totalArea.y1 = rect.pos.y; >+ totalArea.x2 = totalArea.x1 + rect.size.width; >+ totalArea.y2 = totalArea.y1 + rect.size.height; >+ >+ usableArea.x1 = WMAX(totalArea.x1, usableArea.x1); >+ usableArea.y1 = WMAX(totalArea.y1, usableArea.y1); >+ usableArea.x2 = WMIN(totalArea.x2, usableArea.x2); >+ usableArea.y2 = WMIN(totalArea.y2, usableArea.y2); >+ >+ return usableArea; >+} >+ >+WMPoint wGetCenterForHead(WScreen *scr, int head, int width, int height) >+{ >+ WMPoint p; >+ WMRect rect = wGetRectForHead(scr, head); >+ >+ p.x = rect.pos.x + (rect.size.width - width)/2; >+ p.y = rect.pos.y + (rect.size.height - height)/2; >+ >+ return p; >+} > > #endif >Only in ./src: xinerama.c~ >diff -ru /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/xinerama.h ./src/xinerama.h >--- /var/tmp/portage/WindowMaker-0.80.1-r2/work/WindowMaker-0.80.1/src/xinerama.h Sat Feb 16 05:53:33 2002 >+++ ./src/xinerama.h Sun Oct 20 15:18:00 2002 >@@ -41,6 +41,10 @@ > > WMRect wGetUsableRectForHead(WScreen *scr, int head); > >+WArea wGetUsableAreaForHead(WScreen *scr, int head); >+ >+WMPoint wGetCenterForHead(WScreen *scr, int head, int width, int height); >+ > #endif > > >Only in ./test: Makefile >Only in ./util: Makefile >Only in .: windowmaker-xinerama.patch >Only in .: windowmaker.patch >Only in ./wmlib: Makefile >Only in ./wrlib: Makefile >Only in ./wrlib: get-wraster-flags
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 24751
: 14667