2015. január 17.

Migrating from Ubuntu 14.04.1 LTS to 12.04.5 LTS

I decided to abandon Ubuntu Trusty Thar LST after about two weeks of usage. I was pretty upset about it. This is what I wrote when I made the decision:
I actually have to do paid work on my laptop, so it needs to be as reliable and as fast as possible.
Ubuntu Trusty with gnome session flashback was great. Really. The only little tiny problem was that it lasted only until I had to really depend on it because of my job. My job, that is 99% spreadsheet and internet browser work. Opening 10-20 chrome windows during a single search process takes all the memory, and freezes the system. Firefox is not really that better than chrome in memory usage. And Libreoffice... the spreadsheet I work with is like 2000 rows by 40 columns data and another 6 sheets of database queries made with functions. Libreoffice just could not handle this. It was terribly slow, lagging when scrolling, saving took up to a minute, and all 4.x versions crashed regularly.
No, this is not something anyone would recommend to do your job on. Not in 2015.
 I was planning to abandon Ubuntu at all, and choose a lightweight alternative, probably one that is based on Ubuntu. Then I realized Ubuntu Precise Pangolin is supported up to 2017, so I thought I'll give it a try before completely saying good-bye to Ubuntu.

I set up a similar environment as on Trusty. In Precise, it is gnome-session-fallback that gives back the Gnome2 environment. It can be downloaded from Synaptic Package Manager, which can be downloaded with the sudo apt-get install synaptic command in the Terminal, which can be opened with the Ctrl+Alt+T command.

2015. január 12.

Some trouble I experience with Ubuntu 14.04 and Gnome-session-flashback

  • nemo crashed
  • xprop -set _net_wm_strut_partial gets overwritten frequently
  • login screen changed after running out of battery in suspended state
  • libreoffice (4.2.7) calc and writer failure: when setting font color, gnome-panel turns invisible, (but still works, when I click to the places where the buttons should be, they function well) and right-click menus inside libreoffice disappear.
    (can be restored with sudo pkill gnome-panel, but is frequent (more times a day) and annoying.)
  • libreoffice (4.2.7) is extremely slow: it's lagging!
  • libreoffice (4.2.7) calc formatting is incorrectly shown. Cells with the same formatting appear differently: fonts mismatch in size and style (serif/sans-serif)
  • libreoffice (4.2.7) calc graphical interface elements are incorrectly shown. checkboxes sometimes have checkmarks, sometimes don't.
I upgraded to LibreOffice 4.3.3 using this method.

2015. január 11.

Aero Snap for extended display on different screen resolutions - a workaround

In this AskUbuntu post, a solution is described to have the Aero snap to left and right in Metacity Ubuntu. I covered the content of the post previously based on the post, and added a snap up and snap down function too.

This AskUbuntu post, from the same user, is aiming to develop the solution further for multiple monitors. Based on this post I'll do my own workaround.

I have two displays. One is 1024x768, the other is 1280x1024 in resolution.
I either put them beside or on top of each other.
I already worked out the usage of the tablet screen as a tablet in similar settings.

I will call displays beside each other "Sided", and displays on top of each other "Topped".

Sided screen is 2304x1024, Topped is 1280x1792 in resolution.

The script as is, puts the active window according to this table:
SnapSided displayTopped display
leftleft screenbigger screen left
rightright screenbigger screen right
upbigger screen upupper screen
downbigger screen downlower screen

There are problems with the resized window's sizes, caused by the different screen sizes and the expanded edge panels (top and bottom panel). This is what I would like to fix.

Defining screens
the tool for dynamic screen manipulation is xrandr.

Normal/Default (with only one screen and the expanded edge panels (top+bottom) in place)
Small display maximized window is 1024x692 in position 0:80
Big display maximized window is 1280x948 in position 0:80


Topped Displays
Small display (with panels) maximized window is 1024x716 in position 0:1080
Small display maximized window is 1024x740 in position 0:1080
Big display (with panels) maximized window is 1280x972 in position 0:80
Big display maximized window is 1280x996 in position 0:56

As is visible from the altering numbers, either the top or the bottom of the windows are hidden under the edge panels in the Topped view.
This is a problem experienced by different users in AskUbuntu and elsewhere.
It is caused because "panels in between monitors are not supported, and this is a limitation in the freedesktop specification for reserving space for things like panels."

# What is my Desktop Manager? ("dm")
~$ env | grep XDG_CURRENT_DESKTOP
Mine is GNOME.

