Tips and Tricks About Computers, Web Development, Linux, the Internet and the Like
Ubuntu
Ubuntu Window Management with Multiple Monitors, Window Effects and Default File Associations
Nov 25th
Multiple Monitors Window Management in Ubuntu
Moving your applications from one monitor to the next with hotkeys
I’ve been using multiple monitors for a while now, Starting with a 17″ CRT with a 19″ CRT and moving up to two 19″ LCD, then 3, then temporarily one wide screen and back to 2. Something I always loved having as a utility in ultramon that I couldn’t find in Ubuntu (Gnome) or any window manager for that matter, was the ability to move applications from monitor to monitor. I had assumed the search futile until I was searching about some questions I had concerning Compiz-fusion with dual monitors and I came about this thread on Ubuntu forums which brightened up my day. A fellow named gfixler posted a bash script that utilizes command line applications to move the windows.
For you multi-monitor users seeking salvation from removing your hand from the keyboard to move your application from one monitor to another, here’s the skinny on getting it setup using compiz-fusion, aka Advanced Desktop Effects, to set my keybinds.
1. Open a terminal and setup your prerequisites with apt-get:
sudo apt-get install wmctrl xprop xwininfo
If you get errors about x11-utils, just ignore them, this package will handle your needs.
2. Next, lets put the script somewhere you can call it, say “~/scripts”
mkdir ~/scripts && cd ~/scripts && touch movewin.sh && chmod +x movewin.sh && gedit movewin.sh
2. Paste the following code, find the first function “getNumberOfMonitors” and configure it to the number of monitors you have (default 2).
#!/bin/bash
# swap_monitor.sh (original version)
# Moves the active window to the other screen of a dual-screen Xinerama setup.
#
# movewin.sh (modified version)
# allows movement of windows left and right between multiple monitors
#
# Requires: wmctrl, xprop, xwininfo
#
# Original Author: Raphael Wimmer
# raphman@gmx.de
#
# Modified by: Gary Fixler
# gfixler+bash@gmail.com
function getNumberOfMonitors
{
# simply must be hardcoded
# e.g. MatroxTripleHead2Go can service 3 screens,
# but appears as only one monitor to the computer
# change to your number of monitors
echo 2
}
function getMonitorWidth
{
numberOfMonitors=$(getNumberOfMonitors)
monitorLine=$(xwininfo -root | grep "Width")
monitorWidth=$((${monitorLine:8}/$numberOfMonitors ))
echo $monitorWidth
}
function getActiveWindowID
{
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinID="${activeWinLine:40}"
echo $activeWinID
}
function getActiveWindowHorizontalPosition
{
activeWinID=$(getActiveWindowID)
xPosLine=$(xwininfo -id $activeWinID | grep "Absolute upper-left X")
xPos=${xPosLine:25}
echo $xPos
}
function getActiveWindowWidth
{
activeWinID=$(getActiveWindowID)
xWidthLine=$(xwininfo -id $activeWinID | grep "Width")
xWidth=${xWidthLine:8}
echo $xWidth
}
function getActiveWindowCurrentMonitor
{
numberOfMonitors=$(getNumberOfMonitors)
monitorWidth=$(getMonitorWidth)
activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
i="0"
while [ $xPos -gt $monitorWidth ]
do
xPos=$[$xPos-$monitorWidth]
i=$[$i+1]
done
echo $i
}
function getActiveWindowPositionOneMonitorToTheLeft
{
monitorWidth=$(getMonitorWidth)
currentMonitor=$(getActiveWindowCurrentMonitor)
activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
xPos=$[$xPos-$monitorWidth]
echo $xPos
}
function getActiveWindowPositionOneMonitorToTheRight
{
monitorWidth=$(getMonitorWidth)
numberOfMonitors=$(getNumberOfMonitors)
currentMonitor=$(getActiveWindowCurrentMonitor)
activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
xPos=$[$xPos+$monitorWidth]
echo $xPos
}
function changeActiveWindowMonitor
{
activeWinID=$(getActiveWindowID)
if [ $1 -eq "0" ]
then
newXPos=$(getActiveWindowPositionOneMonitorToTheLeft)
newXPos=$[$newXPos-5]
else
newXPos=$(getActiveWindowPositionOneMonitorToTheRight)
newXPos=$[$newXPos-5]
fi
winState=$(xprop -id ${activeWinID} | grep "_NET_WM_STATE(ATOM)" )
if [[ `echo ${winState} | grep "_NET_WM_STATE_MAXIMIZED_HORZ"` != "" ]]
then
maxH=1
wmctrl -i -r ${activeWinID} -b remove,maximized_horz
fi
if [[ `echo ${winState} | grep "_NET_WM_STATE_MAXIMIZED_VERT"` != "" ]]
then
maxV=1
wmctrl -i -r ${activeWinID} -b remove,maximized_vert
fi
if [[ `echo ${winState} | grep "_NET_WM_STATE_FULLSCREEN"` != "" ]]
then
fulls=1
wmctrl -i -r ${activeWinID} -b remove,fullscreen
fi
# move window (finally)
wmctrl -i -r ${activeWinID} -e 0,${newXPos},-1,-1,-1
# restore maximization
((${maxV})) && wmctrl -i -r ${activeWinID} -b add,maximized_vert
((${maxH})) && wmctrl -i -r ${activeWinID} -b add,maximized_horz
((${fulls})) && wmctrl -i -r ${activeWinID} -b add,fullscreen
# raise window (seems to be necessary sometimes)
wmctrl -i -a ${activeWinID}
}
function moveActiveWindowOneMonitorToTheLeft
{
changeActiveWindowMonitor 0
}
function moveActiveWindowOneMonitorToTheRight
{
changeActiveWindowMonitor 1
}
"$1"
exit 0
3. Setup your hot keys with compiz-fusion. Go to System >> Preferences >> Advanced Desktop Effects. Inside “General Options“, click on the command tab (I apologize for my heinous blue links).
Use
scripts/./movewin.sh moveActiveWindowOneMonitorToTheRight
and
scripts/./movewin.sh moveActiveWindowOneMonitorToTheLeft
respectively
Per Application Window Effects in Ubuntu
Bring character and tickle your soul with per application window effects
Another cool feature Compiz-fusion has is window animations. My friend James Lindsay recently reminded me about Window Effects… which when I first install Ubuntu on my laptop, I experimented my butt off… but being a laptop… I just used simple ones I’d turn off half the time anyway. He asked me why I don’t use them on my desktop and I didn’t have a good reason. Well, now I have 2 good reasons to keep using compiz.
I made my Thunderbird use the airplane effect so when I send emails, it flys away and for Geany, I used the magic lamp for open, close, maximize and minimize (different speeds). It’s a fun little effect that breaks up the stiffness of the desktop.
Default File Associations in Ubuntu
geany > gedit
I was tired of gedit popping up when geany’s just as lightweight but more affective. So found a command and altered it a bit to make my default editor geany.
1. Open the terminal and create\open the following file:
gedit ~/.local/share/applications/defaults.list
If it’s blank, add “[Default Applications]“. If it’s not, find “[Default Applications]“.
2. Then, back to the terminal, grep the default files associations and replace gedit with your editor of choice
grep gedit /usr/share/applications/defaults.list | sed s/gedit/geany/g
Copy (ctrl+shift+c) and paste the output into gedit, below the “[Default Applications]” header.
3. Restart nautilus to load the changes (will close all your file managers that are open and blink/freeze your desktop for a second)
pkill nautilus
Good luck, have fun and happy coding :)
Geany, the Almost Notepad++, Improved gedit with a Few Extras That Make You Smile
Jul 21st
I was browsing around linuxappfinder.com today and came across Geany, which I’ve already gotten quite comfortable with.
Some features I found that make it similar to notepad++
- The hotkeys are very similar if not identical to notepad++ (gedit has different ones)
- It supports regex find/replace
- It supports ‘find in files’ – by using grep
- It’s a lightweight and efficient IDE
Some features Geany has that notepad++ doesn’t
- Status window with a history
- Scribble pad
- Built in terminal
- Color picker
- Support for projects
- Tight integration with my window manager
- The functions menu is expanded to contain all sorts of clever information that I can fold in a non buggy tree
Some features notepad++ has that geany doesn’t
- TextFX (neat macros that help you with string related pattern updates)
- GUI for changing theme colors
- Tabbed find/replace and find in all (nit pick)
Why I’m quickly choosing Geany over Notepad++
With tight integration with gnome (as opposed to notepad++ which I have to run through wine) and a package of dark themes which I was able to find quickly through the Geany’s FAQ.
I haven’t tried it on Windows yet but I’d imagine it’d run pretty well.. though you are missing out on a lot of things you can take advantage of in linux. If you’re a windows user and would like to give it a whirl, this will help you.
Where I've been (June 2008 Edition)
Jun 13th
So it’s been another interesting stretch of not blogging. A quick recap involves school, work, play and Nexuiz (which is a cross between work and play). For school, I managed a project called Object Organizer which you can learn more about in the wiki. I learned a lot about code, projects and people during this experience. I hope to share some techniques, such as the jQuery AJAX login I’ve developed with you all soon.
I’ve been really busy with my Senior Project / Nexuiz Community, Nexuiz Ninjaz developing a web based statistics frontend for players to check their stats. It will be similar to an already existing statistics script but we plan on doing a few things different. As the project grows, I will post information I find interesting about the project(s).
My main computer died and my thinkpad was going haywire so I was able to get another computer from a friend in exchange for work and I did a fresh OS install on my thinkpad. Both computers use Ubuntu Hardy Heron 8.04, the desktop dual boots into XP 64bit. I’ve stayed booted into Ubuntu most the time. And I’ve done many neat things with syncing my laptop and desktop. Utilizing programs such as Synergy and Unison.
Ubuntu has improved drastically since I’ve lasted tried it. There are a few annoying bugs… like the fact that xinerama is buggy with games causing me to create a single monitor xorg.conf I run in a different tty just for games but the time I’m spending configuring, is time I was wasting on windows before. As crappy as having my desktop die was, due to good planning I was able to recovery everything I need and this event has gotten me back into Linux.
I hope to have something more for you next post but if you can’t wait, start reading some of my other sites :).



