[Sugar-devel] Fwd: Making activities close from the sugar frame
Bert Freudenberg
bert at freudenbergs.de
Fri Feb 27 05:45:52 EST 2009
If generalized this is perhaps not so bad an idea for sugarizing
regular X apps. The bundle's activity.info could declare a regexp to
match the WM_NAME of a window and Sugar then could associate that
activity with the window (associating a window with an activity
instance is the whole purpose of the SUUGAR_* WM properties). As long
as this also restricts the number of simultaneously running instances
to 1 it should work (because you could not distinguish two different
instances).
This would make the libsugarize hack unnecessary. I like it already :)
- Bert -
On 27.02.2009, at 10:07, Bibek Kafle wrote:
> Hi,
>
> The problem we talked about is mostly fixed now. John Maloney said
> that Scratch is going to handle being closed from the frame from the
> next release. Opening firefox opened two icons on the frame: the
> firefox icon and another black circle. There was a bug filed
> somewhere that said that that was because some X properties were not
> set before the window opened. There was something about how to solve
> this from the activity itself, but I couldn't understand most of it
> so I added the following fucntion to /usr/share/sugar/shell/model/
> homemodel.py and then called it from HomeModel._window_opened_cb()
> (eg. _fix_icons('org.laptop.FirefoxActivity', 'Mozilla Firefox',
> self._activities, window) doing this made the black little circle go
> away, and now closing the firefox icon from the frame works. But I'm
> not sure if this is the best solution.
>
> Thanks
> Bibek
>
> def _fix_icons(reg_exp, wm_name, activities, wnck_window):
> # reg_exp is the regular expression to match the service name
> # wm_name is the value of the WM_NAME property of the X window
> # activities is the collection of the HomeActivity instances
> # wnck_window is the new X window
>
> window = gtk.gdk.window_foreign_new(wnck_window.get_xid())
>
> # Check if the new window is window with wm_name
> if window.property_get('WM_NAME' , 'STRING')[2] == wm_name:
>
> for i in activities:
>
> # find the HomeActivity instance with service name
> matching reg_exp
>
> if i.get_window() is not None:
>
> if re.match(reg_exp, str(i.get_type())) != None:
>
> if str(_get_sugar_window_type(i.get_window()))
> == 'launcher':
>
> # Set sugar specific X properties
>
> window.property_change('_SUGAR_BUNDLE_ID',
> 'STRING', 8, gtk.gdk.PROPERTY_NEW_VALUE, str(i.get_type))
> window.property_change('_SUGAR_ACTIVITY_ID',
> 'STRING', 8, gtk.gdk.PROPERTY_NEW_VALUE, str(i.get_activity_id()))
> window.property_change('_NET_WM_NAME',
> 'STRING', 8, gtk.gdk.PROPERTY_NEW_VALUE, str(i.get_title))
> window.property_change('_NET_WM_PID',
> 'STRING', 8, gtk.gdk.PROPERTY_NEW_VALUE, str(i.get_pid))
> window.property_change('_SUGAR_WINDOW_TYPE',
> 'STRING', 8, gtk.gdk.PROPERTY_NEW_VALUE, 'Firefox')
>
>
>
>
>
> ---------- Forwarded message ----------
> From: Bernie Innocenti <bernie at codewiz.org>
> Date: Wed, Feb 25, 2009 at 3:33 AM
> Subject: Re: Making activities close from the sugar frame
> To: Bibek Kafle <bibek.kafle at olenepal.org>
>
>
> Any particular reason why this is off-list? Can we forward it to
> sugar-devel@ so the other developers can see what we're up to?
>
> Bibek Kafle wrote:
> > Hi,
> > To make firefox and scratch close from the sugar frame I tried to
> change
> > a method in the CurrentActivityPallete class in
> > /usr/sugar/sugar/shell/view/palletes.py to send SIGKILL signal to
> the
> > activity after getting the pid from the HomeActivity object, but it
> > didn't work. The shell log said that the operation was not
> permitted.
>
> It's Rainbow's fault! Activities run with a different UID for
> isolation.
>
>
> > Then I tried to use a c wrapper to make to set setuid for a python
> > script that killed the pid, but it still said that the operation
> was not
> > permitted. Even if that worked, Bryan says that simply killing the
> > process will be dirty because firefox will say that the previous
> session
> > was closed unexpectedly the next time it is run. I'm out of ideas
> now!
>
> Indeed, this is not how gnome and kde close applications.
>
> > Bryan said that you had an idea about how I can go about making
> scratch
> > and firefox close from the sugar frame. He said something about
> making a
> > wrapper that handles X11 close events. How do I do that?
> > Bibek
>
> If you find the XID for the window somwewhere in the activity info
> managed by Sugar, you can send it a window close event.
>
> I'm not sure about the details, but:
>
> - see "man XSendEvent"
>
> - it seems you have to send an event called ClientMessage
> http://tronche.com/gui/x/xlib/events/client-communication/client-message.html
>
> - The ancient ICCCM specification tells what needs to be done
> http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8.1
>
> I would just grab some example code (for example a window manager)
> instead
> of reading through the specs
>
> --
> // Bernie Innocenti - http://www.codewiz.org/
> \X/ Sugar Labs - http://www.sugarlabs.org/
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
More information about the Sugar-devel
mailing list