# What is my Window Manager? ("wm")
~$ wmctrl -m
Mine is Metacity. It's configuration tool is gconftool-2.
It can be set to be a compositing window manager (like compiz but simpler) by opening dconf-editor and navigating to > org > gnome > metacity > compositing-manager > mark checked. It has these features: real window transparency (i.e. terminal window), window shadow, Alt+Tab window selector shows screenshot of the window; it is said to support AWN, and Gnome Do.


#What is EWMH?
EWMH is a standard for window management. For more info visit this site.

# What is the full size of the display?
that is given by ~$ wmctrl -G -l | grep Desktop
or by ~$ xwininfo -root | grep Height and ~$ xwininfo -root | grep Width
or by ~$ xwininfo -root | egrep '(Height|Depth)' displayed in two rows.

# Is the view topped or sided?
if width>height it is the sided view, else it is the topped view.

# What are the single display sizes?
they are given by xrandr -q | grep '*' displayed in two rows.

#What are the names of the displays?
they are given in ~$ xrandr -q
my displays are LVDS1 and VGA1 indicating the connection port they use.

# How many displays do I have?
~$ xrandr -q | grep -c -w connected

# What are the positions (coordinates) of the displays?
they are given in ~$ xrandr -q in the form of XxY+W+H where the W and H are the x and y positions

# Which display has the edge panels?
the primary display has them. that is given by ~$ xrandr -q | grep -w primary

#What do I need?
  • I need the edge panes handled so they would not hide any portion of the maximized windows. --> partially done.
  • I need new scripts for moving a windows to either one of the displays.
  • I need the snap-to-sides scripts to work within the screen where the window actually is.
  • A next step would be if this whole thing would work by dragging the windows to the side of the screen, like on Microsoft Windows.
#References
#Tools (manpages)

How to reserve space for panel between monitors

