On 22 Jul 01 at 16:05, [EMAIL PROTECTED] wrote:

> On Sun, Jul 22, 2001 at 09:32:38PM +0700, Dmitry Yu. Bolkhovityanov wrote:
[SNIP]
> >   7) Maximizing windows
[SNIP]
> >     Implementation of 7 also doesn't look problematic, I can do it.
>
> Perhaps we should first discuss how to implement the new syntax in
> general.  There are several places where Xinerama specific
> parameters would be useful (Move, Resize, ResizeMove, Maximize,
> MoveToPage and others).

    As to Maximize, the syntax can be extended with a single optional switch:

    Maximize [absolute] ...

By default maximization occurs on a window's screen, but if "absolute" is
specified, the global screen is used instead (that's how it is done in E).

    I'm not sure what to do with Move/Resize.  These *can* also use an
optional "absolute" parameter, but Move should allow inter-screen moving by
default. Resize, on the other hand, can benefit from such a constraint.
Yuck, the Move is already constrained by inter-xinerama-screen
EdgeResistance, so applying optional "absolute" to resizing will be enough.

> >     And what do you mean in 10 -- should Pager draw each page as a complex
> > shape, consisting of several rectangles, with possible "blank areas",
> > instead of current simple rectangle?  And should it limit moving "mini-
> > windows" as moving real ones are limited to existing screen space?
>
> At least it would be nice to optionally have some kind of
> separator similar to page separators.  Also, the blank areas
> should be visible and it shouldn't be possible to move windows
> entirely into them.

    Okay -- than we'll have to add XiSuppGetScreens or, better,

int  XiSuppGetScreensCount(void)
void XiSuppGetNScrRect(int N, int *x, int *y, int *w, int *h).

But that must be re-queried on every XineramaUse/XineramaIgnore to keep
pager's list coherent with XineramaSupport's.  Anyway, users of this
interface should be limited to Pager.

> > > However some of the
> > > Xinerama functions poll the pointer position which reduces
> > > performance a lot, especially in the move and resize loops.
> >
> >     Is there any current-pointer-position cache in Xlib, which can be
> > queried instead of always calling XQueryPointer()?  That could be fine.
>
> I don't think so.
>
> > Otherwise we should add something like "XineramaSupportNextEvent", which
> > could do caching instead.
>
> Another solution would be to allow screen coordinates as optional
> parameters to the XineramaSuporrt... function calls.  The pointer
> would only be queried if no position was given.  I'm not yet sure
> what the best solution would be.
>
> I have been thinking about fvwm replacements for X and other
> library funtions for a while.  It may be a good idea to drop in
> functions a la FvwmNextEvent as replacements for the X functions
> and somehow automatically create a compiler error for all places
> where the original function is used.

    "Optional parameters" decision will require such parameters to too many
calls (some of the cases are not obvious).  It seems better to introduce
FvwmNextEvent and make it call XiSuppSetMouseXY():

Bool cur_ms_coords_set = False;

void XiSuppSetMouseXY(int x, int y)
{
  cur_ms_x = x;
  cur_ms_y = y;
  cur_ms_coords_set = True;
}

static void GetMouseXY(int *x, int *y)
{
  if (cur_ms_coords_set)
  {
    *x = cur_ms_x;
    *y = cur_ms_y;
  }
  else
    XQueryPointer(...);
}

    The cur_ms_coords_set guard is for just-started proggies, when no events
are received yet, but we need to know current pointer position.

    BTW, are there any cases when a module will require XiSupp to do a
current-screen-based decision, while not feeding up-to-date XY info
beforehand (e.g., when the pointer is moved to other screen, and not above
that module's window)?

[SNIP]
> >     As to general, standard X geometry specification turned to be
> > insufficient for Xinerama, so new XineramaSupport.c enables one to specify
> > [EMAIL PROTECTED], where optional S parameter is a screen.
>
> Then we need an enhanced version of XParseGeometry() too?

    Yes, that's the XineramaSupportParseGeometry() ;-)

> >     The screen can be either a number or one of "g" (global -- emulates
> > XParseGeometry), "c" (current -- where pointer is), "p" -- primary (usually
> > 1st screen, unless changed), this is the default.
> >
> >     Plus a concept of "primary screen", where main controls are located
> > (Pager, Wharf, TaskBar (sic!)).  (Since XFree86 4.1 XDM places its login
> > window to the 1st Xinerama screen too.)
>
> Yes, the concept of a primary screen is a good idea - my primary
> screen is right of the second one, so all kinds of windows don't
> appear where I would like them to.  Does it make sense to not use
> the second screen at all unless the user explicitly moves or
> starts applications there?

    IMHO it is sane to obey sizehints when they request placing on non-
primary screen, and always try to start app on current screen.  In most
cases "current" will be "primary", so if the user wants a window on non-
primary screen, he should either move the pointer there and run an app, or
move an existing window there (resembles FVWM's treatment of virtual
pages/desktops).

> >     And what is completely broken by Xinerama is TaskBar with its autohiding
> > logic (AutoStick, however, is fixable).  I've spent a lot of time trying to
> > make it work, but seems that it will be *much* easier to implement
> > Style AutoHide.
>
> Don't waste your time on fixing that autohide feature.  It was
> broken from the start and will never work properly anyway.  A
> style is much better.
>
> >  The latter is more correct, BTW, since some aspects are
> > absolutely impossible to do in a module instead of WM itself.
>
> I'll start collecting all this in a xinerama to-do file.

    Okay, these things are:

    Style AutoHide [visible-pixels]
    Style AutoStretch

    The latter is to emulate TaskBar's behaviour -- stretch along the border
which it is stuck to.  As to AutoHide, there is a question: should such
style work in both vertical and horizontal directions, or should it be
limitable?  AutoHide'ing something horizontal like TaskBar to the left/right
border is nonsense.  Or maybe there is some reason to emulate windoze's
taskbar behaviour (it changes orientation according to which border it
sticks to).

    Of course, something like AutoStick is required also -- like making
SnapAttraction a per-style parameter.

    As to what is unimplementable in AutoHide outside the WM: consider the
following layout:

    +------------+
    |            |
    |   Primary  |
    |            |
    +------------+
    |            |
    |  Secondary |
    |            |
    +------------+

If AutoHide'ing window is located at the bottom border of primary screen,
when hiding it shows on Secondary.  The general case is when a window hides
behind a border which contacts another screen, the window shows on that
another screen.

    So FVWM must resize X-window for it to be present entirely on the "host"
screen.  Simply XResizeWindow(tmp_win->frame) will do the thing in
bottom/right cases, but not in top/left -- those will require an additional
offsets while XDraw/XFill'ing.

       ___________________________________________________________________
       Dmitry Yu. Bolkhovityanov  |  Novosibirsk, RUSSIA
       phone (383-2)-39-49-56     |  The Budker Institute of Nuclear Physics
                                  |  Lab. 5-13
--
Visit the official FVWM web page at <URL:http://www.fvwm.org/>.
To unsubscribe from the list, send "unsubscribe fvwm-workers" in the
body of a message to [EMAIL PROTECTED]
To report problems, send mail to [EMAIL PROTECTED]

Reply via email to