Thomas C Gilliard | 1 Nov 2010 05:58
Favicon
Gravatar

Re: [SoaS] Page for listing current Soas-v4 Mango Lassi bugs found on 3 download sites



Matt Wronkiewicz wrote:
What if, instead of concentrating on the nightly builds, we went after the updates to Fedora 15 as they came in? From reading through the past messages to the list, it seems like once someone else breaks something in Fedora core for us, we have a hard time fixing it. Two things would be really helpful for this. One, a page on the wiki explaining how to import a F15 update to a SoaS install. Two, a page detailing the standard procedures for testing SoaS. What do you think? Matt
I did such a test tonight by building a Remix pointed at the rawhide repo.

I used the procedure in:

>    http://wiki.sugarlabs.org/go/Sugar_Creation_Kit#Build_Your_Own_Remix

I edited the fedora-live-mini.ks to point it to the rawhide repo (see fedora-live-mini-rawhide,ks attached)
I edited the fedora-livecd-soas.ks to point to the above modified file.
Soas-v5-31102010-remix.txt is the command used in f14 root terminal to run livecd-creator (livecd-to disk) to build the remix.iso
all three attached files are needed to do this.

This gives me a f15 (rawhide) Soas build.

Rawhide ( f15) now uses systemd ( http://0pointer.de/blog/projects/systemd.html ) a completely new boot system. : /
tonights remix.iso would not get into a graphic boot. startx seems to endlessly cycle. the alternate boot method available is upstart:
At boot*hold <ESC> <TAB> linux0 init=/sbin/upstart
got to an init 3 login: liveuser logged in OK worked but startx failed as well.

You will find that just testing the nightly composes and reporting bugs to the developers is a full time job!

Cordially;

Tom Gilliard
satellit

PS: here are my Soas and remix test results:

Current:
>    http://wiki.sugarlabs.org/go/Talk:Sugar_on_a_Stick_release_process#Test_Matix
Archive of older tests:
>    http://wiki.sugarlabs.org/go/Talk:Features/Soas_V4/Install_Test_Table#Test_results

On Sun, Oct 31, 2010 at 10:54 AM, Thomas C Gilliard <satellit <at> bendbroadband.com> wrote:
Matt; You are correct that Soas-v4-Mango lassi is closed. http://alt.fedoraproject.org/pub/alt/stage/14.RC1/Live/Fedora-14-i686-Live-SoaS/Fedora-14-i686-Live-SoaS.iso Seems to be destined to be destined to be the final version that will be released on nov 3. I assume that the nightly composes will restart soon. The developers working on Sugar need to know what is not working so they can incorporate the fixes for future sugar builds. It is always possible to build your own remix in the meantime. I have been doing this routinely  to see what features are in updates-testing and rawhide. I edit the mini.ks in /usr/share/spin-kickstarts/ to point to these other repos) ( I use a  EeePC1000HE and Acer Aspire One netbook with external usb drives with f13 and f14 installed on them to do this, so a powerful computer is not required)  See:  http://wiki.sugarlabs.org/go/Sugar_Creation_Kit#Build_Your_Own_Remix All testing is valuable. Please contribute if you have the time.. Thanks Tom Gilliard satellit Matt Wronkiewicz wrote: I'd like to help out, but I don't see any benefit to additional testing on v4. If we find bugs, can they be fixed? If we find blocker bugs and they cannot be fixed, can the release be cancelled? I sent an email about this to the SoaS list, but didn't get a response. Matt On Sun, Oct 31, 2010 at 5:11 AM, Thomas C Gilliard <satellit <at> bendbroadband.com> wrote: I have been working on a page that lists current bugs in the  Soas-v4: http://wiki.sugarlabs.org/go/Sugar_on_a_Stick_Bugs#Current_Bugs I have been testing all three current sources: http://alt.fedoraproject.org/pub/alt/stage/14.RC1/Live/Fedora-14-i686-Live-SoaS/Fedora-14-i686-Live-SoaS.iso http://serverbeach1.fedoraproject.org/pub/alt/stage/14.RC1/Live/Fedora-14-i686-Live-SoaS/ http://alt.fedoraproject.org/pub/alt/nightly-composes/soas/ Testing results are listed here: http://wiki.sugarlabs.org/go/Talk:Sugar_on_a_Stick_release_process#Test_Matrix Please comment and participate by contributing to these wiki pages. Thanks Tom Gilliard satellit _______________________________________________ SoaS mailing list SoaS <at> lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/soas
livecd-creator \
 --config=/home/robert/Desktop/spin-kickstarts/fedora-livecd-soas-rawhide.ks \
 --fslabel=Soas-v5 31102010-remix --cache=/var/cache/live
# fedora-live-mini.ks
#
# Defines the basics for all kickstarts in the fedora-mini branch

lang en_US.UTF-8
keyboard us
timezone US/Eastern
auth --useshadow --enablemd5
selinux --permissive
firewall --enabled --service=mdns
xconfig --startxonboot
part / --size 4096 --fstype ext4
services --enabled=NetworkManager,messagebus --disabled=network,sshd

repo --name=rawhide --mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=rawhide&arch=$basearch
repo --name=fedora --mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-14&arch=$basearch
repo --name=updates --mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f14&arch=$basearch
#repo --name=updates-testing --mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-testing-f14&arch=$basearch

%packages
 <at> base-x
 <at> base
 <at> core
 <at> hardware-support
kernel
memtest86+

# implicitly include the fonts we want
liberation-mono-fonts
liberation-sans-fonts
liberation-serif-fonts
google-droid-sans-fonts
google-droid-sans-mono-fonts
google-droid-serif-fonts
dejavu-sans-fonts
dejavu-sans-mono-fonts
dejavu-serif-fonts

# We like noise
alsa-plugins-pulseaudio
alsa-utils
pulseaudio
pulseaudio-module-x11
pulseaudio-utils

# Remove default base packages we don't want
-ccid
-coolkey
-dos2unix
-dump
-finger
-fprintd-pam
-hunspell
-irda-utils
-jwhois
-lftp
-mlocate
-nano
-nc
-nfs-utils
-nss_db
-nss_ldap
-numactl
-pcmciautils
-perf
-pm-utils
-rdate
-rdist
-rsh
-rsync
-sendmail
-sos
-specspo
-stunnel
-system-config-firewall-tui
-system-config-network-tui
-talk
-time
-tree
-words
-ypbind

# Remove default base-x packages we don't want
-cups-pk-helper
-glx-utils
-system-config-date
-system-config-firewall
-system-config-network
-system-config-printer
-system-config-services
-system-config-users

# Remove default unwanted hardware firmware and support we don't want
-foomatic*
-ghostscript*
-ivtv-firmware
-ql2100-firmware
-ql2200-firmware
-ql23xx-firmware
-ql2400-firmware
-ql2500-firmware
# These are listed somewhere other than hardware support!
-irda-utils
-fprintd*

# dictionaries are big
-aspell-*
-hunspell-*
-man-pages*
-words

# livecd bits to set up the livecd and be able to install
anaconda

# Add some useful utils
system-config-firewall-base
gnome-packagekit
powertop
gnupg2
yum-presto
avahi

# Remove sendmail: this needs to be explicit
-sendmail
# But hopefully there shouldn't be deps so this shouldn't need to be there
#ssmtp

%end

%post
# FIXME: it'd be better to get this installed from a package
cat > /etc/rc.d/init.d/livesys << EOF
#!/bin/bash
#
# live: Init script for live image
#
# chkconfig: 345 00 99
# description: Init script for live image.

. /etc/init.d/functions

if ! strstr "\`cat /proc/cmdline\`" liveimg || [ "\$1" != "start" ]; then
    exit 0
fi

if [ -e /.liveimg-configured ] ; then
    configdone=1
fi

exists() {
    which \$1 >/dev/null 2>&1 || return
    \$*
}

touch /.liveimg-configured

# mount live image
if [ -b \`readlink -f /dev/live\` ]; then
   mkdir -p /mnt/live
   mount -o ro /dev/live /mnt/live 2>/dev/null || mount /dev/live /mnt/live
fi

livedir="LiveOS"
for arg in \`cat /proc/cmdline\` ; do
  if [ "\${arg##live_dir=}" != "\${arg}" ]; then
    livedir=\${arg##live_dir=}
    return
  fi
done

# enable swaps unless requested otherwise
swaps=\`blkid -t TYPE=swap -o device\`
if ! strstr "\`cat /proc/cmdline\`" noswap && [ -n "\$swaps" ] ; then
  for s in \$swaps ; do
    action "Enabling swap partition \$s" swapon \$s
  done
fi
if ! strstr "\`cat /proc/cmdline\`" noswap && [ -f /mnt/live/\${livedir}/swap.img ] ; then
  action "Enabling swap file" swapon /mnt/live/\${livedir}/swap.img
fi

mountPersistentHome() {
  # support label/uuid
  if [ "\${homedev##LABEL=}" != "\${homedev}" -o "\${homedev##UUID=}" != "\${homedev}" ]; then
    homedev=\`/sbin/blkid -o device -t "\$homedev"\`
  fi

  # if we're given a file rather than a blockdev, loopback it
  if [ "\${homedev##mtd}" != "\${homedev}" ]; then
    # mtd devs don't have a block device but get magic-mounted with -t jffs2
    mountopts="-t jffs2"
  elif [ ! -b "\$homedev" ]; then
    loopdev=\`losetup -f\`
    if [ "\${homedev##/mnt/live}" != "\${homedev}" ]; then
      action "Remounting live store r/w" mount -o remount,rw /mnt/live
    fi
    losetup \$loopdev \$homedev
    homedev=\$loopdev
  fi

  # if it's encrypted, we need to unlock it
  if [ "\$(/sbin/blkid -s TYPE -o value \$homedev 2>/dev/null)" = "crypto_LUKS" ]; then
    echo
    echo "Setting up encrypted /home device"
    plymouth ask-for-password --command="cryptsetup luksOpen \$homedev EncHome"
    homedev=/dev/mapper/EncHome
  fi

  # and finally do the mount
  mount \$mountopts \$homedev /home
  # if we have /home under what's passed for persistent home, then
  # we should make that the real /home.  useful for mtd device on olpc
  if [ -d /home/home ]; then mount --bind /home/home /home ; fi
  [ -x /sbin/restorecon ] && /sbin/restorecon /home
  if [ -d /home/liveuser ]; then USERADDARGS="-M" ; fi
}

findPersistentHome() {
  for arg in \`cat /proc/cmdline\` ; do
    if [ "\${arg##persistenthome=}" != "\${arg}" ]; then
      homedev=\${arg##persistenthome=}
      return
    fi
  done
}

if strstr "\`cat /proc/cmdline\`" persistenthome= ; then
  findPersistentHome
elif [ -e /mnt/live/\${livedir}/home.img ]; then
  homedev=/mnt/live/\${livedir}/home.img
fi

# if we have a persistent /home, then we want to go ahead and mount it
if ! strstr "\`cat /proc/cmdline\`" nopersistenthome && [ -n "\$homedev" ] ; then
  action "Mounting persistent /home" mountPersistentHome
fi

# make it so that we don't do writing to the overlay for things which
# are just tmpdirs/caches
mount -t tmpfs -o mode=0755 varcacheyum /var/cache/yum
mount -t tmpfs tmp /tmp
mount -t tmpfs vartmp /var/tmp
[ -x /sbin/restorecon ] && /sbin/restorecon /var/cache/yum /tmp /var/tmp >/dev/null 2>&1

if [ -n "\$configdone" ]; then
  exit 0
fi

# add fedora user with no passwd
action "Adding live user" useradd \$USERADDARGS -c "Live System User" liveuser
passwd -d liveuser > /dev/null

# turn off firstboot for livecd boots
chkconfig --level 345 firstboot off 2>/dev/null

# The above doesn't works so we need to do this... GRR systemctl
echo "RUN_FIRSTBOOT=NO" > /etc/sysconfig/firstboot

# don't start yum-updatesd for livecd boots
chkconfig --level 345 yum-updatesd off 2>/dev/null

# turn off mdmonitor by default
chkconfig --level 345 mdmonitor off 2>/dev/null

# turn off setroubleshoot on the live image to preserve resources
chkconfig --level 345 setroubleshoot off 2>/dev/null

# don't do packagekit checking by default
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t string
/apps/gnome-packagekit/frequency_get_updates never >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t string
/apps/gnome-packagekit/frequency_get_upgrades never >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t string
/apps/gnome-packagekit/frequency_refresh_cache never >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/notify_available false >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/notify_distro_upgrades false >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/enable_check_firmware false >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/enable_check_hardware false >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/enable_codec_helper false >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/enable_font_helper false >/dev/null
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/apps/gnome-packagekit/enable_mime_type_helper false >/dev/null

# don't start cron/at as they tend to spawn things which are
# disk intensive that are painful on a live image
chkconfig --level 345 crond off 2>/dev/null
chkconfig --level 345 atd off 2>/dev/null
chkconfig --level 345 readahead_early off 2>/dev/null
chkconfig --level 345 readahead_later off 2>/dev/null

# Stopgap fix for RH #217966; should be fixed in HAL instead
touch /media/.hal-mtab

# workaround clock syncing on shutdown that we don't want (#297421)
sed -i -e 's/hwclock/no-such-hwclock/g' /etc/rc.d/init.d/halt

# and hack so that we eject the cd on shutdown if we're using a CD...
if strstr "\`cat /proc/cmdline\`" CDLABEL= ; then
  cat >> /sbin/halt.local << FOE
#!/bin/bash
# we want to eject the cd on halt, but let's also try to avoid
# io errors due to not being able to get files...
cat /sbin/halt > /dev/null
cat /sbin/reboot > /dev/null
/usr/sbin/eject -p -m \$(readlink -f /dev/live) >/dev/null 2>&1
echo "Please remove the CD from your drive and press Enter to finish restarting"
read -t 30 < /dev/console
FOE
chmod +x /sbin/halt.local
fi

EOF

# bah, hal starts way too late
cat > /etc/rc.d/init.d/livesys-late << EOF
#!/bin/bash
#
# live: Late init script for live image
#
# chkconfig: 345 99 01
# description: Late init script for live image.

. /etc/init.d/functions

if ! strstr "\`cat /proc/cmdline\`" liveimg || [ "\$1" != "start" ] || [ -e /.liveimg-late-configured ] ; then
    exit 0
fi

exists() {
    which \$1 >/dev/null 2>&1 || return
    \$*
}

touch /.liveimg-late-configured

# read some variables out of /proc/cmdline
for o in \`cat /proc/cmdline\` ; do
    case \$o in
    ks=*)
        ks="\${o#ks=}"
        ;;
    xdriver=*)
        xdriver="\${o#xdriver=}"
        ;;
    esac
done

# if liveinst or textinst is given, start anaconda
if strstr "\`cat /proc/cmdline\`" liveinst ; then
   plymouth --quit
   /usr/sbin/liveinst \$ks
fi
if strstr "\`cat /proc/cmdline\`" textinst ; then
   plymouth --quit
   /usr/sbin/liveinst --text \$ks
fi

# configure X, allowing user to override xdriver
if [ -n "\$xdriver" ]; then
   cat > /etc/X11/xorg.conf.d/00-xdriver.conf <<FOE
Section "Device"
	Identifier	"Videocard0"
	Driver	"\$xdriver"
EndSection
FOE
fi

EOF

chmod 755 /etc/rc.d/init.d/livesys
/sbin/restorecon /etc/rc.d/init.d/livesys
/sbin/chkconfig --add livesys

chmod 755 /etc/rc.d/init.d/livesys-late
/sbin/restorecon /etc/rc.d/init.d/livesys-late
/sbin/chkconfig --add livesys-late

# work around for poor key import UI in PackageKit
rm -f /var/lib/rpm/__db*
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora

# go ahead and pre-make the man -k cache (#455968)
/usr/bin/mandb

# save a little bit of space at least...
rm -f /boot/initrd*
# make sure there aren't core files lying around
rm -f /core*

# convince readahead not to collect
rm -f /.readahead_collect
touch /var/lib/readahead/early.sorted

%end

%post
cp $INSTALL_ROOT/usr/share/doc/*-release-*/GPL $LIVE_ROOT/GPL

# only works on x86, x86_64
if [ "$(uname -i)" = "i386" -o "$(uname -i)" = "x86_64" ]; then
  if [ ! -d $LIVE_ROOT/LiveOS ]; then mkdir -p $LIVE_ROOT/LiveOS ; fi
  cp /usr/bin/livecd-iso-to-disk $LIVE_ROOT/LiveOS
fi
%end
# fedora-livecd-soas.ks
#
# Description:
# - A Sugar environment that you can carry in your pocket
#
# Maintainers:
# - Sebastian Dziallas <sdz AT fedoraproject DOT org>
# - Peter Robinson <pbrobinson AT gmail DOT com>
# - Mel Chua <mchua AT fedoraproject DOT org>

%include fedora-live-mini-rawhide.ks

part / --size=2048

%packages

# == Core Sugar Platform ==
sugar

# == Platform Components ==
# from http://wiki.sugarlabs.org/go/0.88/Platform_Components
alsa-plugins-pulseaudio
alsa-utils
etoys
csound-python
evince-djvu
gstreamer-plugins-good
gstreamer-plugins-espeak
gstreamer-plugins-bad-free
pygame
pulseaudio
pulseaudio-utils

# == Sugar Activities ==
sugar-browse # Because they need this to install activities.
sugar-log # Because they need this for debugging.
sugar-physics # Because this is a great demo example (quick demo).
sugar-terminal # Because this makes debugging easier.
sugar-turtleart # Because this is a great demo example (extended demo).
sugar-xoirc # Because this helps us help them.
sugar-chat
sugar-record
sugar-write
etoys-sugar
sugar-pippy
sugar-calculator

# Write breaks unless we do this (we don't need it anyway)
- <at> input-methods

# == Activities from ASLO ==
# These are activities we're going to polish to the same level
# as the ones included in the SoaS image, but encourage people
# to download from ASLO as part of the SoaS experience of exploring
# other Activities in there.

# sugar-maze
# sugar-speak
# sugar-tamtam-*
# sugar-visualmatch

# These are Activities that aren't quite there, but are important,
# so we're going to encourage people to test them.

# sugar-pippy
# sugar-read

# == System ==
# Automatically logs in the liveuser
# We're going to replace this with nodm
# http://bugs.sugarlabs.org/ticket/1849
gdm

# Needed to show external hard drives
gvfs

# Needed for battery monitoring and power management
gnome-power-manager

# Usefulness for DSL connections as per:
# http://bugs.sugarlabs.org/ticket/1951
rp-pppoe
# Useful for SoaS duplication from:
# http://bugs.sugarlabs.org/ticket/74
livecd-tools

# Get the Sugar boot screen
-plymouth-system-theme
-plymouth-theme-charge
sugar-logos

# == Hardware ==
# Lets support Broadcom and XO wifi hardware
b43-openfwwf
libertas-usb8388-firmware

# == Fonts ==
# More font support according to:
# http://bugs.sugarlabs.org/ticket/1119
# Moved to mini.ks

%end

%post

# Rebuild initrd for Sugar boot screen
KERNEL_VERSION=$(rpm -q kernel --qf '%{version}-%{release}.%{arch}\n')
/usr/sbin/plymouth-set-default-theme sugar
/sbin/dracut -f /boot/initramfs-$KERNEL_VERSION.img $KERNEL_VERSION

# Get proper release naming in the control panel
cat >> /boot/olpc_build << EOF
Sugar on a Stick 4 (Mango Lassi)
Fedora 14 (Laughlin)
EOF

cat >> /etc/rc.d/init.d/livesys << EOF

# Don't use the default system user (in SoaS liveuser) as nick name
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t string
/desktop/sugar/user/default_nick disabled >/dev/null

# Disable the logout menu item in Sugar
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/desktop/sugar/show_logout false >/dev/null

# Enable Sugar power management
gconftool-2 --direct --config-source=xml:readwrite:/etc/gconf/gconf.xml.defaults -s -t bool
/desktop/sugar/power/automatic True >/dev/null

# Add our activities to the favorites
cat > /usr/share/sugar/data/activities.defaults << FOE
org.laptop.AbiWordActivity
org.laptop.Chat
org.laptop.Log
org.laptop.physics
org.laptop.RecordActivity
org.laptop.Terminal
org.laptop.TurtleArtActivity
org.laptop.WebActivity
org.laptop.Pippy
org.laptop.Calculator
org.sugarlabs.IRC
org.vpri.EtoysActivity
FOE

# Set up auto-login for for liveuser
cat >> /etc/gdm/custom.conf << FOE
[daemon]
AutomaticLoginEnable=true
AutomaticLogin=liveuser
FOE

EOF

%end
_______________________________________________
Sugar-devel mailing list
Sugar-devel <at> lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel
Peter Robinson | 1 Nov 2010 09:44
Picon

Re: [SoaS] Page for listing current Soas-v4 Mango Lassi bugs found on 3 download sites

Matt,

Would be nice if you sent these queries directly to the mailing list
for all to see.

> Matt Wronkiewicz wrote:
>
> What if, instead of concentrating on the nightly builds, we went after
> the updates to Fedora 15 as they came in? From reading through the
> past messages to the list, it seems like once someone else breaks
> something in Fedora core for us, we have a hard time fixing it. Two
> things would be really helpful for this. One, a page on the wiki
> explaining how to import a F15 update to a SoaS install. Two, a page
> detailing the standard procedures for testing SoaS. What do you think?

No that's not the case at all. If there is a bug that needs to be
fixed in SoaSv4/Fedora 14 we'll explicitly push an update to fix that.
It will be in the testing repository for a period of time to ensure
nothing breaks and the move to the stable updates repository. From
there if you have installed the live image to disk you can do a "yum
update" to pull in those fixes.

Peter
Thomas C Gilliard | 1 Nov 2010 10:13
Favicon
Gravatar

Report: USR installed to a fresh Ubuntu 10.10 install

Tonight I installed Ubuntu 10.10 on a 250 GB USB external Drive.
I then used the command:
sudo apt-get install ubuntu-sugar-remix

Started sugar-emulator from the menu education/sugar  ( I moved the icon 
onto the desktop with a right click, then edited it's properties so the 
command line was
"sugar-emulator -f" (full screen)  >added -f <

I also logged in to USR from the gdm login bar both showed same testing 
results.

Build: Ubuntu 10.10
Sugar: 0.88.1

Testing:

1-)Firefox 6
the forefox application starts and runs well.  when you hit File/Quit to 
exit. there remains a pulsing icon on screen for a minute or so before 
getting a message:
"Firefox failed to start (stop) "
which when selected stops the application. (It has not been sugarized 
properly)

This is the sugar-log for firefox:
==========================================
(process:4710): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.

(firefox-bin:4710): Gdk-WARNING **: locale not supported by C library

(firefox-bin:4710): GnomeUI-WARNING **: While connecting to session 
manager:
None of the authentication protocols specified are supported.

(process:4710): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.

(firefox-bin:4710): Gdk-WARNING **: locale not supported by C library

(firefox-bin:4710): GnomeUI-WARNING **: While connecting to session 
manager:
None of the authentication protocols specified are supported.

(process:4710): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.

(firefox-bin:4710): Gdk-WARNING **: locale not supported by C library

(firefox-bin:4710): GnomeUI-WARNING **: While connecting to session 
manager:
None of the authentication protocols specified are supported.
Exited with status 0, pid 4702 data (None, <open file '<fdopen>', mode 
'w' at 0x98864f0>, '7d17d45d57f102c3b826b835c8af332a0b43b949')

2-)Read-78
Read failed to start (stop)

3-)Record-82
no sound in hp pavillion laptop

4-)Pippy-36
Graphics & sound sections
error:"no module named pippy"

Tom Gilliard
satellit
Mike Dawson | 1 Nov 2010 11:18
Picon

Appearance Customization

Hi All,

Following on from:

http://codewiz.org/wiki/blog/2010/03#mon-mar-8--children-want-sugar-084-for-the-wrong-reasons

The most popular request on the ground here follows from the same
thing that kids will do with any device that they feel ownership of:
let's make it colourful.  It would be great if they could choose their
own colours for the grays that are currently around at the moment.
Wallpaper would be great as well - particularly if they could take
that from their image activities in the journal for example.  That
said just having their own choice of colours would put a smile on a
lot of faces around here.  That was even the number one remark of the
prev deputy minister of teacher training and curriculum!

I know it sounds hollow - but from the field here in Afghanistan:

1. Appearances matter quite a lot more in the east than they do in the
west.  If you look back at western history many things used to be
fancier.  If it doesn't look nice it's obvious no one has put any
effort into it and it's not that great.  There are so many more
coloured car lights, xmas lights in trees all year, etc etc.  That's
the culture.

2. For kids / child ownership - kids putting stickers on things should
be a hint!  It's also a great way to let kids show off their paint /
photo creations etc.  Kids want to make things their own - so this
would seem appropriate.

Does anyone have any rough estimates on what it would take to get this
done?  Unfortunately I'm too busy with EXE development to facilitate
content at the moment to have the chance right now (new version of
that with math drills, reading exercises, crossword and more in the
works there).  I think most people in deployments would agree that
this feature ranks consistently highly and surely would be just a
matter of making a control panel app, a couple gconf keys, and a
little bit of hacking the gtk theme I guess.

I'd also be willing to put up for a bounty.  Any others with me on
that?  I put $200 on the table right now.

Regards,

-Mike
James Cameron | 1 Nov 2010 12:02
Favicon

Re: Appearance Customization

On Mon, Nov 01, 2010 at 02:48:57PM +0430, Mike Dawson wrote:
> let's make it colourful.  It would be great if they could choose their
> own colours for the grays that are currently around at the moment.

Between three and 15 hours work, to add a control panel for configuring
those colours, and then another six to 15 hours to find every relevant
place and change it to use 'em.

> Wallpaper would be great as well - particularly if they could take
> that from their image activities in the journal for example.

Between two and six hours work.

Then add about 50 hours if you want it upstreamed.  ;-)

> Does anyone have any rough estimates on what it would take to get this
> done?

My estimates are particularly rough.  Others with greater understanding
of the code might do better.

> I'd also be willing to put up for a bounty.  Any others with me on
> that?  I put $200 on the table right now.

There's a software bounty tracking web site somewhere.  Can't remember
where though.

--

-- 
James Cameron
http://quozl.linux.org.au/
Mike Dawson | 1 Nov 2010 12:28
Picon

Re: Appearance Customization

Is that bountysource.com ?  I guess this looks like we're talking
about a week of work to get it done.  I will check out these bounty
sites this evening - but mine is up there?  Other deployments?  We all
want it... Isn't $100 if you're on the ground pretty good value just
for the peace and quiet time we can get by people playing with their
colours instead of complaining about this one?

Regards,

-Mike

On Mon, Nov 1, 2010 at 3:32 PM, James Cameron <quozl <at> laptop.org> wrote:
> On Mon, Nov 01, 2010 at 02:48:57PM +0430, Mike Dawson wrote:
>> let's make it colourful.  It would be great if they could choose their
>> own colours for the grays that are currently around at the moment.
>
> Between three and 15 hours work, to add a control panel for configuring
> those colours, and then another six to 15 hours to find every relevant
> place and change it to use 'em.
>
>> Wallpaper would be great as well - particularly if they could take
>> that from their image activities in the journal for example.
>
> Between two and six hours work.
>
> Then add about 50 hours if you want it upstreamed.  ;-)
>
>> Does anyone have any rough estimates on what it would take to get this
>> done?
>
> My estimates are particularly rough.  Others with greater understanding
> of the code might do better.
>
>> I'd also be willing to put up for a bounty.  Any others with me on
>> that?  I put $200 on the table right now.
>
> There's a software bounty tracking web site somewhere.  Can't remember
> where though.
>
> --
> James Cameron
> http://quozl.linux.org.au/
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel <at> lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
>
_______________________________________________
Sugar-devel mailing list
Sugar-devel <at> lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel
Anish Mangal | 1 Nov 2010 12:36
Favicon

[PATCH 1/2] Revert to original layout (<=v35) for Sugar <=0.84

From: anishmangal2002 <anishmangal2002 <at> gmail.com>

Signed-off-by: Anish Mangal <anish <at> sugarlabs.org>
---
 pippy_app.py |  263 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 190 insertions(+), 73 deletions(-)

diff --git a/pippy_app.py b/pippy_app.py
index fc8aaaa..ed8ee24 100644
--- a/pippy_app.py
+++ b/pippy_app.py
 <at>  <at>  -34,8 +34,24  <at>  <at>  from activity import ViewSourceActivity, TARGET_TYPE_TEXT
 from sugar.activity.activity import ActivityToolbox, \
      get_bundle_path, get_bundle_name
 from sugar.graphics import style
+
 from sugar.graphics.toolbutton import ToolButton

+_ORIGINAL_PIPPY_LAYOUT = False
+
+try:
+    # >= 0.86 toolbars
+    from sugar.graphics.toolbarbox import ToolbarButton, ToolbarBox
+    from sugar.activity.widgets import _create_activity_icon
+    from sugar.activity.widgets import ActivityButton, ActivityToolbar
+    from sugar.activity.widgets import TitleEntry
+    from sugar.activity.widgets import StopButton
+    from sugar.activity.widgets import ShareButton
+    from sugar.activity.widgets import KeepButton
+except ImportError:
+    # <= 0.84 toolbars
+    _ORIGINAL_PIPPY_LAYOUT = True
+
 import groupthink.sugar_tools
 import groupthink.gtk_tools

 <at>  <at>  -51,6 +67,20  <at>  <at>  SIZE_Y = gtk.gdk.screen_height()

 groupthink_mimetype = 'pickle/groupthink-pippy'

+if _ORIGINAL_PIPPY_LAYOUT == False:
+    # modded ActivityToolbarButton which has its toolbar object public
+    class ActivityToolbarButton(ToolbarButton):
+
+        def __init__(self, activity, **kwargs):
+            self.toolbar = ActivityToolbar(activity, orientation_left=True)
+            self.toolbar.stop.hide()
+
+            ToolbarButton.__init__(self, page=self.toolbar, **kwargs)
+
+            icon = _create_activity_icon(activity.metadata)
+            self.set_icon_widget(icon)
+            icon.show()
+
 class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
     """Pippy Activity as specified in activity.info"""
     def early_setup(self):
 <at>  <at>  -61,79 +91,159  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
     def initialize_display(self):
         self._logger = logging.getLogger('pippy-activity')

-        # Top toolbar with share and close buttons:
-        toolbox = ActivityToolbox(self)
-        activity_toolbar = toolbox.get_activity_toolbar()
-        # add 'make bundle' entry to 'keep' palette.
-        palette = toolbox.get_activity_toolbar().keep.get_palette()
-        # XXX: should clear out old palette entries?
-        from sugar.graphics.menuitem import MenuItem
-        from sugar.graphics.icon import Icon
-        menu_item = MenuItem(_('As Pippy Document'))
-        menu_item.set_image(Icon(file=('%s/activity/activity-icon.svg' % get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
-        menu_item.connect('activate', self.keepbutton_cb)
-        palette.menu.append(menu_item)
-        menu_item.show()
-        menu_item = MenuItem(_('As Activity Bundle'))
-        menu_item.set_image(Icon(file=('%s/activity/activity-default.svg' % get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
-        menu_item.connect('activate', self.makebutton_cb)
-        palette.menu.append(menu_item)
-        menu_item.show()
-
-        # The "go" button
-        goicon_bw = gtk.Image()
-        goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd())
-        goicon_color = gtk.Image()
-        goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd())
-        gobutton = ToolButton(label=_("_Run!"))
-        gobutton.props.accelerator = _('<alt>r')
-        gobutton.set_icon_widget(goicon_bw)
-        gobutton.set_tooltip("Run")
-        gobutton.connect('clicked', self.flash_cb, dict({'bw':goicon_bw,
-            'color':goicon_color}))
-        gobutton.connect('clicked', self.gobutton_cb)
-        activity_toolbar.insert(gobutton, 2)
-
-        # The "stop" button
-        stopicon_bw = gtk.Image()
-        stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd())
-        stopicon_color = gtk.Image()
-        stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd())
-        stopbutton = ToolButton(label=_("_Stop"))
-        stopbutton.props.accelerator = _('<alt>s')
-        stopbutton.set_icon_widget(stopicon_bw)
-        stopbutton.connect('clicked', self.flash_cb, dict({'bw':stopicon_bw,
-            'color':stopicon_color}))
-        stopbutton.connect('clicked', self.stopbutton_cb)
-        stopbutton.set_tooltip("Stop Running")
-        activity_toolbar.insert(stopbutton, 3)
-
-        # The "clear" button
-        clearicon_bw = gtk.Image()
-        clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd())
-        clearicon_color = gtk.Image()
-        clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd())
-        clearbutton = ToolButton(label=_("_Clear"))
-        clearbutton.props.accelerator = _('<alt>c')
-        clearbutton.set_icon_widget(clearicon_bw)
-        clearbutton.connect('clicked', self.clearbutton_cb)
-        clearbutton.connect('clicked', self.flash_cb, dict({'bw':clearicon_bw,
-            'color':clearicon_color}))
-        clearbutton.set_tooltip("Clear")
-        activity_toolbar.insert(clearbutton, 4)
-
-        # A vertical toolbar separator
-        separator = gtk.SeparatorToolItem()
-        separator.set_draw(True)
-        activity_toolbar.insert(separator, 5)
-        activity_toolbar.show_all()
-
-        self.set_toolbox(toolbox)
-        toolbox.show()
+        # A homogeneous table used for packing buttons so that they
+        # resize without any pains
+        self._table = gtk.Table()
+        self._table.set_homogeneous(True)
+
+        if not _ORIGINAL_PIPPY_LAYOUT:
+            # >= 0.86 toolbars
+            toolbar_box = ToolbarBox()
+            activity_button = ActivityToolbarButton(self)
+            toolbar_box.toolbar.insert(activity_button, 0)
+
+            separator = gtk.SeparatorToolItem()
+            toolbar_box.toolbar.insert(separator, -1)
+
+            # The "go" button
+            goicon_bw = gtk.Image()
+            goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd())
+            goicon_color = gtk.Image()
+            goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd())
+            gobutton = ToolButton(label=_("_Run!"))
+            gobutton.props.accelerator = _('<alt>r')
+            gobutton.set_icon_widget(goicon_bw)
+            gobutton.set_tooltip("Run")
+            gobutton.connect('clicked', self.flash_cb, dict({'bw':goicon_bw,
+                'color':goicon_color}))
+            gobutton.connect('clicked', self.gobutton_cb)
+            toolbar_box.toolbar.insert(gobutton, -1)
+            gobutton.show()
+
+            # The "stop" button
+            stopicon_bw = gtk.Image()
+            stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd())
+            stopicon_color = gtk.Image()
+            stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd())
+            stopbutton = ToolButton(label=_("_Stop"))
+            stopbutton.props.accelerator = _('<alt>s')
+            stopbutton.set_icon_widget(stopicon_bw)
+            stopbutton.connect('clicked', self.flash_cb, dict({'bw':stopicon_bw,
+                'color':stopicon_color}))
+            stopbutton.connect('clicked', self.stopbutton_cb)
+            stopbutton.set_tooltip("Stop Running")
+            toolbar_box.toolbar.insert(stopbutton, -1)
+            stopbutton.show()
+
+            # The "clear" button
+            clearicon_bw = gtk.Image()
+            clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd())
+            clearicon_color = gtk.Image()
+            clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd())
+            clearbutton = ToolButton(label=_("_Clear"))
+            clearbutton.props.accelerator = _('<alt>c')
+            clearbutton.set_icon_widget(clearicon_bw)
+            clearbutton.connect('clicked', self.flash_cb, dict({'bw':clearicon_bw,
+                'color':clearicon_color}))
+            clearbutton.connect('clicked', self.clearbutton_cb)
+            clearbutton.set_tooltip("Clear")
+            toolbar_box.toolbar.insert(clearbutton, -1)
+            clearbutton.show()
+
+            # add 'make bundle' entry to 'keep' palette.
+            palette = activity_button.toolbar.keep.get_palette()
+            # XXX: should clear out old palette entries?
+            from sugar.graphics.menuitem import MenuItem
+            from sugar.graphics.icon import Icon
+            menu_item = MenuItem(_('As Pippy Document'))
+            menu_item.set_image(Icon(file=('%s/activity/activity-icon.svg' % get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
+            menu_item.connect('activate', self.keepbutton_cb)
+            palette.menu.append(menu_item)
+            menu_item.show()
+            menu_item = MenuItem(_('As Activity Bundle'))
+            menu_item.set_image(Icon(file=('%s/activity/activity-default.svg' % get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
+            menu_item.connect('activate', self.makebutton_cb)
+            palette.menu.append(menu_item)
+            menu_item.show()
+
+            separator = gtk.SeparatorToolItem()
+            separator.props.draw = False
+            separator.set_expand(True)
+            toolbar_box.toolbar.insert(separator, -1)
+
+            stop = StopButton(self)
+            toolbar_box.toolbar.insert(stop, -1)
+            self.set_toolbox(toolbar_box)
+            toolbar_box.show()
+
+        else:
+            # <= 0.84 toolbars
+            # Top toolbar with share and close buttons:
+            toolbox = ActivityToolbox(self)
+            # add 'make bundle' entry to 'keep' palette.
+            palette = toolbox.get_activity_toolbar().keep.get_palette()
+            # XXX: should clear out old palette entries?
+            from sugar.graphics.menuitem import MenuItem
+            from sugar.graphics.icon import Icon
+            menu_item = MenuItem(_('As Pippy Document'))
+            menu_item.set_image(Icon(file=('%s/activity/activity-icon.svg' % get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
+            menu_item.connect('activate', self.keepbutton_cb)
+            palette.menu.append(menu_item)
+            menu_item.show()
+            menu_item = MenuItem(_('As Activity Bundle'))
+            menu_item.set_image(Icon(file=('%s/activity/activity-default.svg' % get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
+            menu_item.connect('activate', self.makebutton_cb)
+            palette.menu.append(menu_item)
+            menu_item.show()
+
+            # The "go" button
+            goicon_bw = gtk.Image()
+            goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd())
+            goicon_color = gtk.Image()
+            goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd())
+            gobutton = gtk.Button(label=_("_Run!"))
+            gobutton.set_image(goicon_bw)
+            gobutton.connect('clicked', self.flash_cb, dict({'bw':goicon_bw,
+                'color':goicon_color}))
+            gobutton.connect('clicked', self.gobutton_cb)
+            self._table.attach(gobutton, 0, 2, 0, 1)
+
+            # The "clear" button
+            clearicon_bw = gtk.Image()
+            clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd())
+            clearicon_color = gtk.Image()
+            clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd())
+            clearbutton = gtk.Button(label=_("_Clear!"))
+            clearbutton.set_image(clearicon_bw)
+            clearbutton.connect('clicked', self.flash_cb, dict({'bw':clearicon_bw,
+                'color':clearicon_color}))
+            clearbutton.connect('clicked', self.clearbutton_cb)
+            self._table.attach(clearbutton, 2, 3, 0, 1)
+
+            # The "stop" button
+            stopicon_bw = gtk.Image()
+            stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd())
+            stopicon_color = gtk.Image()
+            stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd())
+            stopbutton = gtk.Button(label=_("_Stop!"))
+            stopbutton.set_image(stopicon_bw)
+            stopbutton.connect('clicked', self.flash_cb, dict({'bw':stopicon_bw,
+                'color':stopicon_color}))
+            stopbutton.connect('clicked', self.stopbutton_cb)
+            self._table.attach(stopbutton, 3, 4, 0, 1)
+
+            self.set_toolbox(toolbox)
+            toolbox.show()
+            activity_toolbar = toolbox.get_activity_toolbar()
+            activity_toolbar.share.props.visible = False

         # Main layout.
         self.hpane = gtk.HPaned()
         self.vpane = gtk.VPaned()
+        # Vbox for vertically placing the gtksourceview and old pippy
+        # layout buttons (if needed)
+        self._vbox = gtk.VBox()
+        self._vbox.set_size_request(0, int(SIZE_Y * 0.5))

         # The sidebar.
         self.sidebar = gtk.VBox()
 <at>  <at>  -191,7 +301,6  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):

         # The GTK source view window
         self.text_view = gtksourceview2.View(text_buffer)
-        self.text_view.set_size_request(0, int(SIZE_Y * 0.5))
         self.text_view.set_editable(True)
         self.text_view.set_cursor_visible(True)
         self.text_view.set_show_line_numbers(True)
 <at>  <at>  -211,7 +320,9  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
         codesw.set_policy(gtk.POLICY_AUTOMATIC,
                       gtk.POLICY_AUTOMATIC)
         codesw.add(self.text_view)
-        self.vpane.add1(codesw)
+        self._vbox.pack_start(codesw)
+        self._vbox.pack_start(self._table, expand=False, fill=False)
+        self.vpane.add1(self._vbox)

         # An hbox to hold the vte window and its scrollbar.
         outbox = gtk.HBox()
 <at>  <at>  -263,12 +374,18  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
         self.text_view.grab_focus()

     def timer_cb(self, button, icons):
-        button.set_icon_widget(icons['bw'])
+        if not _ORIGINAL_PIPPY_LAYOUT:
+            button.set_icon_widget(icons['bw'])
+        else:
+            button.set_image(icons['bw'])
         button.show_all()
         return False

     def flash_cb(self, button, icons):
-        button.set_icon_widget(icons['color'])
+        if not _ORIGINAL_PIPPY_LAYOUT:
+            button.set_icon_widget(icons['color'])
+        else:
+            button.set_image(icons['color'])
         button.show_all()
         gobject.timeout_add(400, self.timer_cb, button, icons)

--

-- 
1.7.2.3
Anish Mangal | 1 Nov 2010 12:37
Favicon

[PATCH 2/2] Pippy: add edit toolbar

This patch adds the standard edit toolbar to the Pippy layout.
If the activity is not shared, all four toolbar buttons, i.e.
copy, paste, undo, redo will be active. However, if an activity
is shared, the undo and redo buttons are made insensitive. This
is due an issue with undo/redoing that is yet to be debugged
more extensively.

TODO: Open a bug report and mention bug-id here.

Signed-off-by: Anish Mangal <anish <at> sugarlabs.org>
---
 pippy_app.py |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/pippy_app.py b/pippy_app.py
index ed8ee24..96feb46 100644
--- a/pippy_app.py
+++ b/pippy_app.py
 <at>  <at>  -31,6 +31,7  <at>  <at>  from signal import SIGTERM
 from gettext import gettext as _

 from activity import ViewSourceActivity, TARGET_TYPE_TEXT
+from sugar.activity import activity
 from sugar.activity.activity import ActivityToolbox, \
      get_bundle_path, get_bundle_name
 from sugar.graphics import style
 <at>  <at>  -102,6 +103,14  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
             activity_button = ActivityToolbarButton(self)
             toolbar_box.toolbar.insert(activity_button, 0)

+            self._edit_toolbar = activity.EditToolbar()
+            edit_toolbar_button = ToolbarButton()
+            edit_toolbar_button.props.page = self._edit_toolbar
+            edit_toolbar_button.props.icon_name = 'toolbar-edit'
+            edit_toolbar_button.props.label = _('Edit')
+            toolbar_box.toolbar.insert(edit_toolbar_button, -1)
+            self._edit_toolbar.show()
+
             separator = gtk.SeparatorToolItem()
             toolbar_box.toolbar.insert(separator, -1)

 <at>  <at>  -180,6 +189,11  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
             # <= 0.84 toolbars
             # Top toolbar with share and close buttons:
             toolbox = ActivityToolbox(self)
+
+            self._edit_toolbar = activity.EditToolbar()
+            toolbox.add_toolbar(_('Edit'), self._edit_toolbar)
+            self._edit_toolbar.show()
+
             # add 'make bundle' entry to 'keep' palette.
             palette = toolbox.get_activity_toolbar().keep.get_palette()
             # XXX: should clear out old palette entries?
 <at>  <at>  -237,6 +251,11  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
             activity_toolbar = toolbox.get_activity_toolbar()
             activity_toolbar.share.props.visible = False

+        self._edit_toolbar.undo.connect('clicked', self.undobutton_cb)
+        self._edit_toolbar.redo.connect('clicked', self.redobutton_cb)
+        self._edit_toolbar.copy.connect('clicked', self.copybutton_cb)
+        self._edit_toolbar.paste.connect('clicked', self.pastebutton_cb)
+
         # Main layout.
         self.hpane = gtk.HPaned()
         self.vpane = gtk.VPaned()
 <at>  <at>  -352,6 +371,12  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
         return self.hpane

     def when_shared(self):
+        # HACK : There are issues with undo/redoing while in shared
+        # mode. So disable the 'undo' and 'redo' buttons when the activity
+        # is shared.
+        self._edit_toolbar.undo.set_sensitive(False)
+        self._edit_toolbar.redo.set_sensitive(False)
+
         self.hpane.remove(self.hpane.get_child1())
         global text_buffer
         self.cloud.sharefield = groupthink.gtk_tools.TextBufferSharePoint(text_buffer)
 <at>  <at>  -414,6 +439,24  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
         self._vte.grab_focus()
         self._vte.feed("\x1B[H\x1B[J\x1B[0;39m")

+    def undobutton_cb(self, button):
+        global text_buffer
+        if text_buffer.can_undo():
+            text_buffer.undo()
+
+    def redobutton_cb(self, button):
+        global text_buffer
+        if text_buffer.can_redo():
+            text_buffer.redo()
+
+    def copybutton_cb(self, button):
+        global text_buffer
+        text_buffer.copy_clipboard(gtk.Clipboard())
+
+    def pastebutton_cb(self, button):
+        global text_buffer
+        text_buffer.paste_clipboard(gtk.Clipboard(), None, True)
+
     def gobutton_cb(self, button):
         from shutil import copy2
         self.stopbutton_cb(button) # try stopping old code first.
--

-- 
1.7.2.3
Anish Mangal | 1 Nov 2010 12:46
Picon
Gravatar

Re: [PATCH 1/2] Revert to original layout (<=v35) for Sugar <=0.84

I've test-driven this on 0.84-xo1 (os301) and 0.90-jhbuild and it
seems to work on both.
The same also applies to "[PATCH 2/2] Pippy: add edit toolbar".	

On Mon, Nov 1, 2010 at 5:06 PM, Anish Mangal <anish <at> sugarlabs.org> wrote:
> From: anishmangal2002 <anishmangal2002 <at> gmail.com>
>
> Signed-off-by: Anish Mangal <anish <at> sugarlabs.org>
> ---
>  pippy_app.py |  263 ++++++++++++++++++++++++++++++++++++++++++----------------
>  1 files changed, 190 insertions(+), 73 deletions(-)
>
> diff --git a/pippy_app.py b/pippy_app.py
> index fc8aaaa..ed8ee24 100644
> --- a/pippy_app.py
> +++ b/pippy_app.py
>  <at>  <at>  -34,8 +34,24  <at>  <at>  from activity import ViewSourceActivity, TARGET_TYPE_TEXT
>  from sugar.activity.activity import ActivityToolbox, \
>      get_bundle_path, get_bundle_name
>  from sugar.graphics import style
> +
>  from sugar.graphics.toolbutton import ToolButton
>
> +_ORIGINAL_PIPPY_LAYOUT = False
> +
> +try:
> +    # >= 0.86 toolbars
> +    from sugar.graphics.toolbarbox import ToolbarButton, ToolbarBox
> +    from sugar.activity.widgets import _create_activity_icon
> +    from sugar.activity.widgets import ActivityButton, ActivityToolbar
> +    from sugar.activity.widgets import TitleEntry
> +    from sugar.activity.widgets import StopButton
> +    from sugar.activity.widgets import ShareButton
> +    from sugar.activity.widgets import KeepButton
> +except ImportError:
> +    # <= 0.84 toolbars
> +    _ORIGINAL_PIPPY_LAYOUT = True
> +
>  import groupthink.sugar_tools
>  import groupthink.gtk_tools
>
>  <at>  <at>  -51,6 +67,20  <at>  <at>  SIZE_Y = gtk.gdk.screen_height()
>
>  groupthink_mimetype = 'pickle/groupthink-pippy'
>
> +if _ORIGINAL_PIPPY_LAYOUT == False:
> +    # modded ActivityToolbarButton which has its toolbar object public
> +    class ActivityToolbarButton(ToolbarButton):
> +
> +        def __init__(self, activity, **kwargs):
> +            self.toolbar = ActivityToolbar(activity, orientation_left=True)
> +            self.toolbar.stop.hide()
> +
> +            ToolbarButton.__init__(self, page=self.toolbar, **kwargs)
> +
> +            icon = _create_activity_icon(activity.metadata)
> +            self.set_icon_widget(icon)
> +            icon.show()
> +
>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
>     """Pippy Activity as specified in activity.info"""
>     def early_setup(self):
>  <at>  <at>  -61,79 +91,159  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
>     def initialize_display(self):
>         self._logger = logging.getLogger('pippy-activity')
>
> -        # Top toolbar with share and close buttons:
> -        toolbox = ActivityToolbox(self)
> -        activity_toolbar = toolbox.get_activity_toolbar()
> -        # add 'make bundle' entry to 'keep' palette.
> -        palette = toolbox.get_activity_toolbar().keep.get_palette()
> -        # XXX: should clear out old palette entries?
> -        from sugar.graphics.menuitem import MenuItem
> -        from sugar.graphics.icon import Icon
> -        menu_item = MenuItem(_('As Pippy Document'))
> -        menu_item.set_image(Icon(file=('%s/activity/activity-icon.svg' %
get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
> -        menu_item.connect('activate', self.keepbutton_cb)
> -        palette.menu.append(menu_item)
> -        menu_item.show()
> -        menu_item = MenuItem(_('As Activity Bundle'))
> -        menu_item.set_image(Icon(file=('%s/activity/activity-default.svg' %
get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
> -        menu_item.connect('activate', self.makebutton_cb)
> -        palette.menu.append(menu_item)
> -        menu_item.show()
> -
> -        # The "go" button
> -        goicon_bw = gtk.Image()
> -        goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd())
> -        goicon_color = gtk.Image()
> -        goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd())
> -        gobutton = ToolButton(label=_("_Run!"))
> -        gobutton.props.accelerator = _('<alt>r')
> -        gobutton.set_icon_widget(goicon_bw)
> -        gobutton.set_tooltip("Run")
> -        gobutton.connect('clicked', self.flash_cb, dict({'bw':goicon_bw,
> -            'color':goicon_color}))
> -        gobutton.connect('clicked', self.gobutton_cb)
> -        activity_toolbar.insert(gobutton, 2)
> -
> -        # The "stop" button
> -        stopicon_bw = gtk.Image()
> -        stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd())
> -        stopicon_color = gtk.Image()
> -        stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd())
> -        stopbutton = ToolButton(label=_("_Stop"))
> -        stopbutton.props.accelerator = _('<alt>s')
> -        stopbutton.set_icon_widget(stopicon_bw)
> -        stopbutton.connect('clicked', self.flash_cb, dict({'bw':stopicon_bw,
> -            'color':stopicon_color}))
> -        stopbutton.connect('clicked', self.stopbutton_cb)
> -        stopbutton.set_tooltip("Stop Running")
> -        activity_toolbar.insert(stopbutton, 3)
> -
> -        # The "clear" button
> -        clearicon_bw = gtk.Image()
> -        clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd())
> -        clearicon_color = gtk.Image()
> -        clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd())
> -        clearbutton = ToolButton(label=_("_Clear"))
> -        clearbutton.props.accelerator = _('<alt>c')
> -        clearbutton.set_icon_widget(clearicon_bw)
> -        clearbutton.connect('clicked', self.clearbutton_cb)
> -        clearbutton.connect('clicked', self.flash_cb, dict({'bw':clearicon_bw,
> -            'color':clearicon_color}))
> -        clearbutton.set_tooltip("Clear")
> -        activity_toolbar.insert(clearbutton, 4)
> -
> -        # A vertical toolbar separator
> -        separator = gtk.SeparatorToolItem()
> -        separator.set_draw(True)
> -        activity_toolbar.insert(separator, 5)
> -        activity_toolbar.show_all()
> -
> -        self.set_toolbox(toolbox)
> -        toolbox.show()
> +        # A homogeneous table used for packing buttons so that they
> +        # resize without any pains
> +        self._table = gtk.Table()
> +        self._table.set_homogeneous(True)
> +
> +        if not _ORIGINAL_PIPPY_LAYOUT:
> +            # >= 0.86 toolbars
> +            toolbar_box = ToolbarBox()
> +            activity_button = ActivityToolbarButton(self)
> +            toolbar_box.toolbar.insert(activity_button, 0)
> +
> +            separator = gtk.SeparatorToolItem()
> +            toolbar_box.toolbar.insert(separator, -1)
> +
> +            # The "go" button
> +            goicon_bw = gtk.Image()
> +            goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd())
> +            goicon_color = gtk.Image()
> +            goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd())
> +            gobutton = ToolButton(label=_("_Run!"))
> +            gobutton.props.accelerator = _('<alt>r')
> +            gobutton.set_icon_widget(goicon_bw)
> +            gobutton.set_tooltip("Run")
> +            gobutton.connect('clicked', self.flash_cb, dict({'bw':goicon_bw,
> +                'color':goicon_color}))
> +            gobutton.connect('clicked', self.gobutton_cb)
> +            toolbar_box.toolbar.insert(gobutton, -1)
> +            gobutton.show()
> +
> +            # The "stop" button
> +            stopicon_bw = gtk.Image()
> +            stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd())
> +            stopicon_color = gtk.Image()
> +            stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd())
> +            stopbutton = ToolButton(label=_("_Stop"))
> +            stopbutton.props.accelerator = _('<alt>s')
> +            stopbutton.set_icon_widget(stopicon_bw)
> +            stopbutton.connect('clicked', self.flash_cb, dict({'bw':stopicon_bw,
> +                'color':stopicon_color}))
> +            stopbutton.connect('clicked', self.stopbutton_cb)
> +            stopbutton.set_tooltip("Stop Running")
> +            toolbar_box.toolbar.insert(stopbutton, -1)
> +            stopbutton.show()
> +
> +            # The "clear" button
> +            clearicon_bw = gtk.Image()
> +            clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd())
> +            clearicon_color = gtk.Image()
> +            clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd())
> +            clearbutton = ToolButton(label=_("_Clear"))
> +            clearbutton.props.accelerator = _('<alt>c')
> +            clearbutton.set_icon_widget(clearicon_bw)
> +            clearbutton.connect('clicked', self.flash_cb, dict({'bw':clearicon_bw,
> +                'color':clearicon_color}))
> +            clearbutton.connect('clicked', self.clearbutton_cb)
> +            clearbutton.set_tooltip("Clear")
> +            toolbar_box.toolbar.insert(clearbutton, -1)
> +            clearbutton.show()
> +
> +            # add 'make bundle' entry to 'keep' palette.
> +            palette = activity_button.toolbar.keep.get_palette()
> +            # XXX: should clear out old palette entries?
> +            from sugar.graphics.menuitem import MenuItem
> +            from sugar.graphics.icon import Icon
> +            menu_item = MenuItem(_('As Pippy Document'))
> +            menu_item.set_image(Icon(file=('%s/activity/activity-icon.svg' %
get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
> +            menu_item.connect('activate', self.keepbutton_cb)
> +            palette.menu.append(menu_item)
> +            menu_item.show()
> +            menu_item = MenuItem(_('As Activity Bundle'))
> +            menu_item.set_image(Icon(file=('%s/activity/activity-default.svg' %
get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
> +            menu_item.connect('activate', self.makebutton_cb)
> +            palette.menu.append(menu_item)
> +            menu_item.show()
> +
> +            separator = gtk.SeparatorToolItem()
> +            separator.props.draw = False
> +            separator.set_expand(True)
> +            toolbar_box.toolbar.insert(separator, -1)
> +
> +            stop = StopButton(self)
> +            toolbar_box.toolbar.insert(stop, -1)
> +            self.set_toolbox(toolbar_box)
> +            toolbar_box.show()
> +
> +        else:
> +            # <= 0.84 toolbars
> +            # Top toolbar with share and close buttons:
> +            toolbox = ActivityToolbox(self)
> +            # add 'make bundle' entry to 'keep' palette.
> +            palette = toolbox.get_activity_toolbar().keep.get_palette()
> +            # XXX: should clear out old palette entries?
> +            from sugar.graphics.menuitem import MenuItem
> +            from sugar.graphics.icon import Icon
> +            menu_item = MenuItem(_('As Pippy Document'))
> +            menu_item.set_image(Icon(file=('%s/activity/activity-icon.svg' %
get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
> +            menu_item.connect('activate', self.keepbutton_cb)
> +            palette.menu.append(menu_item)
> +            menu_item.show()
> +            menu_item = MenuItem(_('As Activity Bundle'))
> +            menu_item.set_image(Icon(file=('%s/activity/activity-default.svg' %
get_bundle_path()), icon_size=gtk.ICON_SIZE_MENU))
> +            menu_item.connect('activate', self.makebutton_cb)
> +            palette.menu.append(menu_item)
> +            menu_item.show()
> +
> +            # The "go" button
> +            goicon_bw = gtk.Image()
> +            goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd())
> +            goicon_color = gtk.Image()
> +            goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd())
> +            gobutton = gtk.Button(label=_("_Run!"))
> +            gobutton.set_image(goicon_bw)
> +            gobutton.connect('clicked', self.flash_cb, dict({'bw':goicon_bw,
> +                'color':goicon_color}))
> +            gobutton.connect('clicked', self.gobutton_cb)
> +            self._table.attach(gobutton, 0, 2, 0, 1)
> +
> +            # The "clear" button
> +            clearicon_bw = gtk.Image()
> +            clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd())
> +            clearicon_color = gtk.Image()
> +            clearicon_color.set_from_file("%s/icons/eraser_color.svg" % os.getcwd())
> +            clearbutton = gtk.Button(label=_("_Clear!"))
> +            clearbutton.set_image(clearicon_bw)
> +            clearbutton.connect('clicked', self.flash_cb, dict({'bw':clearicon_bw,
> +                'color':clearicon_color}))
> +            clearbutton.connect('clicked', self.clearbutton_cb)
> +            self._table.attach(clearbutton, 2, 3, 0, 1)
> +
> +            # The "stop" button
> +            stopicon_bw = gtk.Image()
> +            stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd())
> +            stopicon_color = gtk.Image()
> +            stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd())
> +            stopbutton = gtk.Button(label=_("_Stop!"))
> +            stopbutton.set_image(stopicon_bw)
> +            stopbutton.connect('clicked', self.flash_cb, dict({'bw':stopicon_bw,
> +                'color':stopicon_color}))
> +            stopbutton.connect('clicked', self.stopbutton_cb)
> +            self._table.attach(stopbutton, 3, 4, 0, 1)
> +
> +            self.set_toolbox(toolbox)
> +            toolbox.show()
> +            activity_toolbar = toolbox.get_activity_toolbar()
> +            activity_toolbar.share.props.visible = False
>
>         # Main layout.
>         self.hpane = gtk.HPaned()
>         self.vpane = gtk.VPaned()
> +        # Vbox for vertically placing the gtksourceview and old pippy
> +        # layout buttons (if needed)
> +        self._vbox = gtk.VBox()
> +        self._vbox.set_size_request(0, int(SIZE_Y * 0.5))
>
>         # The sidebar.
>         self.sidebar = gtk.VBox()
>  <at>  <at>  -191,7 +301,6  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
>
>         # The GTK source view window
>         self.text_view = gtksourceview2.View(text_buffer)
> -        self.text_view.set_size_request(0, int(SIZE_Y * 0.5))
>         self.text_view.set_editable(True)
>         self.text_view.set_cursor_visible(True)
>         self.text_view.set_show_line_numbers(True)
>  <at>  <at>  -211,7 +320,9  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
>         codesw.set_policy(gtk.POLICY_AUTOMATIC,
>                       gtk.POLICY_AUTOMATIC)
>         codesw.add(self.text_view)
> -        self.vpane.add1(codesw)
> +        self._vbox.pack_start(codesw)
> +        self._vbox.pack_start(self._table, expand=False, fill=False)
> +        self.vpane.add1(self._vbox)
>
>         # An hbox to hold the vte window and its scrollbar.
>         outbox = gtk.HBox()
>  <at>  <at>  -263,12 +374,18  <at>  <at>  class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
>         self.text_view.grab_focus()
>
>     def timer_cb(self, button, icons):
> -        button.set_icon_widget(icons['bw'])
> +        if not _ORIGINAL_PIPPY_LAYOUT:
> +            button.set_icon_widget(icons['bw'])
> +        else:
> +            button.set_image(icons['bw'])
>         button.show_all()
>         return False
>
>     def flash_cb(self, button, icons):
> -        button.set_icon_widget(icons['color'])
> +        if not _ORIGINAL_PIPPY_LAYOUT:
> +            button.set_icon_widget(icons['color'])
> +        else:
> +            button.set_image(icons['color'])
>         button.show_all()
>         gobject.timeout_add(400, self.timer_cb, button, icons)
>
> --
> 1.7.2.3
>
>

--

-- 
Anish Mangal
anish <at> sugarlabs.org
_______________________________________________
Sugar-devel mailing list
Sugar-devel <at> lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel
Sugar Labs Activities | 1 Nov 2010 12:55
Favicon

[ASLO] Release Follow Me-3

Activity Homepage:
http://activities.sugarlabs.org/addon/4354

Sugar Platform:
0.82 - 0.90

Download Now:
http://activities.sugarlabs.org/downloads/file/27090/follow_me-3.xo

Release notes:
A simple little game which requires good concentration.
Pupils are presented with an ever increasing sequence of pictures which they have to imitate.
The Best Score is 'remembered' so the game provides a continual challenge to improve. My best is 40.

Sugar Labs Activities
http://activities.sugarlabs.org

Gmane