Moving Desktop Objects

From OS2World.Com Wiki
Jump to navigation Jump to search

By Andreas Schnellbacher

Files


Description of the Bug

After system restart all desktop objects moved by the height of the toolbar. For a toolbar at the top of the desktop the objects move upwards. For a toolbar at the bottom they move downwards.

It happens with all toolbars that reduce the workplace area. That means that not only XWorkplace's XCenter (or eCenter) is affected, but also Warp 4's WarpCenter (or SmartCenter).

I can remember that Ulrich Möller wrote that it's an old IBM bug.

How to get rid of it

Run the included CMD file

Appendix

RmDesktopFolderPos.cmd REXX Script

/****************************** Module Header *******************************
*
* Module Name: RmDesktopFolderPos.cmd
*
* Syntax: RmDesktopFolderPos [RUN] [QUIET]
*
*         Options (not case-sensitive):
*            RUN    don't ask at startup, only error messages
*            QUIET  no output messages, check RC for the result
*
* This REXX script deletes the ini key of the desktop's FolderPos in icon
* view. It helps to work around following OS/2 bug which happens from time
* to time if a toolbar is configured to reduce the desktop's workarea:
*
* After system restart all desktop objects moved by the height of the
* toolbar. For a toolbar at the top of the desktop the objects move upwards.
* For a toolbar at the bottom they move downwards.
*
* Example for a desktop handle:
*    0x3BE66 = 24 53 50
*
* Example for an ini key in PM_Workplace:FolderPos:
*    245350@10
*
* ===========================================================================
*
* Andreas Schnellbacher 2014
*
****************************************************************************/
/* Some header lines are used as help text */
HelpStartLine = 11
HelpEndLine   = 17


/* ----------------- Standard REXX initialization follows ---------------- */
SIGNAL ON HALT NAME Halt

IF ADDRESS() <> 'EPM' THEN
   '@ECHO OFF'

env   = 'OS2ENVIRONMENT'
TRUE  = (1 = 1)
FALSE = (0 = 1)
CrLf  = '0d0a'x
Redirection = '>NUL 2>&1'
PARSE SOURCE . . ThisFile
GlobalVars = 'env TRUE FALSE Redirection ERROR. ThisFile RC'

/* some OS/2 Error codes */
ERROR.NO_ERROR           =   0
ERROR.INVALID_FUNCTION   =   1
ERROR.FILE_NOT_FOUND     =   2
ERROR.PATH_NOT_FOUND     =   3
ERROR.ACCESS_DENIED      =   5
ERROR.NOT_ENOUGH_MEMORY  =   8
ERROR.INVALID_FORMAT     =  11
ERROR.INVALID_DATA       =  13
ERROR.NO_MORE_FILES      =  18
ERROR.WRITE_FAULT        =  29
ERROR.READ_FAULT         =  30
ERROR.SHARING_VIOLATION  =  32
ERROR.GEN_FAILURE        =  31
ERROR.INVALID_PARAMETER  =  87
ERROR.ENVVAR_NOT_FOUND   = 204

RC = ERROR.NO_ERROR

CALL RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
CALL SysLoadFuncs
/* ----------------- Standard REXX initialization ends ------------------- */

GlobalVars = GlobalVars 'fQuiet'

