[Sugar-devel] Fwd: Making activities close from the sugar frame

Bibek Kafle bibek.kafle at olenepal.org
Fri Feb 27 04:07:17 EST 2009


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/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.sugarlabs.org/archive/sugar-devel/attachments/20090227/5c6a2055/attachment.htm 


More information about the Sugar-devel mailing list