Hello Tycho,
I think I cleaned everything from this version
See attachment.
Eliza
On Wednesday, March 25, 2015 at 1:36:33 AM UTC-4, Eliza Guseva wrote:
>
> Ok, great! We have lots of other bugs and oddities, so I'm sure we can
>> find something :)
>>
>
> I've started filing an application for the D-bus project.
> However it turned out that for Python Foundation a patch is a requirement.
> So I pushed it a little further and made an experimental fix or the layout
> issue #372 for the case of stacks
>
> I applied it for the commit 989f0f8534ee2e34e14b8cb02920c861d053d49c
> And it worked. It has an issue: the windows order is being saved, but
> qtile redraws the correct order sometimes only on-click.
> Maybe it's due to the method I used, maybe something else.
> I used OrderedSet class, wich is under MIT license, from here:
> http://code.activestate.com/recipes/576694-orderedset/
>
>
> I pulled the lateset commit from qtile/qtile in order to test my fix on
> the newer version
> I've got a message error, when tried to change layouts:
> ERROR handle_KeyPress:854 KB command error nextlayout: No such command.
>
> Please apply my patch to 989f0f8534ee2e34e14b8cb02920c861d053d49c
>
> Eliza
>
>
> On Tuesday, March 24, 2015 at 10:46:52 AM UTC-4, Tycho Andersen wrote:
>>
>> Hi Eliza,
>>
>> On Mon, Mar 23, 2015 at 08:43:06PM -0700, Eliza Guseva wrote:
>> >
>> >
>> > Hello Tycho,
>> >
>> >
>> > I've been reading about d-bus and there's one thing which is not quite
>> > clear to me.
>> > During my search I've found Python 3.3 bindings for DBUS in rather
>> mature
>> > versions: python-dbus 1.2.0-4
>> > Do I understand right that the issue with async could be fixed if
>> > python-dbus had async support?
>> > With respect to the GSoC project, I was curious, why you'd prefer a new
>> > library instead of adding async support to the existing python-dbus?
>> >
>>
>> Mostly for dependencies. In debian, if python-dbus had asyncio
>> support, installing it would still pull in all of gobject/glib which
>> are unnecessary. Of course, I could build it myself, but it would be
>> nice to have a pure python implementation of dbus that just depended
>> on asyncio and used cffi to do the C binding so that it could be pip
>> installed.
>>
>> However, I've not spent a lot of time analyzing the existing
>> python-dbus code, and if you think it would be much easier to get
>> patches into python-dbus than to write a new library, then that's the
>> route we should take.
>>
>> > >When I asked every window to print
>> > > > all their attributes (from function *qtile.update_client_list()*),
>> it
>> > > > happened that for some reason only the first window (the one which
>> goes
>> > > in
>> > > > the left stack) knew its attributes such as group, name and status.
>> I
>> > > was
>> > > > curious if it is how it should be by design?
>> > >
>> > If I understand correctly, no, I don't think so, sounds like a bug :)
>> > >
>> >
>> >
>> > I don't know if it affects any visible behavior. Should I form a bug
>> report
>> > in this case?
>> >
>> > I think I am pretty sure about the screens-group issue: the groups with
>> > indexes starting from the (number of screens +1) are located at the
>> screen
>> > None.
>> > I think that's why windows freely jump from one group to another in my
>> case.
>> > So, I guess this should go to the tracker...
>>
>> Sounds good.
>>
>> > That's one approach. Another option would be to add some way to
>> > > re-order things based on some state that gets passed through to qtile
>> > > via an argument.
>> > >
>> >
>> > As for the layouts.
>> > I thought at some point that I could come up with the reasonable
>> solution
>> > in reasonable time (way before GSoC deadline)
>> > But I proved to myself that I still don't know the required "guts" of
>> qtile
>> > and cannot really form a decent working qtile state.
>> > And maybe it might require more time. I sort of want to finish it now.
>> But
>> > it's not an appropriate task for 3 month, so I'll continue working on
>> it
>> > after the hassle of applications is over.
>>
>> Ok, great! We have lots of other bugs and oddities, so I'm sure we can
>> find something :)
>>
>> Tycho
>>
>> >
>> > Eliza
>> >
>> >
>> >
>> > On Saturday, March 21, 2015 at 10:13:12 AM UTC-4, Tycho Andersen wrote:
>> > >
>> > > Hi Eliza,
>> > >
>> > > On Fri, Mar 20, 2015 at 05:35:51PM -0700, Eliza Guseva wrote:
>> > > > Thanks for the clarifying comments :)
>> > > >
>> > > > The screens issue was related to the problem with xrandr on my
>> side.
>> > > > However, when I managed to get screens located side by side, I've
>> got
>> > > some
>> > > > curious windows behavior, into which I actually need to look more.
>> So
>> > > I'll
>> > > > skip the details.
>> > > >
>> > > > I looked in the layouts issue (#372). When I asked every window to
>> print
>> > > > all their attributes (from function *qtile.update_client_list()*),
>> it
>> > > > happened that for some reason only the first window (the one which
>> goes
>> > > in
>> > > > the left stack) knew its attributes such as group, name and status.
>> I
>> > > was
>> > > > curious if it is how it should be by design?
>> > >
>> > > If I understand correctly, no, I don't think so, sounds like a bug :)
>> > >
>> > > > Do I understand right, that this fact isn't necessary a cause for
>> #372,
>> > > but
>> > > > that the issue is caused by the behaviour of layouts instead?
>> > > > Each layout looks at th List of windows and when users move windows
>> > > across
>> > > > it just chooses which to show where.
>> > >
>> > > Yes, that sounds correct.
>> > >
>> > > > And at the same time windows themselves don't really know which
>> stack
>> > > they
>> > > > are in.
>> > > > So the solution is maybe in adding some information about order and
>> > > stacks
>> > > > to either layouts' or windows' attributes?
>> > >
>> > > That's one approach. Another option would be to add some way to
>> > > re-order things based on some state that gets passed through to qtile
>> > > via an argument. See QtileState for how we do it right now to
>> remember
>> > > which layouts are in which groups, and which groups are on which
>> > > screens.
>> > >
>> > > > Actually, If I want to fix something, but got some questions, what
>> is
>> > > the
>> > > > most appropriate way of communication: here, on the tracker or
>> somewhere
>> > > > else?
>> > >
>> > > This is good for discussion, or our IRC channel. I'd prefer we only
>> > > use the tracker to discuss actual bugs (or PRs).
>> > >
>> > > Tycho
>> > >
>> > > > Eliza
>> > > >
>> > > >
>> > > > On Thursday, March 19, 2015 at 4:36:55 PM UTC-4, Tycho Andersen
>> wrote:
>> > > > >
>> > > > > Hi Eliza,
>> > > > >
>> > > > > On Thu, Mar 19, 2015 at 10:11:17AM -0700, Eliza Guseva wrote:
>> > > > > > Thanks, Sean.
>> > > > > > I think I would like to clarify a couple of things...
>> > > > > >
>> > > > > > I think I don't quite understand how multiple monitors work.
>> > > > > > If I run qtile under kde I have two separate screens. There are
>> some
>> > > > > > issues. But they work more or less
>> > > > > > If I run qtile separately I couldn't get to separate screens,
>> when
>> > > do
>> > > > > the
>> > > > > > configuration from the manual:
>> > > > > > screens =[Screen(...),Screen(...)]
>> > > > > > I tried also configs from example.
>> > > > >
>> > > > > How did you try to "get to" the separate screens? Typically, I'd
>> use a
>> > > > > hotkey like:
>> > > > >
>> > > > > Key([mod, "mod1"], "h", lazy.to_screen(0)),
>> > > > >
>> > > > > for this.
>> > > > >
>> > > > > > I was curious, if it's a normal behavior.
>> > > > > >
>> > > > > > In terms of the projects, I thought, that for me as for user,
>> maybe
>> > > the
>> > > > > one
>> > > > > > about layouts serialization would be the most relevant.
>> > > > > > But on the other hand, for the project I thought maybe some
>> other
>> > > more
>> > > > > > infrastructure oriented task would be of higher importance,
>> like
>> > > dbus
>> > > > > > library for example.
>> > > > >
>> > > > > For me personally the dbus thing isn't a huge deal, since it is a
>> > > > > relatively small line count in our code (~50 or so), and it's not
>> a
>> > > > > hard dependency (i.e. you can use qtile without gobject/dbus). If
>> > > > > you're gauging priorities, I'd be much more interested in seeing
>> the
>> > > > > layout serialization work happen. Of course, that's my personal
>> > > > > interest, and you should only volunteer to work on a project
>> you're
>> > > > > really interested in!
>> > > > >
>> > > > > > However, while I did quite a lot of coding (Python mainly, but
>> also
>> > > > > C/C++),
>> > > > > > involving making complex applications from scratch. They all
>> were
>> > > > > research
>> > > > > > oriented projects and never systems oriented. I am willing to
>> learn
>> > > > > > specifics, but honestly, not sure what would be a best place to
>> > > start.
>> > > > > >
>> > > > > > Do you think, dbus library project would be an appropriate
>> project
>> > > for a
>> > > > > > person with a research background?
>> > > > >
>> > > > > I think it is appropriate for someone who is sufficiently
>> motivated.
>> > > > > The project has the potential to have a large impact on the
>> python
>> > > > > community because it fills a gap that nothing else does, but
>> people
>> > > > > will certainly need as they move code to the event loop in the
>> > > > > standard library.
>> > > > >
>> > > > > However, I don't think it will be easy. You'll likely be reading
>> a lot
>> > > > > of grotty systems/C code to get things right. For example, the
>> page on
>> > > > > the low level API that you'd likely be binding to says (in bold
>> :):
>> > > > >
>> > > > > "This manual documents the low-level D-Bus C API. If you use this
>> > > > > low-level API directly, you're signing up for some pain."
>> > > > >
>> > > > > http://dbus.freedesktop.org/doc/api/html/
>> > > > >
>> > > > > The other piece is that it's likely not just a GSoC and done
>> project.
>> > > > > To be successful it'll need to be maintained, because projects
>> won't
>> > > > > bother to port code to a library that doesn't have any active
>> > > > > developers willing to fix bugs.
>> > > > >
>> > > > > I think it's a huge opportunity to fix a problem the community
>> needs
>> > > > > fixed; but like all big opportunities, it'll be a lot of work
>> too.
>> > > > >
>> > > > > Tycho
>> > > > >
>> > > > > > Eliza
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > > Do I understand it right, that it's not particularly friendly
>> with
>> > > > > multip
>> > > > > >
>> > > > > > On Wednesday, March 18, 2015 at 10:56:25 AM UTC-4, Sean Vig
>> wrote:
>> > > > > > >
>> > > > > > > Hi Eliza,
>> > > > > > >
>> > > > > > > That's great to hear that you are interested in Qtile. Since
>> the
>> > > most
>> > > > > > > recent version (0.9.0), it is up to personal preference which
>> > > version
>> > > > > of
>> > > > > > > Python to run. We've pushed to get Python 3 support, and
>> > > personally
>> > > > > since
>> > > > > > > we've had the support for it, I've been running on Python 3,
>> but
>> > > we
>> > > > > want to
>> > > > > > > continue to support Python 2 until the community has moved
>> beyond
>> > > it.
>> > > > > Let
>> > > > > > > us know if you have questions moving forward.
>> > > > > > >
>> > > > > > > Sean
>> > > > > > >
>> > > > > > > On Tue, Mar 17, 2015 at 9:39 PM, Eliza Guseva <
>> [email protected]
>> > > > > > > <javascript:>> wrote:
>> > > > > > >
>> > > > > > >> Hello everyone,
>> > > > > > >>
>> > > > > > >> My name is Eliza. I am a graduate student in Stony Brook
>> > > University.
>> > > > > > >> I am a many years linux user and do a lot of Python coding
>> as a
>> > > part
>> > > > > of
>> > > > > > >> my graduate work.
>> > > > > > >>
>> > > > > > >> I intend to apply for GSoC and would be very interested to
>> work
>> > > on a
>> > > > > > >> Qtile's project.
>> > > > > > >> I have installed Qtile over my KDE, experimented with
>> > > configurations
>> > > > > and
>> > > > > > >> now figuring out how I can contribute
>> > > > > > >> and what would be the most useful contribution on my part.
>> > > > > > >>
>> > > > > > >> While I have found a couple of reproducible bugs as well as
>> > > things I
>> > > > > > >> would like to add,
>> > > > > > >> I think I would need a couple of days to read more
>> documentation
>> > > and
>> > > > > code
>> > > > > > >> to get deeper into it.
>> > > > > > >>
>> > > > > > >> I've started investigating Python-3 based qtile.
>> > > > > > >> With regards to this, I was curious, if there are some
>> > > preferences
>> > > > > over
>> > > > > > >> Pythons in the project,
>> > > > > > >> and if there are, which one would be better to work with?
>> > > > > > >>
>> > > > > > >> Regards,
>> > > > > > >> Eliza
>> > > > > > >>
>> > > > > > >> --
>> > > > > > >> You received this message because you are subscribed to the
>> > > Google
>> > > > > Groups
>> > > > > > >> "qtile-dev" group.
>> > > > > > >> To unsubscribe from this group and stop receiving emails
>> from it,
>> > > > > send an
>> > > > > > >> email to [email protected] <javascript:>.
>> > > > > > >> For more options, visit https://groups.google.com/d/optout.
>> > > > > > >>
>> > > > > > >
>> > > > > > >
>> > > > > >
>> > > > > > --
>> > > > > > You received this message because you are subscribed to the
>> Google
>> > > > > Groups "qtile-dev" group.
>> > > > > > To unsubscribe from this group and stop receiving emails from
>> it,
>> > > send
>> > > > > an email to [email protected] <javascript:>.
>> > > > > > For more options, visit https://groups.google.com/d/optout.
>> > > > >
>> > > > >
>> > > >
>> > > > --
>> > > > You received this message because you are subscribed to the Google
>> > > Groups "qtile-dev" group.
>> > > > To unsubscribe from this group and stop receiving emails from it,
>> send
>> > > an email to [email protected] <javascript:>.
>> > > > For more options, visit https://groups.google.com/d/optout.
>> > >
>> > >
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> Groups "qtile-dev" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> an email to [email protected].
>> > For more options, visit https://groups.google.com/d/optout.
>>
>>
--
You received this message because you are subscribed to the Google Groups
"qtile-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/libqtile/group.py b/libqtile/group.py
index 2203260..f78ecad 100644
--- a/libqtile/group.py
+++ b/libqtile/group.py
@@ -30,6 +30,7 @@ import contextlib
import xcffib
import xcffib.xproto
+from . import ordered_set
from . import command
from . import hook
from . import window
@@ -45,7 +46,7 @@ class _Group(command.CommandObject):
def __init__(self, name, layout=None):
self.name = name
self.customLayout = layout # will be set on _configure
- self.windows = set()
+ self.windows = ordered_set.OrderedSet([])
self.qtile = None
self.layouts = []
self.floating_layout = None
@@ -62,14 +63,14 @@ class _Group(command.CommandObject):
self.screen = None
self.currentLayout = 0
self.focusHistory = []
- self.windows = set()
+ self.windows = ordered_set.OrderedSet([])
self.qtile = qtile
self.layouts = [i.clone(self) for i in layouts]
self.floating_layout = floating_layout.clone(self)
if self.customLayout is not None:
self.layout = self.customLayout
self.customLayout = None
-
+
@property
def currentWindow(self):
try:
diff --git a/libqtile/ordered_set.py b/libqtile/ordered_set.py
new file mode 100644
index 0000000..e2e4156
--- /dev/null
+++ b/libqtile/ordered_set.py
@@ -0,0 +1,67 @@
+import collections
+
+class OrderedSet(collections.MutableSet):
+
+ def __init__(self, iterable=None):
+ self.end = end = []
+ end += [None, end, end] # sentinel node for doubly linked list
+ self.map = {} # key --> [key, prev, next]
+ if iterable is not None:
+ self |= iterable
+
+ def __len__(self):
+ return len(self.map)
+
+ def __contains__(self, key):
+ return key in self.map
+
+ def add(self, key):
+ if key not in self.map:
+ end = self.end
+ curr = end[1]
+ curr[2] = end[1] = self.map[key] = [key, curr, end]
+
+ def discard(self, key):
+ if key in self.map:
+ key, prev, next = self.map.pop(key)
+ prev[2] = next
+ next[1] = prev
+
+ def __iter__(self):
+ end = self.end
+ curr = end[2]
+ while curr is not end:
+ yield curr[0]
+ curr = curr[2]
+
+ def __reversed__(self):
+ end = self.end
+ curr = end[1]
+ while curr is not end:
+ yield curr[0]
+ curr = curr[1]
+
+ def pop(self, last=True):
+ if not self:
+ raise KeyError('set is empty')
+ key = self.end[1][0] if last else self.end[2][0]
+ self.discard(key)
+ return key
+
+ def __repr__(self):
+ if not self:
+ return '%s()' % (self.__class__.__name__,)
+ return '%s(%r)' % (self.__class__.__name__, list(self))
+
+ def __eq__(self, other):
+ if isinstance(other, OrderedSet):
+ return len(self) == len(other) and list(self) == list(other)
+ return set(self) == set(other)
+
+
+if __name__ == '__main__':
+ s = OrderedSet('abracadaba')
+ t = OrderedSet('simsalabim')
+ print(s | t)
+ print(s & t)
+ print(s - t)
\ No newline at end of file
diff --git a/libqtile/state.py b/libqtile/state.py
index 5438f38..d0b0103 100644
--- a/libqtile/state.py
+++ b/libqtile/state.py
@@ -31,12 +31,38 @@ class QtileState(object):
# configurations.
self.groups = {}
self.screens = {}
-
+ self.layouts ={}
+ _windows = {}
for group in qtile.groups:
+ _windows[group.name]=list(group.windows)
self.groups[group.name] = group.layout.name
+ self.layouts[group.name] = {}
+ if group.layout.name == 'stack':
+ for indx in range(group.layout.num_stacks):
+ _currentStack = group.layout.stacks[indx]
+ self.layouts[group.name][indx]=([],)
+ if not _currentStack.lst==[]:
+ windowList=[]
+ for window in _currentStack.lst:
+ windowList.append(
+ _windows[group.name].index(window))
+ currentWindow = _windows[group.name].index(_currentStack.cw)
+ self.layouts[group.name][indx] = \
+ (windowList,currentWindow)
+
for index, screen in enumerate(qtile.screens):
self.screens[index] = screen.group.name
-
+
+ def __str__(self):
+ str1= 'Qtile state is:\n'
+ str1+='Groups:\t'+str(self.groups)+'\n'
+ str1+='Screens:\t'+str(self.screens)+'\n'
+ str1+='Layouts:\t'+str(self.layouts)+'\n'
+ return str1
+
+ def __repr__(self):
+ return self.__str__()
+
def apply(self, qtile):
"""
Rearrange the windows in the specified Qtile object according to
@@ -45,8 +71,10 @@ class QtileState(object):
for (group, layout) in self.groups.items():
try:
qtile.groupMap[group].layout = layout
+
except KeyError:
pass # group missing
+
for (screen, group) in self.screens.items():
try:
@@ -54,3 +82,22 @@ class QtileState(object):
qtile.screens[screen].setGroup(group)
except (KeyError, IndexError):
pass # group or screen missing
+
+ for (group, layout) in self.layouts.items():
+ try:
+ _currentGroup = qtile.groupMap[group]
+ _windows = list(_currentGroup.windows)
+ for stackNum in layout.keys():
+ _currentLayout = \
+ _currentGroup.layouts[_currentGroup.currentLayout]
+ if _currentLayout.name == 'stack':
+ for indx in range(_currentLayout.num_stacks):
+ _currentStack = _currentLayout.stacks[indx]
+ _currentStack.lst = \
+ [_windows[i] for i in layout[indx][0]]
+ if not _currentStack.lst==[]:
+ _currentStack.current = layout[indx][1]
+ except (KeyError, KeyError):
+ pass # group or layout missing
+
+
\ No newline at end of file