/* Get Name of inf file in dir of current file */
InfFileName = 'MovingDesktopObjects.inf'
lp = LASTPOS( '\', ThisFile)
InfFile = SUBSTR( ThisFile, 1, lp)InfFileName
IF (STREAM( InfFile, 'c', 'query exists') = '') THEN
   InfFile = InfFileName  /* Let view search in BOOKSHELF */


/* Get Args */
PARSE ARG Args
Args = STRIP( Args)

fQuiet = 0
fAsk   = 1
IF WORDPOS( TRANSLATE( Args), 'RUN') > 0 THEN
  fAsk = 0
IF WORDPOS( TRANSLATE( Args), 'QUIET') > 0 THEN
DO
  fQuiet = 1
  fAsk = 0
END

IF fAsk THEN
DO
   SAY
   DO l = HelpStartLine TO HelpEndLine
      CALL SayText( SUBSTR( SOURCELINE( l), 3))
   END
   SAY
   CALL SayText( 'Type C to continue, H for help or any other key for cancel:')
   PULL Answer
   Answer = STRIP( Answer)
   SELECT
      WHEN Answer = 'C' THEN
         NOP
      WHEN Answer = 'H' THEN
      DO
         /* Show INF file */
         'start view' InfFile
         EXIT( RC)
      END
   OTHERWISE
      SIGNAL Halt
   END
END


/* Get desktop's object handle */

ObjectId = '<WP_DESKTOP>'
DecObjHandle = GetDecObjHandle( ObjectId)
IF RC <> ERROR.NO_ERROR THEN
DO
   CALL SayError( 'Error:' IniKey 'was not found in' IniApp'.')
   EXIT( RC)
END

/* Query desktop's FolderPos entry for icon view */

IniApp   = 'PM_Workplace:FolderPos'
ViewId   = 10  /* Icon View */
IniKey   = DecObjHandle'@'ViewId

IniVal = QueryIniKey( IniApp, IniKey)
IF RC <> ERROR.NO_ERROR THEN
DO
   CALL SayError( 'Error:' IniKey 'was not found in' IniApp'.')
   EXIT( RC)
END

/* Delete desktop's FolderPos entry for icon view */

CALL DeleteIniKey IniApp, IniKey
IF RC <> ERROR.NO_ERROR THEN
DO
   CALL SayError( 'Error:' IniKey 'was not deleted from' IniApp'.')
   EXIT( RC)
END

CALL SayText( IniKey 'for' ObjectId 'was successfully deleted from' IniApp'.')
EXIT(  ERROR.NO_ERROR)


/* ----------------------------------------------------------------------- */
GetDecObjHandle:
   PARSE ARG ObjectId

   RC = ERROR.NO_ERROR
   IniApp = 'PM_Workplace:Location'
   IniKey = ObjectId

   DecObjHandle = ''
   next = QueryIniKey( IniApp, IniKey)

   IF RC <> ERROR.NO_ERROR THEN
      RC = ERROR.READ_FAULT
   ELSE
   DO
      HexObjHandle = REVERSE( next)
      DecObjHandle = C2D( HexObjHandle)
   END

   RETURN( DecObjHandle)

/* ----------------------------------------------------------------------- */
QueryIniKey: PROCEDURE EXPOSE (GlobalVars)
   PARSE ARG IniApp, IniKey

   RC = ERROR.NO_ERROR
   IniVal = ''
   next = SysIni( 'USER', IniApp, IniKey)

   IF next = 'ERROR:' THEN
      RC = ERROR.READ_FAULT
   ELSE
      IniVal = next

   RETURN( IniVal)

/* ----------------------------------------------------------------------- */
DeleteIniKey: PROCEDURE EXPOSE (GlobalVars)
   PARSE ARG IniApp, IniKey

   RC = ERROR.NO_ERROR
   next = SysIni( 'USER', IniApp, IniKey, 'DELETE:')

   IF next = 'ERROR:' THEN
      RC = ERROR.WRITE_FAULT
   ELSE
      RC = ERROR.NO_ERROR

   RETURN

/* ----------------------------------------------------------------------- */
SayText: PROCEDURE EXPOSE (GlobalVars)
   PARSE ARG Message
   IF \fQuiet THEN
      SAY Message
   RETURN( '')

/* ----------------------------------------------------------------------- */
SayError: PROCEDURE EXPOSE (GlobalVars)
   PARSE ARG Message
   IF \fQuiet THEN
      SAY Message
   RETURN( '')

/* ----------------------------------------------------------------------- */
Halt:
   CALL SayError( 'Interrupted by user.')
   EXIT( ERROR.GEN_FAILURE)