Tips and Tricks About Computers, Web Development, Linux, the Internet and the Like
open source

Customizing Colors for Your .bashrc
Oct 21st
Posted by Tyler Mulligan in Application Management
I’m working on organizing my dotfiles and part of that process has led me to clean up the way I address colors. I came across a few good sources, for .bashrc colors and decided it’d be better to create my own. I would like to have used the ones I found on the Arch wiki but the aliases were a bit odd to me. They also break consistency as you scroll down. I’m not sure if this is due to it being a collaborative wiki or it’s a way to teach multiple syntaxes/approaches. In either case I figured the aliases weren’t as “standard” as I thought they might be in that world.
So I decided to copy them the best of the bunch into geany and modify them with regular expressions. I used column selection to speed up some of the tasks, such as Title Case formatting and typing the prefixes.
# define colors Black='\e[0;30m' # Black / Regular Red='\e[0;31m' # Red Green='\e[0;32m' # Green Yellow='\e[0;33m' # Yellow Blue='\e[0;34m' # Blue Purple='\e[0;35m' # Purple Cyan='\e[0;36m' # Cyan White='\e[0;37m' # White BBlack='\e[1;30m' # BBlack / Bold BRed='\e[1;31m' # BRed BGreen='\e[1;32m' # BGreen BYellow='\e[1;33m' # BYellow BBlue='\e[1;34m' # BBlue BPurple='\e[1;35m' # BPurple BCyan='\e[1;36m' # BCyan BWhite='\e[1;37m' # BWhite UBlack='\e[4;30m' # UBlack / Underline URed='\e[4;31m' # URed UGreen='\e[4;32m' # UGreen UYellow='\e[4;33m' # UYellow UBlue='\e[4;34m' # UBlue UPurple='\e[4;35m' # UPurple UCyan='\e[4;36m' # UCyan UWhite='\e[4;37m' # UWhite BGBlack='\e[40m' # BGBlack - background BGRed='\e[41m' # BGRed BGGeeen='\e[42m' # BGGreen BGYellow='\e[43m' # BGYellow BGBlue='\e[44m' # BGBlue BGPurple='\e[45m' # BGPurple BGCyan='\e[46m' # BGCyan BGWhite='\e[47m' # BGWhite NC='\e[0m' # Text Reset / No Color
Here is a test case:
for c in {,B,U,BG}{Black,Red,Green,Yellow,Blue,Purple,Cyan,White}; do echo -e ${!c}$c${NC}; done; echo -e "${NC}"Here is the same test case without the aliases
for c in {0,1,4}\;{30..37} {40..47}; do echo -e \\e[${!c}${c}m${c}m\\e[0m; done;Here's a PS1 you can try it with
PS1="${debian_chroot:+($debian_chroot)}\[${BWhite}\]\u\[${NC}\]\[${Yellow}\]@\[${White}\]\h\[${NC}\]:\[${BBlue}\]\w\[${NC}\]$ "I plan to use these quite often as I build out my .bash_aliases but the most immediate use you might find useful is the PS1 generation tool I’ve setup an alpha of http://interwebninja.com/ps1-o-matic/
ps1-o-matic-0.5 video in action
![]()
![]()
![]()
![]()
Below is a screenshot of how I’m revising the script to use only javascript objects rather than relying on html inputs to store values:

I’m currently at the point where I’m using jquery ui’s draggable and sortable to allow segments to be moved around but I have nothing worth sharing yet. Stay tuned, I’ll be checking the source into my github account soon.
Sorry screen, tmux is better (but here are some screen-like hotkeys)
Oct 18th
Posted by Tyler Mulligan in Computers
Introduction
If you’re familiar with the command line on Linux or UNIX, you’ve likely heard of a program called “screen”, which allows you to create virtual terminal sessions inside of your current terminal. The major benefit to this is the ability to dettach and reattach screen sessions, leaving your programs to act as if you never left. Additionally, you can have multiple buffers inside your screen that act like tabs, allowing you to flip between.
The major difference between screen and tmux is their ability to split and manage splits. Oh yeah, that and hotkeys. I think they were trying to pay legacy (or force you to change back :-P) by setting up your main key to be “b” instead of “a”, which is an awkward reach. Tux Wears Fedora below shares more screen like hotkeys, as do I with some minor tweaks that I combined with the default example in ubuntu /usr/share.
I became well acquainted at Tux Wears Fedora’s post on tmux migrating from screen.
# ~/.tmux.conf # By Tyler Mulligan. Public domain. # # This configuration file binds many of the common GNU screen key bindings to # appropriate tmux key bindings. Note that for some key bindings there is no # tmux analogue and also that this set omits binding some commands available in # tmux but not in screen. # # Note this is a good starting point but you should check out the man page for more # configuration options if you really want to get more out of tmux ### Unbind existing tmux key bindings (except 0-9). # Set the prefix to ^A. unbind C-b set -g prefix ^A bind a send-prefix # Bind appropriate commands similar to screen. # lockscreen ^X x unbind ^X bind ^X lock-server unbind x bind x lock-server # screen ^C c unbind ^C bind ^C new-window bind c bind c new-window # detach ^D d unbind ^D bind ^D detach # displays * unbind * bind * list-clients # next ^@ ^N sp n unbind ^@ bind ^@ next-window unbind ^N bind ^N next-window unbind " " bind " " next-window unbind n bind n next-window # title A unbind A bind A command-prompt "rename-window %%" # other ^A unbind ^A bind ^A last-window # prev ^H ^P p ^? unbind ^H bind ^H previous-window unbind ^P bind ^P previous-window unbind p bind p previous-window unbind BSpace bind BSpace previous-window # windows ^W w unbind ^W bind ^W list-windows unbind w bind w list-windows # quit \ unbind \ bind \ confirm-before "kill-server" # kill K k unbind K bind K confirm-before "kill-window" unbind k bind k confirm-before "kill-window" # redisplay ^L l unbind ^L bind ^L refresh-client unbind l bind l refresh-client # More straight forward key bindings for splitting unbind % bind | split-window -h bind v split-window -h unbind '"' bind - split-window -v bind h split-window -v # History set -g history-limit 1000 # Pane unbind o bind C-s down-pane # Terminal emulator window title set -g set-titles on set -g set-titles-string '#S:#I.#P #W' # Status Bar set -g status-bg black set -g status-fg white set -g status-interval 1 set -g status-left '#[fg=green]#H#[default]' set -g status-right '#[fg=yellow]#(cut -d " " -f 1-4 /proc/loadavg)#[default] #[fg=cyan,bold]%Y-%m-%d %H:%M:%S#[default]' # Notifying if other windows has activities setw -g monitor-activity on set -g visual-activity on # Highlighting the active window in status bar setw -g window-status-current-bg red # Clock setw -g clock-mode-colour green setw -g clock-mode-style 24 # :kB: focus up unbind Tab bind Tab down-pane unbind BTab bind BTab up-pane # " windowlist -b unbind '"' bind '"' choose-window
Splitting is what initially caused me to migrate but there are plenty of other features that have lead me to stay. this article outlines the benefits in detail. Once you go tmux, you never go back.
Using Terminal Program "screen" on Linux / UNIX
Oct 18th
Posted by Tyler Mulligan in Command Line
Introduction
The terminal program “screen” for Linux / UNIX, is a command line tool that allows you to emulate terminals inside a currently running session and detach the ‘screen’ to the background. This program may seem obscure to new users because of it’s abstract nature and unusual key bindings but once you start learning the basics, the advanced usages don’t seem that scary.
If you consider yourself to have an advanced sense of the command line and you’d like to go more advanced out of gate, you should consider skipping ahead to my article on the screen successor, tmux which allows for more advanced splitting (and apparently better code).
Getting Started
Below is a walk through of an average screen scenario I’ve put together to give you an idea of how you might use this program in your workflow.
to start a basic screen session type:
screen
this will put you in a virtual session.
to detach the screen press: ctrl+a, d
to reattach the screen type:
screen -r
detach again, then type:
screen
and detach this. You now have 2 screen sessions open, so when you type screen -r, instead of reattaching, it will list the possible screens to attach. You’ll see something like the following:
There are several suitable screens on:
31454.pts-2.quadjutsu (10/10/2009 09:45:51 AM) (Detached)
31219.pts-2.quadjutsu (10/10/2009 09:44:27 AM) (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
So I’d type:
screen -r 31454
to attach the first one. On systems with ‘pkill’ you can type:
pkill screen
to kill all the screen sesions.
That’s one way to separate screens… another is virtual “tabs” within a screen session.
so lets create a new screen session with:
screen
Then type:
ls
so you have some data to reference for which “tab” you’re in
Then hit: ctrl+a, c
This will create a new tab.
to cycle forward through the tabs (next), hit: ctrl+a, n or ctrl+a, [spacebar]
to cycle backwards through the tabs (previous), hit: ctrl+a, p or ctrl+a, [backspace]
to kill a tab, type: exit
I found a good reference for “screen” hotkeys at pixelbeat.org if you’d like to learn more.
Restricting a user’s shell permissions on Ubuntu Server 10.04 with lshell
Sep 27th
Posted by Tyler Mulligan in Bash
As described by apt-cache, the method which I usually begin a package search for in a Ubuntu Server 10.04 environment:
z@zentury ~$ apt-cache search lshell lshell - restricts a user's shell environment to limited sets of commands
This is an extremely useful way to restrict a Linux users capabilities. Alternative shells, such as rssh, limit you to toggle a specific set of applications, (scp, sftp, cvs, svn, rsync or rdist). A limited shell is helpful for reasons such as backups or game/application servers where you know/want the user to be able to execute only a specific set of actions. You can however, consider other reasons for restricting users on a Linux based machine.
A typical use case is provided in the lshell wiki.
Ubuntu also provides a default in etc/lshell.conf, which serves as a good example:
# lshell.py configuration file
#
# $Id: lshell.conf,v 1.20 2009/06/09 19:53:46 ghantoos Exp $
[global]
## log directory (default /var/log/lshell/ )
logpath : /var/log/lshell/
## set log level to 0, 1, 2 or 3 (0: no logs, 1: least verbose)
loglevel : 2
## configure log file name (default is %u i.e. username.log)
#logfilename : %y%m%d-%u
[default]
## a list of the allowed commands or 'all' to allow all commands in user's PATH
allowed : ['ls','echo','cd','ll']
## a list of forbidden character or commands
forbidden : [';', '&', '|','`','>','<', '$(', '${']
## number of warnings when user enters a forbidden value before getting
## exited from lshell
warning_counter : 2
## command aliases list (similar to bash’s alias directive)
aliases : {'ll':'ls -l', 'vi':'vim'}
## a value in seconds for the session timer
#timer : 5
## list of path to restrict the user "geographicaly"
#path : ['/home/bla/','/etc']
## set the home folder of your user. If not specified the home_path is set to
## the $HOME environment variable
#home_path : '/home/bla/'
## update the environment variable $PATH of the user
#env_path : ':/usr/local/bin:/usr/sbin'
## allow or forbid the use of scp (set to 1 or 0)
#scp : 1
## allow of forbid the use of sftp (set to 1 or 0)
#sftp : 1
## list of command allowed to execute over ssh (e.g. rsync, rdiff-backup, etc.)
#overssh : ['ls', 'rsync']
## logging strictness. If set to 1, any unknown command is considered as
## forbidden, and user's warning counter is decreased. If set to 0, command is
## considered as unknown, and user is only warned (i.e. *** unknown synthax)
#strict : 1
## force files sent through scp to a specific directory
#scpforce : '/home/bla/uploads/'
If this looks like something you would like to be able to do, you can install it with apt-get:
z@zentury ~$ apt-get install lshell
You can change a current user to have the limited shell with the following command:
sudo chsh -s /usr/bin/lshell backupbot
You can add a new user with a limited shell with the following command (-m creates the home directory):
sudo useradd -m -s /usr/bin/lshell backupbot
Compiz 0.9.0 Released – Completely Rewritten in C++
Jul 4th
Posted by Tyler Mulligan in Application Management
I was doing some in depth research / code hacking regarding the support of multi-headed output (dual monitors) on Linux. I won’t get into details but my video is being output to my monitors as “one screen” with a virtual distinctions handled by the window manager. Because of this, figuring out which of the monitors you are on isn’t as straight forward as you might think. Originally I was looking for a way to access the c functions in compiz through python but that point is now moot (likely for the better).
The first unstable release of the Compiz 0.9 series, completely rewritten in C++. As said, this “brings a whole new developer API, splits rendering into plugins, switches the buildsystem from automake to cmake and brings minor functionality improvements. This release represents the first developer and tester preview of what will eventually make the 0.10.x stable series. Please note that as such, it is not yet ready for general use as there are a number of known ssues, regressions and incomplete functionality.”
Here is a SLIGHTLY DATED graph I got from Santiance.com.
This is a really interesting turning point for the project and I’m glad I came across this while doing my research for multi-head handling in compiz. Knowing where the future lies could drastically change where I put my efforts in developing to support them.
scp-notifications for GNOME and Ubuntu – Expanding on My Original Python Script
Jun 26th
Posted by Tyler Mulligan in Compiz
I’ve only been coding Python for ~12 hours total, so don’t expect this to be perfect. Knowing what I know about creating/testing other software and doing my best to scour through very light pynotify documentation, I’ve begun to build out this script to be more useful / portable / configurable. As the Version 0.6 indicates, I’m not quite at my goal yet and there is still more to learn to bring it up to that point.
I’m releasing this early on my blog just in case I caught any people yesterday who’ve been experimenting with my research / code so far. I’ll share it on github when I evolve it just a bit more.
#!/usr/bin/env python
#
# Title: scp-notifications
# Author: Tyler Mulligan (tyler@detrition.net)
# Date: 06/26/2010
# Version: 0.6
# Description:
# Used in combination with an event, such as an action or cronjob, this script
# will scp the latest file from a folder to your server.
#
# Optionally, it can copy the url to your clipboard and/or show a popup with a
# link to the file after succesfully uploading
#
# Orginally developed to be piped to from compiz screenshot tool
# http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv
#
# The MIT License
#
# Copyright (c) 2010 Tyler Mulligan
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE
#
import pygtk
pygtk.require('2.0')
import pynotify
import gtk
import sys
import os
import subprocess
# Set Variables
#####################################
user = "user"
host = "server.com"
# All should have trailing slashes
lfolder = "/home/user/screenshots/"
hfolder = "/home/remote_user/screenshots/"
httplink = "http://"+host+"/screenshots/"
# Display
#####################################
t1 = 5000 # timeout for screenshot upload dialog
t2 = 3000 # timeout for screenshot preview
t3 = 7000 # timeout for link dialog
screenshot_preview = 1 # If using with the compiz screenshot plugin, you may want this
popup_link = 1 # another popup
copy_to_clipboard = 0 # automatically copy text to keyboard
# Position
#####################################
# Get screensize < < used for relative positioning
display = gtk.gdk.display_get_default()
screen = display.get_default_screen()
x = screen.get_width() - 1
y = screen.get_height() - 1
# 0 for Automatic Placement
"""
x1 = 0
y1 = 0
x2 = 0
y2 = 0
x3 = 0
y3 = 0
"""
# Define Relative Position (assuming top-right)
x1 = x-1
y1 = 12
x2 = x1
y2 = y1 + 100
x3 = x-1
y3 = 12
# Define Static (1920 puts it on my second monitor)
"""
x1 = 1919
y1 = 12
x2 = x1
y2 = y1 + 100
x3 = 1920
y3 = 12
"""
#####################################
def upload_cb(n, action):
assert action == "upload"
subprocess.call(["scp", os.path.join(lfolder, f), '%s@%s:%s' % (user, host, hfolder)])
# setup URL in
if copy_to_clipboard:
clipboard = gtk.clipboard_get()
clipboard.set_text(httplink + f)
# make our data available to other applications
clipboard.store()
# Notification: Link for the clicking
if popup_link:
n3 = pynotify.Notification("Here is your link","<a href='" + httplink + f + "'>" + httplink + f + "")
helper = gtk.Button()
icon = helper.render_icon(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_DIALOG)
n3.set_icon_from_pixbuf(icon)
n3.set_urgency(pynotify.URGENCY_NORMAL)
if x3:
n3.set_hint("x", x3)
if y3:
n3.set_hint("y", y3)
n3.set_timeout(t3)
n3.connect("closed",closen3_cb)
if not n3.show():
print "Failed to send notification"
sys.exit(1)
closen1_cb(n1)
closen2_cb(n2)
gtk.main_quit()
sys.exit(1)
# Notification 1 was closed
def closen1_cb(n):
n1.close()
if screenshot_preview:
n2.close()
gtk.main_quit()
# Notification 2 was closed
def closen2_cb(n):
n2.close()
gtk.main_quit()
# Notification 2 was closed
def closen3_cb(n):
n3.close()
gtk.main_quit()
# The Ignore button was clicked
def ignore_cb(n, action):
assert action == "ignore"
closen1_cb(n1)
closen2_cb(n2)
gtk.main_quit()
# Main
def main():
gtk.main()
# Init
if __name__ == '__main__':
if not pynotify.init("Notifier 'scp' Option"):
sys.exit(1)
# Get latest file and build uri
start = os.path.abspath(lfolder)
f = max([(os.path.getmtime(os.path.join(start,p)),p)
for p in os.listdir(start)])[1]
uri = lfolder + f
# Notification: Upload to Server
n1 = pynotify.Notification("Upload to Server?","Copy the file '" + f + "' to the server?")
helper = gtk.Button()
icon = helper.render_icon(gtk.STOCK_DIALOG_QUESTION, gtk.ICON_SIZE_DIALOG)
n1.set_icon_from_pixbuf(icon)
n1.set_urgency(pynotify.URGENCY_NORMAL)
if x1:
n1.set_hint("x", x1)
if y1:
n1.set_hint("y", y1)
n1.set_timeout(t1)
n1.add_action("upload", "Yes, Upload", upload_cb)
n1.add_action("ignore", "Ignore", ignore_cb)
n1.connect("closed",closen1_cb)
if not n1.show():
print "Failed to send notification"
sys.exit(1)
# Notification: Screenshot Preview
if screenshot_preview:
n2 = pynotify.Notification("Screenshot Preview", "", uri)
n2.set_urgency(pynotify.URGENCY_LOW)
if x2:
n2.set_hint("x", x2)
if y2:
n2.set_hint("y", y2)
n2.set_timeout(t2)
n2.connect("closed",closen2_cb)
if not n2.show():
print "Failed to send notification"
sys.exit(1)
main()
.
Ubuntu Notifications (osd-notify) Sucks, notifications-daemon Rocks – Exploiting the Goodness with Compiz
Jun 25th
Posted by Tyler Mulligan in Compiz
Introduction
The long name for this blog used to be “Tyler Mulligan’s Tips and Tricks for Increasing your Efficiency“. I love finding ways to increase my efficiency and let computers do the work while I focus on more interests aspects of what the computer is providing me with. When I recognize an issue, I find a way to cut out time by streamlining the process for the most accurate repetition, like any programmer would/should/could.
I noticed myself taking a lot of screenshots with compiz’ built in screenshot tool (I can hold a hotkey and drag a box to take newspaper style clippings). This is very fast and simple, I highly recommend enabling this option and getting used to it. However, I don’t care much for clicking around on clunky websites to upload images.
This is where my adventure starts… when I find out a very useful feature was deprecated and not replaced in Ubuntu. I don’t use the new notification area, it has too much I don’t need, I never liked the behavior of these new osd-notify notifications which I found out now are even more worthless (sorry team).
Using Sane Notifications in Ubuntu
After reinstalling the GNOME default notifications system in Ubuntu I was able to use SANE notifications that actually… KICK ASS! I don’t understand how osd-notify is better than these which even comes with it’s own notification properties panel. Maybe it’s an under the hood thing…
Regardless, there is no doubt in my mind that notifications that you hover, can still slightly see but click through but cannot perform any actions, even a close, are just plan stupid and annoying..

Screenshot of the script I ended up writing using the “better” notification system to ask me if I want to upload the screenshot I just took to the server.
Linking the notifications
I linked the notifications the following way:

Python Script for Notification that Prompts for File Upload to Server
Knowing diddly squat about Python, I chugged forward with my classic notification popups that allow for interaction as it had the most activity around it and some examples available in /usr/share/doc/python-notify/examples/
I ended coming up with the following script thanks to some help from a few people in #python on irc.freenode.org
This is outside of the scope of this blogpost but this script assumes you have setup passwordless ssh to your server.
#!/usr/bin/env python
#
# Title: Notification 'scp' Option
# Author: Tyler Mulligan (tyler@detrition.net)
# Date: 06/25/2010
# Description:
# Used in combination with an event, such as an action or cron
# the latest file from a folder will be scped to your server and will copy
# the http location of the that file to your clipboard
#
# Orginally developed to be piped to from compiz screenshot tool
#
#
# The MIT License
#
# Copyright (c) 2010 Tyler Mulligan
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE
#
import pygtk
pygtk.require('2.0')
import gtk
import pynotify
import sys
import os
import subprocess
user = "user"
host = "server.com"
lfolder = "/home/user/screenshots/"
hfolder = "/home/remote_user/screenshots/"
httplink = "http://"+host+"/screenshots/"
timeout = 5000
# Set position
display = gtk.gdk.display_get_default()
screen = display.get_default_screen()
x = screen.get_width() - 1
y = screen.get_height() - 1
#x = 1919
#y = 12
def upload_cb(n, action):
assert action == "upload"
start = os.path.abspath(lfolder)
f = max([(os.path.getmtime(os.path.join(start,x)),x)
for x in os.listdir(start)])[1]
# setup URL in clipboard
clipboard = gtk.clipboard_get()
clipboard.set_text(httplink + f)
# make our data available to other applications
clipboard.store()
os.system('scp "%s" "%s@%s:%s"' % (lfolder + f, user, host, hfolder) ).wait()
n.close()
gtk.main_quit()
def ignore_cb(n, action):
assert action == "ignore"
n.close()
gtk.main_quit()
if __name__ == '__main__':
if not pynotify.init("Notifier 'scp' Option"):
sys.exit(1)
# Setup Popup
n = pynotify.Notification("Upload to Server?")
n.set_urgency(pynotify.URGENCY_NORMAL)
n.set_timeout(timeout)
n.set_category("device")
n.add_action("upload", "Yes, Upload", upload_cb)
n.add_action("ignore", "Ignore", ignore_cb)
# Set position
n.set_hint("x", x)
n.set_hint("y", y)
if not n.show():
print "Failed to send notification"
sys.exit(1)
gtk.main()
edit: I updated the script with some position information — I love that I can put the notifications ANYWHERE on my screen. I also variablized the timeout.
edit 2: Here is a video of my improved script in action — I’ll post the source later
http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv
Going Beyond
The Compiz example is just something that server my immediate needs. The possibilities are however endless. You can for example, link this script to a cron job asking you if you want to sync some other sort of file. Or perhaps you’d like to add multiple buttons to give yourself a folder / server choice.
Happy hacking
Some Issues I found with Dual Monitors in KDE
May 13th
Posted by Tyler Mulligan in Computers
I had originally made a thread on ubuntu forums essentially asking how to change the way kde or more specifically kwin treats dual monitors.
When trying out KDE 4.4, I was trying to establish a similar workflow to what I have in my GNOME/compiz setup. I use dual monitors and heavily use the expo compiz plugin (equivalent to kwin’s ‘desktop grid’). However, the behavior in KDE is a bit odd to me.
(not my video but gives you an idea about the effect, see below for how I lay mine out)
In compiz, I have 4 virtual desktops with dimensions that spanned both monitors.
[ ] | [ ]
In KDE however, each monitor is considered it’s own “activity” and as such, I have 8 virtual desktops
[ ][ ] | [ ][ ] [ ][ ] | [ ][ ]
This in and of itself isn’t all so bad. What bothers me however, is how they behave.
Labeling the virtual desktops..
[1][2] | [1][2] [3][4] | [3][4]
When I click virtual desktop [1] on the left monitor, [1] on the right monitor zooms with it. The behavior I’m used to in compiz would be to have both [1][2] on the left desktop zoom if I were to click [1].
Sure, this behavior “makes sense” knowing how KDE treats multiple monitors as separate activities but even after setting up matching desktop backgrounds on the monitors, I find it confusing to my workflow.
What’s more, is that KDE seems to know this is what I want… but ignores this fact when creating activities:

Has anyone come up with a clever solution to achieve this? I didn’t see anything about it planned for 4.5.
If it matters, I’m using twinview.
Reseting your system wide cursor theme in ubuntu
May 11th
Posted by Tyler Mulligan in Command Line
If you installed KDE in ubuntu (GNOME based), you may have noticed that when you log back into GNOME, you keep the KDE cursor theme. To fix this, use update-alternatives like so:
0025|z@zentury ~$ sudo update-alternatives --config x-cursor-theme There are 7 choices for the alternative x-cursor-theme (providing /usr/share/icons/default/index.theme). Selection Path Priority Status ------------------------------------------------------------ * 0 /etc/X11/cursors/oxy-white.theme 50 auto mode 1 /etc/X11/cursors/core.theme 30 manual mode 2 /etc/X11/cursors/handhelds.theme 20 manual mode 3 /etc/X11/cursors/oxy-white.theme 50 manual mode 4 /etc/X11/cursors/redglass.theme 20 manual mode 5 /etc/X11/cursors/whiteglass.theme 20 manual mode 6 /usr/share/icons/DMZ-Black/cursor.theme 30 manual mode 7 /usr/share/icons/DMZ-White/cursor.theme 50 manual mode Press enter to keep the current choice[*], or type selection number:
press “7″ for the default
[SOLVED] konversation has no window decorations in GNOME and forces fullscreen
May 9th
Posted by Tyler Mulligan in Computers
This was a very annoying bug for me to deal with and it almost caused me to switch to kde 4 earlier than planned. Luckily I was able to pull up a fix which is simple to replicate but was a pain in the arse to solve.
To fix this, go into CompizConfig Settings Manager >> Workarounds >> uncheck “Legacy Fullscreen Support” as the red circle in the screenshot below indicates.


