[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