I have two monitors set up above each other.
The primary monitor is the lower one, and has the two edge panels on the top and bottom of the display.
The setting looks something like this:
+---------------+
|               |
|               |
|               |
|               |
|-----------+---+
|'''''''''''|
|           |
|,,,,,,,,,,,|
+-----------+
However, when I maximize a window on the screen with the panels, the panel between the two screens gets ignored, and the window maximizes partially behind it, hiding the top of the window (where the controls are). The same thing happens with the bottom panel, if I switch the panels to the upper monitor.

I ran into this problem while trying to configure a snap-to script for a two monitor environment. Obviously, I had to sort this out before moving forward with the script.

The heart of the problem is the thing called "strut" which is basically a reserved space on the screen for a window.

Long story short, a strut for a window can be set with xprop.

You can find more information about the things I describe below on the xprop manpage, the ewmh reference page, and on the manpages of xwininfo, xrandr and grep.

Let's get started!

First you'll need some information about your screen setup to know what you're doing is right.

Get the size of your virtual screen (you can skip this):
xprop -root | egrep '^(_NET_WORKAREA)'


I got this (I have 4 workspaces, this is why the numbers appear four times in a row):
_NET_WORKAREA(CARDINAL) = 0, 0, 1280, 1792, 0, 0, 1280, 1792, 0, 0, 1280, 1792, 0, 0, 1280, 1792
So my screen is 1280x1792 pixels, and it's one big virtual screen alltogether.
I know that my upper screen is 1280x1024 in resolution, and the lower one is 1024x768. If I needed to check this with a command, I would use xrandr -q | grep '*'

Get the ID of the relevant panel (you'll have to click on the panel after you run this):
xwininfo | grep -w id


I got this:
xwininfo: Window id: 0x1600007 "Top Expanded Edge Panel"
Now I know the ID of the top panel is 0x1600007. I'll need this later.

Get an idea about the strut currently set for your panels (you can skip this):

xprop -id 0x1600007 | egrep '^(_NET_WM_STRUT_PARTIAL)'


I got this:
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 0, 0, 0, 0, 0, 0, 0, 1023, 0, 0

For a comparison, this is the same output for the bottom panel - notice the "24" in the fourth place:
_NET_WM_STRUT_PARTIAL(CARDINAL) = 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 1023

Now, plan your setting!
How to use ewmh _net_wm_strut_partial property?

The property you want to set is somewhat complicated. The lot of zeros and non-zeros you see above mean the following:
_NET_WM_STRUT_PARTIAL, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x,CARDINAL[12]/32

This is still very confusig. I could sort out these settings for myself thanks to this stackoverflow post.

The values are not independent of each other: they are groups. They have to be used together like this:
left & left_start_y & left_end_y
right & right_start_y & right_end_y
top & top_start_x & top_end_x
bottom & bottom_start_x & bottom_end_x
The trick is that you use only one group of values for one window setting. Choosing the one depends on the position you want the window to take.

I will show how to do this on my settings.
My screen dimensions are 1280x1792. The upper screen is 1280x1024, the lower is 1024x768 big.
If I want to reserve space on the bottom of this area, I will relate to this area with the "bottom" value group. So for a panel 1024x24 big, I'll use bottom = 24, bottom_start_x = 0, bottom_end_x = 1024. (because this is on my smaller screen).
Likewise, if I want to reserve space on the top of the two screen big area, I will relate to this area with the "top" value group. So for a panel 1024x24 big, I'll use top = 24, top_start_x = 0, top_end_x = 1280. (because this is on my bigger screen).
However, if I want to put the panel to the top of the lower, smaller screen, I will have to relate to the "left" group, because the left screen sides are the ones lined together (creating a dead area besides the right side of the lower screen).
Relating to the "left" group looks like this: left = 1024 (this is the width of my panel),  left_start_y = 1024 (this is the height of the upper screen), left_end_y= 1048 (this is left_start_y plus the height of my panel (24)).
Reserving space on the upper screen for the bottom panel could be done with the "left" group, but I will demonstrate it with the "right" group. It will be: right = 1280 (with of panel), right_start_y = 1000 (which is the height of the upper screen minus the height of the panel (24)), right_end_y = 1024 (height of upper screen).

Generally, you define left, right, top and bottom relative to the left, right, top and bottom edge of the whole virtual screen, and you define the rest of the values in the regular coordinate system, the top left corner of the whole screen being x=0, y=0, and the bottom right corner being x= full width, y= full height.

Now I have all the values I want to set, and all the information to set them.

I will use xprop -set to set them.
xprop -id 0x1600007 -f _NET_WM_STRUT_PARTIAL 32c -set _NET_WM_STRUT_PARTIAL 1024,0,0,0,1024,1048,0,0,0,0,0,0


The meaning of options are:

-id 0x1600007 (this is the window ID I got from xwininfo)
-f _NET_WM_STRUT_PARTIAL 32c (this is the format of the property I am about to set. for more info check out the manpage)
-set _NET_WM_STRUT_PARTIAL 1024,0,0,0,1024,1048,0,0,0,0,0,0 (this is the property and the values I am setting)

A future plan is to make the system automatically set this option for any kind of multi-monitor setup.

UPDATE: 
I wrote a script to calculate the position of the floating panel and set the strut for me (still manually):
#!/bin/bash
# (re)set panel struts on (different sized) dual monitor screen
#************************************************************
# what this script needs to do?
#############################################################
# PART 1
#************************************************************
# check if screen settings has been modified since the last time this script set the strut
## if yes: the panel position has to be recalculated
### check last modification date of /home/user/.config/monitors.xml
# check if panel strut has been removed anyhow (even when the screen setting has not changed)
## if yes: the strut has to be reset (to the previously used setting)
### comment: since strut gets removed by clicking the menu on the panel, how will it react it it is set back instantly
#############################################################
# PART 2
#************************************************************
# check for panel positions -- done
# set strut for panels -- done
#############################################################
# CONDITIONAL RUNNIG OF THE SCRIPT
# This script should work only if the full screen width < height, because this is the only case when the panel does not have a proper strut.
# Should this script run at all?
#read -a screen_geo < <(xwininfo -root | grep geometry | cut -f4 -s -d" " | awk 'BEGIN { FS="[x+]" } { print $1,$2 }')
#if [ "${screen_geo[0]}" -gt "${screen_geo[1]}" ]; then
#echo "this thingy should quit now, of stand by until screen settings are modified"
#else ### the program should modify the settings.
### however not this does nothing and the settings are modified anyway.
#fi
#############################################################
# PART 2
#************************************************************
# It should be decided which one is the floating panel, and the script should run editing only this panel.
# An array for all the panels (id numbers get in it)
read -a panels_id < <(wmctrl -l | grep "Panel" | awk '{ print $1 }' | tr '\n' ' ' | awk '{ print $1,$2}')
# Which panel is floating?
# A panel is floating if the first 4 values in the testpanel array are all 0.
for i in "${panels_id[@]}"; do
counter=0
read -a testpanel < <(xprop -id $i | egrep '^(_NET_WM_STRUT_PARTIAL)' | cut -f3- -d" " | awk 'BEGIN { FS="," } { print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 }') # 0 0 0 0 0 0 0 0 0 1023 0 0
#echo ${testpanel[*]}
 for j in "${testpanel[@]:0:4}"; do
  if [ "$j" -gt "0" ]; then
  let "counter = $counter + 1"
  fi
 done
 if [ $counter -lt "1" ]; then
 fl_id=$i
 fi
done
#echo $fl_id
# Get important values for the floating panel to work with: 
# geometry of the floating panel
read -a fl_geo < <(xwininfo -id $fl_id | grep geometry | cut -f4 -s -d" " | awk 'BEGIN { FS="[x+-]" } { print $1,$2,$3,$4 }') # 1024 24 0 1024
#echo ${fl_geo[*]}

# strut values of the floating panel
read -a fl_strut < <(xprop -id $fl_id | egrep '^(_NET_WM_STRUT_PARTIAL)' | cut -f3- -d" " | awk 'BEGIN { FS="," } { print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12 }') # 0 0 0 0 0 0 0 0 0 1023 0 0
#echo ${fl_strut[*]}

# Calculate correct strut position
# Should it be on the Left or on the Right? 
# The panel is on the left side if there is less than two value in the strut array greater than 0.
counter=0
for i in "${fl_strut[@]}"; do
 if [ "$i" -gt "0" ]; then
 let "counter = $counter + 1"
 fi
done
if [ $counter -lt "2" ]; then
side="left"
else
side="right"
fi
#echo $side
# Calculate the values for the strut position
# Usage: _NET_WM_STRUT_PARTIAL, left, right, top, bottom, left_start_y, left_end_y, right_start_y, right_end_y, top_start_x, top_end_x, bottom_start_x, bottom_end_x,CARDINAL[12]/32
left=0; right=0; top=0; bottom=0; left_start_y=0; left_end_y=0; right_start_y=0; right_end_y=0; top_start_x=0; top_end_x=0; bottom_start_x=0; bottom_end_x=0
# ${fl_geo[0]} width
# ${fl_geo[1]} height
# ${fl_geo[2]} x
# ${fl_geo[3]} y
if [ "$side" = "left" ]; then
left=${fl_geo[0]}
left_start_y=${fl_geo[3]}
left_end_y=$((${fl_geo[3]}+${fl_geo[1]}))
elif [ "$side" = "right" ]; then
right=${fl_geo[0]}
right_start_y=${fl_geo[3]}
right_end_y=$((${fl_geo[3]}+${fl_geo[1]}))
fi
# set correct strut for floating panel
# echo "xprop -id $fl_id -f _NET_WM_STRUT_PARTIAL 32c -set _NET_WM_STRUT_PARTIAL $left,$right,$top,$bottom,$left_start_y,$left_end_y,$right_start_y,$right_end_y,$top_start_x,$top_end_x,$bottom_start_x,$bottom_end_x"

xprop -id $fl_id -f _NET_WM_STRUT_PARTIAL 32c -set _NET_WM_STRUT_PARTIAL $left,$right,$top,$bottom,$left_start_y,$left_end_y,$right_start_y,$right_end_y,$top_start_x,$top_end_x,$bottom_start_x,$bottom_end_x

# set -x #activate debugging in normal run from here
# set +x #stop debugging in normal run from here
exit 0

2015. január 10.

Aero snap for Ubuntu 14.04 Flashback with Metacity

In this AskUbuntu post, a solution is described to have the Aero snap to left and right in Metacity Ubuntu. This AskUbuntu post, from the same user, is aiming to develop the solution further. I'll just cover the info from the first post here:

EDIT: I changed the code a little bit to fit my screen better.

You'll need to install two packages for this thing to work:
sudo apt-get install wmctrl xbindkeys

Than you'll need to create two scripts: one for snap left and one for snap right:
Create the files in terminal and give them right to execute by:
sudo touch /bin/snapleft.sh
sudo chmod ugoa+rx /bin/snapleft.sh
sudo touch /bin/snapright.sh
sudo chmod ugoa+rx /bin/snapright.sh 

Open the snapleft.sh by
sudo gedit /bin/snapleft.sh

Copy this text into it:
#!/bin/bash
sleep 0.1 && wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz && wmctrl -r :ACTIVE: -e 0,0,0,`xwininfo -root | grep Width | awk '{ print (($2/2)-2)}'`,`xwininfo -root | grep Height | awk '{ print $2 }'`

than save and close it.
Open the snapright.sh by
sudo gedit /bin/snapright.sh

Copy this text into it:
#!/bin/bash
sleep 0.1 && wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz && wmctrl -r :ACTIVE: -e 0,`xwininfo -root | grep Width | awk '{ print (($2/2))}'`,0,`xwininfo -root | grep Width | awk '{ print (($2/2))}'`,`xwininfo -root | grep Height | awk '{ print $2 }'`
than save and close it.

Now set the keyboard shortcuts with xbinkeys (to the left-side "super"/windows key and the left and right arrow keys) by
printf '"bash /bin/snapleft.sh"\n Mod4 + Super_L + Left\n' > ~/.xbindkeysrc 
printf '"bash /bin/snapright.sh"\n Mod4 + Super_L + Right\n' >> ~/.xbindkeysrc

You can check the name of a key (if something is amiss) with
xbindkeys -k


NEW STUFF:

To have a snap up and snap down function use the above guide with the following changes:

script name: snapup.sh
script content:
#!/bin/bash
sleep 0.1 && wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz && wmctrl -r :ACTIVE: -e 0,0,0,`xwininfo -root | grep Width | awk '{ print $2 }'`,`xwininfo -root | grep Height | awk '{ print (($2/2)-40)}'`
binding key: Mod4 + Super_L + Up

script name: snapdown.sh
script content:
#!/bin/bash
sleep 0.1 && wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz && wmctrl -r :ACTIVE: -e 0,0,`xwininfo -root | grep Height | awk '{ print (($2/2))}'`,`xwininfo -root | grep Width | awk '{ print $2 }'`,`xwininfo -root | grep Height | awk '{ print (($2/2)-40)}'`
binding key: Mod4 + Super_L + Down

Login screen - restore to default from ugly gray version

After my laptop shut down from suspended mode due to empty battery I experienced upon next login an ugly gray login-screen (fully functional) instead of the beautiful default unity login screen.

In trying to restore the default login screen, I learned that LightDM is responsible for running the display manager which starts the X servers, user sessions and greeter (which is the login screen). The one I'm missing is the Unity Greeter, which is default in Ubuntu 14.04.

Some forums suggested to reconfigure LightDM with
~$ sudo dpkg-reconfigure lightdm

and set lightdm to be the default DM.
I did this and did a logout, but it changed nothing.
Then I logged in again, and tried out the following (user configure LightDM), but then I rebooted the machine, and the the unity login screen was back, and then I reversed the changes I made in the LightDM myconfig, and rebooted again, and the unity login screen was still there, so apparently the LightDM reconfigure solved the problem for me.

As I learned from LightDM Ubuntu Wiki page, LightDM configuration can be overridden with user configuration.

To open the example file showing all the possible configuration:
~$ gedit /usr/share/doc/lightdm/lightdm.conf.gz


To create the user conf file:
~$ sudo mkdir /etc/lightdm/lightdm.conf.d

~$ sudo touch /etc/lightdm/lightdm.conf.d/50-myconfig.conf


To edit the user conf file:
~$ sudo gedit /etc/lightdm/lightdm.conf.d/50-myconfig.conf


I just copied the example file content in gedit my config file and edited the relevant section.
To edit the greeter, you'll have to edit the "greeter-session" in "[SeatDefaults]" section.

in [SeatDefaults] section, there is a line
#greeter-session=example-gtk-gnome


uncomment this line by removing the #, and change "example-gtk-gnome" to one of the greeters available to you.
You can check available greeters by
~$ ls /usr/share/xgreeters/

greeters have an extension .desktop, their name is the one before the extension.
To use unity-greeter, you'll need the line
greeter-session=unity-greeter

to be in your user config file.

Restart your computer to try it out, if logging out does not show any changes.

2015. január 9.

How to change the date/time format

To customize the format of time and date displayed on the top panel indicator, and set a different format than any other locale format, you'll have to edit manually from dconf Editor.

Open dconf Editor:
~$ dconf-editor

Navigate to com > canonical > indicator > datetime

1. Set "time-format" to "custom"
2. Set "custom-time-format" to the format you want.
3. Make sure that "show-clock" is check-marked.

To check out available formatting options, see the manpage of strftime.
~$ man strftime

My setting is %Y-%m-%d %H:%M:%S
Which looks like this: 2015-01-09 09:04:51

My other favorite setting is %Y.%m.%d. %a. %H:%M:%S
Which looks like this: 2015.07.02. cs. 09:04:51 (where cs. is the local abbreviation of Thursday)

With the custom date-time format you can still use the options for the calendar (show-calendar, etc.), but the options for the clock will make no change on the displayed custom time-date format.