Hello,here are some patches that add further Xinerama support, fix a bug in ttsession so it no longer segfaults if it can't figure out the host name, and make dtksh build on FreeBSD 11 again.
Regards Alex
>From 25de8808952fe112c09502fe9495f6af6a057878 Mon Sep 17 00:00:00 2001 From: alx <a...@fastestcode.org> Date: Fri, 30 Dec 2016 01:21:40 +0100 Subject: [PATCH 1/5] libDtSvc: added Xinerama support to _DtMessageDialog --- cde/lib/DtSvc/DtUtil2/Imakefile | 7 +++- cde/lib/DtSvc/DtUtil2/SharedProcs.c | 73 +++++++++++++++++++++++++++++++------ cde/lib/DtSvc/Imakefile | 11 ++++-- cde/lib/DtXinerama/Imakefile | 3 ++ cde/lib/Imakefile | 4 +- 5 files changed, 80 insertions(+), 18 deletions(-) diff --git a/cde/lib/DtSvc/DtUtil2/Imakefile b/cde/lib/DtSvc/DtUtil2/Imakefile index faf13469..52269944 100644 --- a/cde/lib/DtSvc/DtUtil2/Imakefile +++ b/cde/lib/DtSvc/DtUtil2/Imakefile @@ -10,13 +10,18 @@ XCOMM $TOG: Imakefile /main/14 1998/04/22 14:18:31 mgreess $ #include <Threads.tmpl> +#if CDE_USEXINERAMA +XINOPT = -DUSE_XINERAMA +#endif + #ifndef DtSvcDefines # define DtSvcDefines -DMULTIBYTE #endif DEPEND_DEFINES = $(DEPENDDEFINES) -DEFINES = DtSvcDefines \ +DEFINES = DtSvcDefines $(XINOPT) \ -DCDE_INSTALLATION_TOP=\"$(CDE_INSTALLATION_TOP)\" \ -DCDE_CONFIGURATION_TOP=\"$(CDE_CONFIGURATION_TOP)\" + INCLUDES = -I. -I../include #ifdef SunArchitecture diff --git a/cde/lib/DtSvc/DtUtil2/SharedProcs.c b/cde/lib/DtSvc/DtUtil2/SharedProcs.c index f6a3b371..af99b2cd 100644 --- a/cde/lib/DtSvc/DtUtil2/SharedProcs.c +++ b/cde/lib/DtSvc/DtUtil2/SharedProcs.c @@ -65,7 +65,9 @@ #include <Dt/DtP.h> #include <Dt/Connect.h> #include <Dt/DtNlUtils.h> - +#ifdef USE_XINERAMA +#include <DtXinerama.h> +#endif #include "SharedProcs.h" @@ -74,7 +76,8 @@ /******** Static Function Declarations ********/ - +static void MessageDialogPopupCB(Widget w, XtPointer client_data, + XtPointer call_data); /******** End Static Function Declarations ********/ @@ -247,17 +250,15 @@ _DtMessageDialog( else attributes.map_state = IsUnmapped; + /* + * If parent widget isn't mapped, attach a callback + * procedure that'll center the message dialog on screen. + */ if (attributes.map_state == IsUnmapped) - { - XtSetArg(args[0], XmNx, (WidthOfScreen(XtScreen (w)) - 350) / 2); - XtSetArg(args[1], XmNy, (HeightOfScreen(XtScreen (w)) - 200) / 2); - XtSetArg(args[2], XmNdefaultPosition, False); - XtSetValues(message, args, 3); - } - - + XtAddCallback(XtParent(message),XmNpopupCallback, + MessageDialogPopupCB,(XtPointer)w); + /* Adjust the decorations and title for the dialog shell of the dialog */ - XtSetArg(args[0], XmNtitle, title); XtSetArg(args[1], XmNmwmFunctions, MWM_FUNC_MOVE); XtSetArg(args[2], XmNmwmDecorations, MWM_DECOR_BORDER | MWM_DECOR_TITLE); @@ -365,4 +366,52 @@ _DtMessageClose( } } - +/* + * Center a message dialog on screen once it is managed. + * client_data is expected to contain the parent shell widget handle. + */ +static void MessageDialogPopupCB(Widget w, XtPointer client_data, + XtPointer call_data) +{ + Position msg_x, msg_y; + unsigned int scr_w, scr_h, off_x=0, off_y=0; + Dimension msg_w=0, msg_h=0; + Arg args[2]; + #ifdef USE_XINERAMA + DtXineramaInfo_t *dt_xi; + #endif + + msg_w=XtWidth(w); + msg_h=XtHeight(w); + + scr_w=WidthOfScreen(XtScreen(w)); + scr_h=HeightOfScreen(XtScreen(w)); + + #ifdef USE_XINERAMA + /* determine xinerama screen number the parent shell resides on, + * and override scr_w/scr_h and off_x/off_y on success */ + if((dt_xi=_DtXineramaInit(XtDisplay(w)))){ + int i; + unsigned int pw_x=XtX((Widget)client_data); + unsigned int pw_y=XtY((Widget)client_data); + + for(i=0; i<dt_xi->numscreens; i++){ + unsigned int sw,sh,sx,sy; + _DtXineramaGetScreen(dt_xi,i,&sw,&sh,&sx,&sy); + if(pw_x>=sx && pw_x<(sx+sw) && pw_y>=sy && pw_y<(sy+sh)){ + off_x=sx; off_y=sy; + scr_w=sw; scr_h=sh; + break; + } + } + } + #endif /* USE_XINERAMA */ + + msg_x=off_x+(scr_w-msg_w)/2; + msg_y=off_y+(scr_h-msg_h)/2; + + XtSetArg(args[0],XmNx,msg_x); + XtSetArg(args[1],XmNy,msg_y); + XtSetValues(w,args,2); + XtRemoveCallback(w,XmNpopupCallback,MessageDialogPopupCB,client_data); +} diff --git a/cde/lib/DtSvc/Imakefile b/cde/lib/DtSvc/Imakefile index 3585cb8b..8ec6c3bf 100644 --- a/cde/lib/DtSvc/Imakefile +++ b/cde/lib/DtSvc/Imakefile @@ -2,6 +2,11 @@ XCOMM $TOG: Imakefile /main/16 1998/08/10 18:02:14 mgreess $ #define IHaveSubdirs #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CXXDEBUGFLAGS=$(CXXDEBUGFLAGS)' +#if CDE_USEXINERAMA +XINOPT = -DUSE_XINERAMA +XINLIB = -lDtXinerama -lXinerama +#endif + SUBDIRS = include DtUtil1 DtUtil2 DtEncap DtCodelibs DtXpm DONES = DtUtil1/DONE DtUtil2/DONE DtEncap/DONE DtCodelibs/DONE DtXpm/DONE EXTRALIBRARYDEPS = $(DONES) @@ -24,18 +29,18 @@ DependSubdirs($(SUBDIRS)) #ifndef DtSvcDefines # define DtSvcDefines -DMULTIBYTE #endif -DEFINES = DtSvcDefines +DEFINES = DtSvcDefines $(XINOPT) INCLUDES = -I. #ifdef SharedDtSvcReqs #ifdef SunArchitecture -REQUIREDLIBS = SharedDtSvcReqs +REQUIREDLIBS = SharedDtSvcReqs $(XINLIB) #ifndef HasGcc2 SHLIBLDFLAGS = -G #endif #else -REQUIREDLIBS = SharedDtSvcReqs +REQUIREDLIBS = SharedDtSvcReqs $(XINLIB) #endif #endif diff --git a/cde/lib/DtXinerama/Imakefile b/cde/lib/DtXinerama/Imakefile index 21837dc4..70347b43 100644 --- a/cde/lib/DtXinerama/Imakefile +++ b/cde/lib/DtXinerama/Imakefile @@ -39,5 +39,8 @@ OBJS = DtXinerama.o INCLUDES = -I. +XCOMM -fpic is required for static libDtXinerama to link with libDtSvc properly +CCOPTIONS += -fpic + DependTarget() diff --git a/cde/lib/Imakefile b/cde/lib/Imakefile index 2d0bfac8..df37a00c 100644 --- a/cde/lib/Imakefile +++ b/cde/lib/Imakefile @@ -12,8 +12,8 @@ PAMDIR = pam PAMDIR = #endif -SUBDIRS = $(PAMDIR) tt DtSvc DtSearch DtWidget DtHelp DtPrint DtTerm DtMrm \ - csa $(XINDIR) +SUBDIRS = $(XINDIR) $(PAMDIR) tt DtSvc DtSearch DtWidget DtHelp DtPrint \ + DtTerm DtMrm csa MakeSubdirs($(SUBDIRS)) DependSubdirs($(SUBDIRS)) -- 2.11.0
>From 14778e5749bf58e985796e2fd1b1b9c595eb27c2 Mon Sep 17 00:00:00 2001 From: alx <a...@fastestcode.org> Date: Fri, 30 Dec 2016 01:28:43 +0100 Subject: [PATCH 2/5] dtfile: added Xinerama support to dialog positioning routines --- cde/programs/dtfile/Encaps.c | 58 ++++++++++++++++++++++++++++++++++++++++--- cde/programs/dtfile/Encaps.h | 2 +- cde/programs/dtfile/Imakefile | 8 ++++-- 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/cde/programs/dtfile/Encaps.c b/cde/programs/dtfile/Encaps.c index 5314e0e9..7bfc6550 100644 --- a/cde/programs/dtfile/Encaps.c +++ b/cde/programs/dtfile/Encaps.c @@ -99,7 +99,9 @@ #include "FileMgr.h" #include "Main.h" #include "ModAttr.h" - +#ifdef USE_XINERAMA +#include <DtXinerama.h> +#endif #define MAX_NAME_LIST_SIZE 25 #define MAX_RESOURCE_LENGTH 256 @@ -232,6 +234,10 @@ static void IntDialogPutResources( char *dialogName, char *base, DialogResource *resource) ; +#ifdef USE_XINERAMA +static Boolean GetXineramaScreenDimensions( + Widget w,int *xorg, int *yorg, int *width,int *height); +#endif /* USE_XINERAMA */ /******** End Static Function Declarations ********/ @@ -1872,6 +1878,7 @@ _DtChildPosition( int pWidth, myWidth, sWidth; enum { posRight, posBelow, posLeft, posAbove } pos; int space; + int xOrg=0, yOrg=0; /* Xinerama screen origin */ /* get x, y offsets for the parent's window frame */ extData = _XmGetWidgetExtData(parent, XmSHELL_EXTENSION); @@ -1884,11 +1891,19 @@ _DtChildPosition( else xOffset = yOffset = 0; + #ifdef USE_XINERAMA + if(!GetXineramaScreenDimensions(parent,&xOrg,&yOrg,&sWidth,&sHeight)){ + sHeight = HeightOfScreen(XtScreen(parent)); + sWidth = WidthOfScreen(XtScreen(parent)); + } + #else /* get size/position of screen, parent, and widget */ - sHeight = HeightOfScreen(XtScreen(parent));; + sHeight = HeightOfScreen(XtScreen(parent)); sWidth = WidthOfScreen(XtScreen(parent)); - pX = XtX(parent) - xOffset; - pY = XtY(parent) - yOffset; + #endif /* USE_XINERAMA */ + + pX = XtX(parent) - xOffset - xOrg; + pY = XtY(parent) - yOffset - yOrg; pHeight = XtHeight(parent) + yOffset + xOffset; pWidth = XtWidth(parent) + 2*xOffset; myHeight = XtHeight(w) + yOffset + xOffset; @@ -1958,6 +1973,8 @@ _DtChildPosition( if ((*newY >= (sHeight - 10)) || (*newY < 0)) *newY = (sHeight - myHeight) / 2; + *newX+=xOrg; + *newY+=yOrg; } @@ -2457,3 +2474,36 @@ _DtFreeDialog( } } +#ifdef USE_XINERAMA +/* + * Retrieve dimensions of the Xinerama screen the given widget resides on. + * Returns True on success, False otherwise. + */ +static Boolean GetXineramaScreenDimensions( + Widget w, int *org_x, int *org_y, int *s_width, int *s_height) +{ + DtXineramaInfo_t *dt_xi; + unsigned int wx, wy; + unsigned int i, sx, sy, sw, sh; + + while(w && !XtIsShell(w)) w=XtParent (w); + + wx=XtX(w); + wy=XtY(w); + + if(!(dt_xi=_DtXineramaInit(XtDisplay(w)))) return False; + + for(i=0; i<dt_xi->numscreens; i++){ + if(!_DtXineramaGetScreen(dt_xi,i,&sw,&sh,&sx,&sy))break; + + if(wx>=sx && wx<(sx+sw) && wy>=sy && wy<(sy+sh)){ + *s_width=(int)sw; + *s_height=(int)sh; + *org_x=(int)sx; + *org_y=(int)sy; + return True; + } + } + return False; +} +#endif /* USE_XINERAMA */ diff --git a/cde/programs/dtfile/Encaps.h b/cde/programs/dtfile/Encaps.h index 19ec4154..ebec8185 100644 --- a/cde/programs/dtfile/Encaps.h +++ b/cde/programs/dtfile/Encaps.h @@ -38,7 +38,7 @@ **************************************************************************** ************************************<+>*************************************/ -#ifndef _Encapsualte_h +#ifndef _Encapsulate_h #define _Encapsulate_h diff --git a/cde/programs/dtfile/Imakefile b/cde/programs/dtfile/Imakefile index 32f67865..88aecbdd 100644 --- a/cde/programs/dtfile/Imakefile +++ b/cde/programs/dtfile/Imakefile @@ -8,17 +8,21 @@ MakeSubdirs($(SUBDIRS)) ForceSubdirs($(SUBDIRS)) DependSubdirs($(SUBDIRS)) +#if CDE_USEXINERAMA +XINOPT = -DUSE_XINERAMA +XINLIB = -lDtXinerama -lXinerama +#endif DEPEND_DEFINES = $(DEPENDDEFINES) DEFINES = -DMULTIBYTE -DSHAPE -D_ILS_MACROS -DSUN_PERF \ -DCDE_INSTALLATION_TOP=\"$(CDE_INSTALLATION_TOP)\" \ -DCDE_CONFIGURATION_TOP=\"$(CDE_CONFIGURATION_TOP)\" \ - -DKORNSHELL=\"$(KORNSHELL)\" + -DKORNSHELL=\"$(KORNSHELL)\" $(XINOPT) INCLUDES = -I./dtcopy DEPLIBS = DepDtClientLibs -LOCAL_LIBRARIES = DtClientLibs +LOCAL_LIBRARIES = DtClientLibs $(XINLIB) SYS_LIBRARIES = DtClientSysLibs DtClientExtraLibs #ifdef AlphaArchitecture -- 2.11.0
>From 58ab0471d17e9c0526030d236473b98204417e05 Mon Sep 17 00:00:00 2001 From: alx <a...@fastestcode.org> Date: Fri, 30 Dec 2016 01:31:09 +0100 Subject: [PATCH 3/5] dtlogin: center the mouse pointer on the login screen on multi-head setups --- cde/programs/dtlogin/vgmain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/cde/programs/dtlogin/vgmain.c b/cde/programs/dtlogin/vgmain.c index 91d41a7f..f26bcadc 100644 --- a/cde/programs/dtlogin/vgmain.c +++ b/cde/programs/dtlogin/vgmain.c @@ -1236,6 +1236,7 @@ MakeDialog( DialogType dtype ) xorg = yorg = 0; } /* else, should be setup properly */ + XWarpPointer(dpyinfo.dpy,None,dpyinfo.root,0,0,0,0,dpwidth/2,dpheight/2); #else /* no Xinerama */ dpwidth = dpyinfo.width; dpheight = dpyinfo.height; -- 2.11.0
>From 702f8e52e00ef8f73deb5cb8ad0af7561fed7119 Mon Sep 17 00:00:00 2001 From: alx <a...@fastestcode.org> Date: Fri, 30 Dec 2016 01:35:38 +0100 Subject: [PATCH 4/5] ttsession: don't segfault if host name isn't properly set --- cde/lib/tt/lib/mp/mp_desktop.C | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cde/lib/tt/lib/mp/mp_desktop.C b/cde/lib/tt/lib/mp/mp_desktop.C index cf5a075a..36df33d2 100644 --- a/cde/lib/tt/lib/mp/mp_desktop.C +++ b/cde/lib/tt/lib/mp/mp_desktop.C @@ -416,7 +416,10 @@ parse_Xdisplay_string(_Tt_string display, _Tt_string &host, pid_t &svnum,_Tt_str if (offset == 0) { // use local host - (void)_tt_global->get_local_host(h); + if(!_tt_global->get_local_host(h)){ + _tt_syslog(0,LOG_ERR,"get_local_host(): 0"); + return 0; + } host = h->stringaddr(); hostname = h->name(); status = 2; @@ -427,7 +430,10 @@ parse_Xdisplay_string(_Tt_string display, _Tt_string &host, pid_t &svnum,_Tt_str host = display.mid(0, offset); if (host == "unix") { - (void)_tt_global->get_local_host(h); + if(!_tt_global->get_local_host(h)){ + _tt_syslog(0,LOG_ERR,"get_local_host(): 0"); + return 0; + } host = h->stringaddr(); hostname = h->name(); status = 3; -- 2.11.0
>From 68518e237bcb39de94b2a2a36bc1ff7f8a2644da Mon Sep 17 00:00:00 2001 From: alx <a...@fastestcode.org> Date: Fri, 30 Dec 2016 02:43:57 +0100 Subject: [PATCH 5/5] dtksh/sfio: resolved a naming collision on FreeBSD 11 --- cde/programs/dtksh/ksh93/src/lib/libast/include/sfio.h | 2 +- cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfclrlock.c | 4 ++-- cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfio_t.h | 2 +- cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfnew.c | 2 +- cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfset.c | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/include/sfio.h b/cde/programs/dtksh/ksh93/src/lib/libast/include/sfio.h index b9caca8f..5394d106 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/include/sfio.h +++ b/cde/programs/dtksh/ksh93/src/lib/libast/include/sfio.h @@ -224,7 +224,7 @@ struct _sfio_ #define SF_IOCHECK 0002000 /* call exceptf before doing IO */ #define SF_PUBLIC 0004000 /* SF_SHARE and follow physical seek */ -#define SF_FLAGS 0005177 /* PUBLIC FLAGS PASSABLE TO SFNEW() */ +#define SFIO_FLAGS 0005177 /* PUBLIC FLAGS PASSABLE TO SFNEW() */ #define SF_SETS 0007163 /* flags passable to sfset() */ /* exception events: SF_NEW(0), SF_READ(1), SF_WRITE(2) and the below */ diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfclrlock.c b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfclrlock.c index 8afa5b6a..6a8a8a1f 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfclrlock.c +++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfclrlock.c @@ -66,7 +66,7 @@ reg Sfio_t *f; f->flags &= ~(SF_ERROR|SF_EOF); if(!(f->mode&(SF_LOCK|SF_PEEK)) ) - return (f->flags&SF_FLAGS); + return (f->flags&SFIO_FLAGS); /* clear peek locks */ f->mode &= ~SF_PEEK; @@ -78,5 +78,5 @@ reg Sfio_t *f; f->mode &= (SF_RDWR|SF_INIT|SF_POOL|SF_PUSH|SF_SYNCED|SF_STDIO); - return _sfmode(f,0,0) < 0 ? 0 : (f->flags&SF_FLAGS); + return _sfmode(f,0,0) < 0 ? 0 : (f->flags&SFIO_FLAGS); } diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfio_t.h b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfio_t.h index 1d8df2c9..5b9ed411 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfio_t.h +++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfio_t.h @@ -82,7 +82,7 @@ (unsigned char*)(data), /* endr */ \ (unsigned char*)(data), /* endb */ \ (struct _sfio_*)0, /* push */ \ - (unsigned short)((type)&SF_FLAGS), /* flags */ \ + (unsigned short)((type)&SFIO_FLAGS), /* flags */ \ (short)(file), /* file */ \ (unsigned char*)(data), /* data */ \ (int)(size), /* size */ \ diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfnew.c b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfnew.c index 95186269..ecb21aa6 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfnew.c +++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfnew.c @@ -115,7 +115,7 @@ int flags; /* type of file stream */ /* stream type */ f->mode = (flags&SF_READ) ? SF_READ : SF_WRITE; - f->flags = (flags&SF_FLAGS) | ((flags&SF_RDWR) == SF_RDWR ? SF_BOTH : 0); + f->flags = (flags&SFIO_FLAGS) | ((flags&SF_RDWR) == SF_RDWR ? SF_BOTH : 0); f->flags |= (sflags&(SF_MALLOC|SF_STATIC)); f->file = file; f->here = f->extent = 0L; diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfset.c b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfset.c index a7d8122a..0ded609f 100644 --- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfset.c +++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfset.c @@ -62,7 +62,7 @@ reg int set; reg int oflags; if(flags == 0) - return (f->flags&SF_FLAGS); + return (f->flags&SFIO_FLAGS); if((oflags = (f->mode&SF_RDWR)) != f->mode && _sfmode(f,oflags,0) < 0) return 0; @@ -98,5 +98,5 @@ reg int set; f->flags &= ~SF_PUBLIC; SFOPEN(f,0); - return (oflags&SF_FLAGS); + return (oflags&SFIO_FLAGS); } -- 2.11.0
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________ cdesktopenv-devel mailing list cdesktopenv-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/cdesktopenv-devel