├── .gitignore ├── AWN ├── DockBarX.desktop └── DockBarX │ └── DockBarX.py ├── CHANGELOG ├── DockX.desktop ├── GNOME_DockBarXApplet.server ├── README.md ├── Theming HOWTO ├── dbx_preference ├── dbx_preference.desktop ├── dockbarx ├── __init__.py ├── applets.py ├── cairowidgets.py ├── common.py ├── dbx_dbus.py ├── dockbar.py ├── dockmanager.py ├── groupbutton.py ├── i18n.py ├── iconfactory.py ├── log.py ├── mediabuttons.py ├── theme.py ├── unity.py ├── windowbutton.py └── zg.py ├── dockbarx_factory ├── dockx ├── dockx_applets ├── Creating applets ├── appindicator.applet ├── appindicator.py ├── battery_status.applet ├── battery_status.py ├── cardapio.applet ├── cardapio_dbx.py ├── clock.applet ├── clock.py ├── hello_world.applet ├── hello_world.py ├── namebar.applet ├── namebar.py ├── namebar_themes │ ├── Dust-ish.tar.gz │ ├── Human-ish.tar.gz │ └── New Wave-ish.tar.gz ├── namebar_window_buttons.applet ├── namebar_window_buttons.py ├── namebar_window_title.applet ├── namebar_window_title.py ├── vc-themes │ ├── Black │ │ ├── index.theme │ │ └── scalable │ │ │ ├── audio-volume-1.svg │ │ │ ├── audio-volume-100.svg │ │ │ ├── audio-volume-14.svg │ │ │ ├── audio-volume-21.svg │ │ │ ├── audio-volume-29.svg │ │ │ ├── audio-volume-36.svg │ │ │ ├── audio-volume-43.svg │ │ │ ├── audio-volume-50.svg │ │ │ ├── audio-volume-57.svg │ │ │ ├── audio-volume-64.svg │ │ │ ├── audio-volume-71.svg │ │ │ ├── audio-volume-79.svg │ │ │ ├── audio-volume-86.svg │ │ │ ├── audio-volume-93.svg │ │ │ └── audio-volume-muted.svg │ └── Minimal │ │ ├── index.theme │ │ └── scalable │ │ ├── audio-volume-1.svg │ │ ├── audio-volume-100.svg │ │ ├── audio-volume-14.svg │ │ ├── audio-volume-21.svg │ │ ├── audio-volume-29.svg │ │ ├── audio-volume-36.svg │ │ ├── audio-volume-43.svg │ │ ├── audio-volume-50.svg │ │ ├── audio-volume-57.svg │ │ ├── audio-volume-64.svg │ │ ├── audio-volume-71.svg │ │ ├── audio-volume-79.svg │ │ ├── audio-volume-86.svg │ │ ├── audio-volume-93.svg │ │ └── audio-volume-muted.svg ├── volume-control.applet ├── volume-control.py └── volume-control.ui ├── icons └── hicolor │ ├── 128x128 │ └── apps │ │ └── dockbarx.png │ ├── 16x16 │ └── apps │ │ └── dockbarx.png │ ├── 22x22 │ └── apps │ │ └── dockbarx.png │ ├── 24x24 │ └── apps │ │ └── dockbarx.png │ ├── 36x36 │ └── apps │ │ └── dockbarx.png │ ├── 48x48 │ └── apps │ │ └── dockbarx.png │ ├── 64x64 │ └── apps │ │ └── dockbarx.png │ ├── 72x72 │ └── apps │ │ └── dockbarx.png │ └── 96x96 │ └── apps │ └── dockbarx.png ├── make_translate_template.sh ├── msgfmt.py ├── po-themes ├── bg.po ├── cs.po ├── da.po ├── de.po ├── dockbarx-themes.pot ├── el.po ├── en_GB.po ├── es.po ├── eu.po ├── fi.po ├── fr.po ├── hu.po ├── it.po ├── ja.po ├── ko.po ├── lt.po ├── nl.po ├── pl.po ├── pt_BR.po ├── ro.po ├── ru.po ├── sk.po ├── sv.po ├── th.po ├── uk.po ├── zh_CN.po └── zh_TW.po ├── po ├── ar.po ├── bg.po ├── cs.po ├── da.po ├── de.po ├── dockbarx.pot ├── el.po ├── en_GB.po ├── es.po ├── eu.po ├── fi.po ├── fr.po ├── hu.po ├── id.po ├── it.po ├── ja.po ├── ko.po ├── lt.po ├── nl.po ├── pl.po ├── pt.po ├── pt_BR.po ├── ro.po ├── ru.po ├── sk.po ├── sv.po ├── tr.po ├── uk.po ├── zh_CN.po └── zh_TW.po ├── setup.py └── themes ├── Colors.tar.gz ├── Deep.tar.gz ├── Glass_DMD.tar.gz ├── Magic_trans.tar.gz ├── dock ├── Colors.tar.gz ├── Glass_DMD.tar.gz ├── Magic_trans.tar.gz ├── dbx.tar.gz ├── deep.tar.gz ├── folded.tar.gz ├── glass-dock.tar.gz └── invisible.tar.gz ├── dockxyz.tar.gz ├── glassified.tar.gz ├── popup_styles ├── Colors.tar.gz ├── DMD_Glass.tar.gz ├── Elegance.tar.gz ├── Magic_trans.tar.gz ├── Radiance.tar.gz ├── dbx.tar.gz ├── deep.tar.gz ├── gradent.tar.gz ├── old.tar.gz └── square.tar.gz └── sunny-c.tar.gz /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | eggs/ 15 | lib/ 16 | lib64/ 17 | parts/ 18 | sdist/ 19 | var/ 20 | *.egg-info/ 21 | .installed.cfg 22 | *.egg 23 | 24 | # Installer logs 25 | pip-log.txt 26 | pip-delete-this-directory.txt 27 | 28 | # Unit test / coverage reports 29 | htmlcov/ 30 | .tox/ 31 | .coverage 32 | .cache 33 | nosetests.xml 34 | coverage.xml 35 | -------------------------------------------------------------------------------- /AWN/DockBarX.desktop: -------------------------------------------------------------------------------- 1 | 2 | [Desktop Entry] 3 | Version=1.0 4 | Name=DockBarX 5 | Type=Application 6 | X-AWN-AppletType=Python 7 | Comment=DockBar for AWN 8 | X-AWN-AppletExec=DockBarX/DockBarX.py 9 | Exec=awn-applet -p %k 10 | Icon=dockbarx 11 | X-AWN-AppletCategory=Utility 12 | Name[sv_FI]=DockBarX 13 | -------------------------------------------------------------------------------- /AWN/DockBarX/DockBarX.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # DockBarX.py 4 | # 5 | # Copyright 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | import awn 21 | import dockbarx.dockbar 22 | from dockbarx.common import Globals 23 | import gobject 24 | import weakref 25 | import time 26 | import sys 27 | import gtk 28 | import wnck 29 | import dbus 30 | import dbus.service 31 | 32 | WNCK_WINDOW_STATE_MINIMIZED = 1 33 | 34 | class DockBarApp (awn.AppletSimple): 35 | def __init__ (self, uid, panel_id): 36 | awn.AppletSimple.__init__(self, "DockbarX", uid, panel_id) 37 | self.set_icon_name("gtk-apply") 38 | gobject.idle_add(self.__on_idle) 39 | self.db_loaded = False 40 | self.awn_applet_dbus = AWNappletDBus(self) 41 | 42 | 43 | def __on_idle(self): 44 | self.globals = Globals() 45 | self.autohide_sid = None 46 | self.should_autohide = True 47 | self.hide_inhibit_cookie = None 48 | self.geometry_time = 0 49 | self.last_geometry_window = lambda: None 50 | self.windows = weakref.WeakKeyDictionary() 51 | self.border_distances = weakref.WeakKeyDictionary() 52 | self.old_child = self.get_child() 53 | self.wnck_screen = wnck.screen_get_default() 54 | gdk_screen = gtk.gdk.screen_get_default() 55 | self.icon = self.get_icon() 56 | self.remove(self.old_child) 57 | self.alignment = gtk.Alignment() 58 | self.add(self.alignment) 59 | self.alignment.show() 60 | self.db = dockbarx.dockbar.DockBar(self) 61 | self.db.set_parent_window_reporting(True) 62 | self.db.load() 63 | 64 | # Inactive dockbarx's size overflow management 65 | self.db.set_max_size(3000) 66 | 67 | if self.get_pos_type() == gtk.POS_RIGHT: 68 | self.db.set_orient("right") 69 | self.alignment.set(1, 0, 0, 0) 70 | elif self.get_pos_type() == gtk.POS_TOP: 71 | self.db.set_orient("up") 72 | self.alignment.set(0, 0, 0, 0) 73 | elif self.get_pos_type() == gtk.POS_LEFT: 74 | self.db.set_orient("left") 75 | self.alignment.set(0, 0, 0, 0) 76 | else: 77 | self.db.set_orient("down") 78 | self.alignment.set(0, 1, 0, 0) 79 | container = self.db.get_container() 80 | if self.db.get_orient() in ("down", "up"): 81 | container.set_size_request(-1, self.get_size() + \ 82 | self.icon.get_offset() + 5) 83 | else: 84 | container.set_size_request(self.get_size() + \ 85 | self.icon.get_offset() + 5, -1) 86 | self.alignment.add(container) 87 | self.connect("size-changed", self.__on_size_changed) 88 | self.connect("offset-changed", self.__on_size_changed) 89 | self.connect("position-changed", self.__on_position_changed) 90 | self.globals.connect("awn-behavior-changed", 91 | self.__on_behavior_changed) 92 | container.show_all() 93 | self.show() 94 | self.wnck_screen.connect("active-window-changed", 95 | self.__on_active_window_changed) 96 | gobject.timeout_add(200, self.__update_autohide) 97 | for window in self.db.get_windows(): 98 | self.add_window(window) 99 | self.db_loaded = True 100 | self.__compute_should_autohide() 101 | 102 | def __on_size_changed(self, *args): 103 | container = self.db.get_container() 104 | if self.db.get_orient() in ("down", "up"): 105 | container.set_size_request(-1, self.get_size() + \ 106 | self.icon.get_offset() + 5) 107 | else: 108 | container.set_size_request(self.get_size() + \ 109 | self.icon.get_offset() + 5, -1) 110 | self.__compute_should_autohide() 111 | 112 | def __on_position_changed(self, applet, position): 113 | self.alignment.remove(self.db.get_container()) 114 | if self.get_pos_type() == gtk.POS_RIGHT: 115 | self.db.set_orient("right") 116 | self.alignment.set(1, 0, 0, 0) 117 | elif self.get_pos_type() == gtk.POS_TOP: 118 | self.db.set_orient("up") 119 | self.alignment.set(0, 0, 0, 0) 120 | elif self.get_pos_type() == gtk.POS_LEFT: 121 | self.db.set_orient("left") 122 | self.alignment.set(0, 0, 0, 0) 123 | else: 124 | self.db.set_orient("down") 125 | self.alignment.set(0, 1, 0, 0) 126 | container = self.db.get_container() 127 | if self.db.get_orient() in ("up", "down"): 128 | container.set_size_request(-1, self.get_size() + \ 129 | self.icon.get_offset() + 5) 130 | else: 131 | container.set_size_request(self.get_size() + \ 132 | self.icon.get_offset() + 5, -1) 133 | self.alignment.add(container) 134 | container.show_all() 135 | self.show() 136 | self.__compute_should_autohide() 137 | 138 | #### Autohide stuff 139 | def add_window(self, window, reset_should_autohide=True): 140 | geo_sid = window.connect("geometry-changed", 141 | self.__on_window_geometry_changed) 142 | state_sid = window.connect("state-changed", 143 | self.__on_window_state_changed) 144 | self.windows[window] = (geo_sid, state_sid) 145 | self.__calc_border_distance(window) 146 | if self.db_loaded and reset_should_autohide: 147 | self.__compute_should_autohide() 148 | 149 | def remove_window(self, window, reset_should_autohide=True, forced=False): 150 | if window in self.border_distances: 151 | del self.border_distances[window] 152 | if window in self.windows: 153 | sids = self.windows.pop(window) 154 | if sids is not None: 155 | window.disconnect(sids[0]) 156 | window.disconnect(sids[1]) 157 | if reset_should_autohide: 158 | self.__compute_should_autohide() 159 | 160 | def __update_autohide(self): 161 | if self.should_autohide and self.globals.shown_popup() is None: 162 | if self.hide_inhibit_cookie is not None: 163 | self.uninhibit_autohide(self.hide_inhibit_cookie) 164 | self.hide_inhibit_cookie = None 165 | else: 166 | if self.hide_inhibit_cookie is None: 167 | self.hide_inhibit_cookie = self.inhibit_autohide( 168 | "dbx intellihide") 169 | return True 170 | 171 | def __on_window_state_changed(self, wnck_window,changed_mask, new_state): 172 | if WNCK_WINDOW_STATE_MINIMIZED & changed_mask: 173 | self.__compute_should_autohide() 174 | 175 | def __on_window_geometry_changed(self, window): 176 | if time.time() - self.geometry_time < 0.12 and \ 177 | window == self.last_geometry_window(): 178 | # Same window get multiple calls when the geometry changes 179 | # In that case, just return. 180 | return 181 | self.last_geometry_window = weakref.ref(window) 182 | self.geometry_time = time.time() 183 | gobject.timeout_add(120, self.__calc_border_distance, window, True) 184 | 185 | def __on_active_window_changed(self, screen, previous_active_window): 186 | if self.globals.settings["awn/behavior"] == "dodge active window": 187 | self.__compute_should_autohide() 188 | 189 | def __on_behavior_changed(self, *args): 190 | self.__compute_should_autohide() 191 | 192 | def __calc_border_distance(self, window, reset_should_autohide=False): 193 | bd = {"left": 1000, "right": 1000, "top": 1000, "bottom": 1000} 194 | x, y, w, h = window.get_geometry() 195 | gdk_screen = gtk.gdk.screen_get_default() 196 | monitor = gdk_screen.get_monitor_at_point(x + (w / 2), y + (h / 2)) 197 | if monitor != self.get_monitor(): 198 | return 199 | mx, my, mw, mh = self.get_monitor_geometry() 200 | if y < my + mh and y + h > my: 201 | if x + w > mx: 202 | bd["left"] = x - mx 203 | if x < mx + mw: 204 | bd["right"] = mx + mw - x - w 205 | if x < mx + mw and x + w > mx: 206 | if y + h > my: 207 | bd["top"] = y - my 208 | if y < my + mh: 209 | bd["bottom"] = my + mh - y - h 210 | self.border_distances[window] = bd 211 | if reset_should_autohide: 212 | self.__compute_should_autohide() 213 | 214 | def __compute_should_autohide(self): 215 | pos = ("left", "right", "top", "bottom")[self.get_pos_type()] 216 | size = self.get_size() + self.icon.get_offset() + 2 217 | self.behavior = self.globals.settings["awn/behavior"] 218 | if not self.behavior in ("dodge windows", "dodge active window"): 219 | self.should_autohide = True 220 | return True 221 | self.should_autohide = False 222 | active_workspace = self.wnck_screen.get_active_workspace() 223 | for window in self.db.get_windows(): 224 | if window.is_minimized(): 225 | continue 226 | if self.behavior == "dodge active window" and \ 227 | not window.is_active(): 228 | continue 229 | if window.get_workspace() != active_workspace: 230 | continue 231 | border_distance = self.border_distances.get(window) 232 | if border_distance is None: 233 | continue 234 | if border_distance[pos] < size: 235 | self.should_autohide = True 236 | break 237 | return self.should_autohide 238 | 239 | def get_monitor(self): 240 | screen = self.get_screen() 241 | if screen is None: 242 | screen = gtk.gdk.screen_get_default() 243 | return screen.get_monitor_at_window(self.window) 244 | 245 | def get_monitor_geometry(self): 246 | screen = self.get_screen() 247 | if screen is None: 248 | screen = gtk.gdk.screen_get_default() 249 | monitor = screen.get_monitor_at_window(self.window) 250 | return screen.get_monitor_geometry(monitor) 251 | 252 | def reload(self=None): 253 | self.db_loaded = False 254 | self.db.reload() 255 | self.db_loaded = True 256 | 257 | def readd_container(self, container): 258 | # Dockbar calls back to this function when it is reloaded 259 | if self.db.get_orient() in ("up", "down"): 260 | container.set_size_request(-1, self.get_size() + \ 261 | self.icon.get_offset() + 5) 262 | else: 263 | container.set_size_request(self.get_size() + \ 264 | self.icon.get_offset() + 5, -1) 265 | self.alignment.add(container) 266 | container.show_all() 267 | self.__compute_should_autohide() 268 | 269 | 270 | 271 | class AWNappletDBus(dbus.service.Object): 272 | 273 | def __init__(self, applet): 274 | self.bus_name = "org.dockbar.AWNapplet" 275 | if "org.dockbar.AWNapp" in dbus.SessionBus().list_names(): 276 | for n in range(1, 100): 277 | name = "org.dockbar.AWNapplet%s" % n 278 | if not name in dbus.SessionBus().list_names(): 279 | self.bus_name = name 280 | break 281 | self.applet_r = weakref.ref(applet) 282 | bus_name = dbus.service.BusName(self.bus_name, 283 | bus = dbus.SessionBus()) 284 | dbus.service.Object.__init__(self, bus_name, 285 | "/org/dockbar/AWNapplet") 286 | 287 | @dbus.service.method(dbus_interface="org.dockbar.AWNapplet", 288 | in_signature="", out_signature="",) 289 | def Reload(self): 290 | self.applet().reload() 291 | 292 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 293 | in_signature='ss', out_signature='v') 294 | def Get(self, interface_name, property_name): 295 | return self.GetAll(interface_name)[property_name] 296 | 297 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 298 | in_signature='s', out_signature='a{sv}') 299 | def GetAll(self, interface_name): 300 | if interface_name == "org.dockbar.AWNapplet": 301 | return {} 302 | else: 303 | raise dbus.exceptions.DBusException( 304 | 'com.example.UnknownInterface', 305 | 'The Foo object does not implement the %s interface' 306 | % interface_name) 307 | 308 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 309 | in_signature='ssv', out_signature='') 310 | def Set(self, interface_name, property_name, property_value): 311 | pass 312 | 313 | @dbus.service.signal(dbus_interface=dbus.PROPERTIES_IFACE, 314 | signature='sa{sv}as') 315 | def PropertiesChanged(self, interface_name, changed_properties, 316 | invalidated_properties): 317 | pass 318 | 319 | if __name__ == "__main__": 320 | awn.init(sys.argv[1:]) 321 | applet = DockBarApp(awn.uid, awn.panel_id) 322 | awn.embed_applet(applet) 323 | applet.show_all() 324 | gtk.main() 325 | -------------------------------------------------------------------------------- /DockX.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=DockX 3 | GenericName=Dock for DockbarX 4 | Comment=Stand-alone dock for DockbarX 5 | Exec=dockx 6 | Icon=dockbarx 7 | Terminal=false 8 | Type=Application 9 | Categories=Utility; 10 | Name[sv]=DockX 11 | -------------------------------------------------------------------------------- /GNOME_DockBarXApplet.server: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DockbarX 2 | ### Version 0.93 3 | 4 | ## About DockbarX 5 | DockBarX is a lightweight taskbar / panel replacement for Linux which works as a stand-alone dock (called DockX), as an an Avant Window Navigator applet, as a Xfce4 panel applet[^1], as a matepanel applet[^2] or as a legacy gnome2 panel applet. DockbarX is a fork of dockbar made by Aleksey Shaferov. DockbarX branch is developed by Matias Särs. 6 | 7 | DockbarX is free software and is licensed under GPL3. 8 | 9 | ## Install in Ubuntu from ppa 10 | The main DockbarX ppa is not maintained for the moment. You can use Xu Zhen's unofficial DockbarX ppa instead. To add the ppa and install the application in Ubuntu (and derivatives), use the following commands: 11 | 12 | ``` 13 | sudo add-apt-repository ppa:xuzhen666/dockbarx 14 | sudo apt-get update 15 | sudo apt-get install dockbarx 16 | ``` 17 | 18 | If you want to use dockbarx as a Xfce panel applet you also need this command 19 | 20 | ``` 21 | sudo apt-get install xfce4-dockbarx-plugin 22 | ``` 23 | 24 | To get more themes for DockbarX and DockX use this command 25 | 26 | ``` 27 | sudo apt-get install dockbarx-themes-extra 28 | ``` 29 | 30 | ## Install in archlinux 31 | There is an aur for DockbarX 32 | 33 | https://aur.archlinux.org/packages/dockbarx/ 34 | 35 | And there is also one for xfce4-dockbarx-plugin 36 | 37 | https://aur.archlinux.org/packages/xfce4-dockbarx-plugin/ 38 | 39 | ## Manual Installation 40 | 41 | 1. Following dependecies needs to be installed: 42 | - zeitgeist, python-wnck, python-imaging, python-keybinder and python-xlib. 43 | - Install python-gnomeapplet if you want to use DockbarX as a gnome-panel applet (gnome2) you should install python-gnomeapplet. (This doesn't work in newer releases of Ubuntu.) 44 | - To use dockbarx as an AWN applet, you also need to copy the content of the AWN folder to ~/.config/awn/applets. 45 | - Some of the stand alone dock applets require dependencies: 46 | - Cardapio applet: Cardapio 47 | - Appindicators: indicator-application 48 | - To use DockManager helpers, you need to install dockmanager and dockmanager-daemon as well as libdesktop-agnostic-cfg-gconf and libdesktop-agnostic-vfs-gio. The last two might not need to be installed separately on distributions that aren't Debian based. 49 | 2. Extract dockbarx. Change directory to where you extracted dockbarx and run the setup.py install `$ sudo ./setup.py install` 50 | 51 | ## Usage 52 | To start DockbarX you can 53 | - To run DockbarX as a stand alone dock use the command `dockx`. 54 | - For gnomepanel or matepanel applet, simply add DockBarX applet to the panel (kill the panel or re-login first if necessary). 55 | - For XFCE panel you need to [xfce-dockbarx-plugin] (https://github.com/TiZ-EX1/xfce4-dockbarx-plugin), if you haven't installed it already. Click the link for further usage information. 56 | 57 | The preferences dialog of DockbarX can be found from your applications menu or (if you use DockX or mate-/xfce-/gnome-applet) by right clicking and choosing Preferences. 58 | 59 | **NOTE!** To use previews with Compiz you need to activate KDE Compability in compiz settings manager and under KDE Compability check "Support Plasma Thumbnails". *You can **not** use previews with other window manager than Compiz and Kwin.* 60 | 61 | ## Contribute 62 | DockbarX is a free and open source project I am developing in my free time. I will gladly accept any help I can get to improve DockbarX. Test out new code, **report bugs** to the issue tracker and make pull request with code you like to contribute. 63 | 64 | You can also translate DockbarX into your language at [DockbarX launchpad translation page](https://translations.launchpad.net/dockbar). DockbarX is translated into many languages but few of the translations are complete. Even if DockbarX should be fully translated into your language at the moment, you could check in after a new release is out to see if there some new words that needs translating. 65 | 66 | ##FAQ 67 | *Q: Why do you want to make Linux into a Microsoft Windows 7 clone?* 68 | 69 | A: I don't. The goal of DockbarX isn't to be a clone of the Windows 7 task bar. Windows 7 task bar has a good principle, though. When it comes to your most used programs it's more productive to do all window handling - launching, selecting, closing, etc. from the same few pixels. If I need a Firefox window I move my mouse cursor to the same spot on the screen regardless of which Firefox window I want and or if I even have not opened a Firefox window yet. This behavior is good and it would be stupid not to implement it just because "Windows had it first". Don't reduce your productivity out of stubbornness. When it comes to looks it's up to you to choose a theme that looks like windows 7 or a theme that doesn't look that way. 70 | 71 | Here are some historical references about docks: 72 | 73 | http://en.wikipedia.org/wiki/Dock_(computing) 74 | http://en.wikipedia.org/wiki/Icon_bar 75 | 76 | And another interesting link that has had quite a bit of infuence on my work with DockbarX: 77 | http://arstechnica.com/software/news/2009/01/dock-and-windows-7-taskbar.ars 78 | 79 | *Q: I want a button for every window instead of all windows of the same application grouped together under one button. When will DockbarX support that?* 80 | 81 | A: Never. That would demand quite a bit of restructuring of the code and I believe it's less productive to keep the windows ungrouped. You are welcome to change the code yourself if you don't like my decision, or try the applet Talika it might suit your needs better than DockbarX does. 82 | 83 | *Q: I added a new launcher for program X but when I click on the launcher a new groupbutton is made for the window instead of using the groupbutton of the launcher. What went wrong?* 84 | 85 | A: Dockbarx connects group buttons and windows by using the resource class name of the application. When a launcher is added dockbarx tries to guess the resource class name of that launcher. This works in most cases but not always. Apparently it didn't work for your program X. To fix this, right click on the launcher for program X and choose "Edit Resource name" and enter the correct resource name. If the program is already running you should be able to find it's resource class name in the drop-down list. 86 | 87 | *Q: There is no menu option to pin program X, but there is one for program Y and Z. Why?* 88 | A: Dockbarx wasn't able to identify program X correctly then. You can "pin" the program by dragging it's icon from the gnome menu instead. Oh, and you will probably have to enter the resource name manually as well (see previous question). 89 | 90 | *Q: How do I get to preference dialog?* 91 | 92 | A: Right click the handle (the dots or lines to the left of dockbarx) to get a menu where you can choose the preference option. Sometimes though, you have to double right click the handle to get the menu. Don't ask me why - just do it. You can also find the preference dialog from gnome menu (in Accessories). 93 | 94 | *Q: None of DockbarX's compiz stuff like "compiz scale" work. Why?* 95 | 96 | A: Make sure you enable the GLib extension in Compiz settings manager and that the compiz plugin dockbarx uses is activated as well. (eg. for group button action "compiz scale" to work you need the scale plugin activated) 97 | 98 | *Q: Opacify doen't work?* 99 | 100 | A: A common misunderstanding is that opacify should have something to do with transparency of dockbarx itself, it doesn't. Opacify is a way to find localize a window with dockbar. When opacify is on and you roll over a name in the window list with the mouse, all other windows will become transparent so that you easy can spot the window. 101 | 102 | *Q: How do I install a theme?* 103 | 104 | A: If you find a theme on the web that you like, copy the file (should be SOMETHING.tar.gz) to ~/.dockbarx/themes or /usr/share/dockbarx/themes. You change themes in the appearance tab of preference dialog. You might need to press the reload button before your newly installed theme shows up. 105 | 106 | *Q: How can I make an theme of my own?* 107 | 108 | A: Read Theming HOWTO. If you need help ask me (Matias Särs alias M7S) on gnome-look or at launchpad. I'm happy to help theme developers as much as I can. 109 | 110 | *Q: How can I backup and restore all preferences to move my settings to another linux setup.* 111 | A: backup: gconftool --dump /apps/dockbarx > dockbarx.xml 112 | restore: gconftool --load dockbarx.xml 113 | and don't forget to copy ~/.dockbarx 114 | 115 | ### AWN questions 116 | *Q: When I use dockbarx in AWN, IntelliHide and Window Dodge behaviors doesn't work. Why? Can I do anything about it?* 117 | 118 | A: For IntelliHide and Window Dodge to work, AWN Taskmanager applet has to be activated. So to get back IntelliHide or Window Dodge, simply add Taskmanager to your applet list again. If you think using Taskmanager and DockbarX at the same time looks a bit weird, you can go to the Task Manager tab of AWN preference and check the option "Display launchers only" and then remove all the launchers in the list. That will give you a completely invisible Taskmanager that will make sure IntelliHide and Window Dodge works as they should. 119 | 120 | [^1]: Using [xfce-dockbarx-plugin] (https://github.com/TiZ-EX1/xfce4-dockbarx-plugin) 121 | 122 | [^2]: DockbarX doesn't work in mate 1.6 and later at the moment. 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /dbx_preference.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=DockbarX Preference 3 | GenericName=Preference Dialog 4 | Comment=Preference dialog for DockbarX 5 | Exec=dbx_preference 6 | Icon=dockbarx 7 | Terminal=false 8 | Type=Application 9 | Categories=Utility; 10 | GenericName[sv]=Preferences Dialog 11 | -------------------------------------------------------------------------------- /dockbarx/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | __all__ = ["dockbar", 4 | "groupbutton", 5 | "windowbutton", 6 | "cairowidgets", 7 | "icon_factory", 8 | "theme", 9 | "common", 10 | "i18n", 11 | "mediabuttons", 12 | "zg"] 13 | -------------------------------------------------------------------------------- /dockbarx/applets.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # DockbarX applets 4 | # 5 | # Copyright 2011 Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see = len(lines): 113 | text = "Applet %s in file %s has no description" % (name, path) 114 | return None, text 115 | settings["description"] = "\n".join(lines[description_nr:]) 116 | return settings, None 117 | 118 | def get(self, name): 119 | e = self.applets[name]["exec"] 120 | iname, ext = os.path.splitext(os.path.split(e)[-1]) 121 | path = os.path.join(self.applets[name]["dir"], e) 122 | try: 123 | applet = imp.load_source(iname, path) 124 | except: 125 | message = "Error: Could not load applet from %s. " % path 126 | message += "Could not import the script." 127 | logger.exception(message) 128 | return 129 | return applet 130 | 131 | def get_description(self, name): 132 | try: 133 | return self.applets[name]["description"] 134 | except: 135 | return "" 136 | 137 | def get_list(self): 138 | try: 139 | old_list = GCONF_CLIENT.get_list(GCONF_DIR + \ 140 | "/applets/applet_list", 141 | gconf.VALUE_STRING) 142 | except: 143 | raise 144 | GCONF_CLIENT.set_list(GCONF_DIR + "/applets/applet_list", 145 | gconf.VALUE_STRING, 146 | ["DockbarX"]) 147 | return ["DockbarX"] 148 | all_applets = self.applets.keys() + ["DockbarX", "Spacer"] 149 | applet_list = [a for a in old_list if a in all_applets] 150 | if not "DockbarX" in applet_list: 151 | applet_list.append("DockbarX") 152 | if applet_list != old_list: 153 | GCONF_CLIENT.set_list(GCONF_DIR + "/applets/applet_list", 154 | gconf.VALUE_STRING, 155 | applet_list) 156 | return applet_list 157 | 158 | def get_unused_list(self): 159 | try: 160 | applet_list = GCONF_CLIENT.get_list(GCONF_DIR + \ 161 | "/applets/applet_list", 162 | gconf.VALUE_STRING) 163 | except: 164 | GCONF_CLIENT.set_list(GCONF_DIR + "/applets/applet_list", 165 | gconf.VALUE_STRING, 166 | ["DockbarX"]) 167 | applet_list = ["DockbarX"] 168 | all_applets = self.applets.keys() 169 | unused_applets = [a for a in all_applets if a not in applet_list] 170 | # There should be totally two spacers. 171 | while (unused_applets + applet_list).count("Spacer") < 2: 172 | unused_applets.append("Spacer") 173 | return unused_applets 174 | 175 | 176 | def set_list(self, applet_list): 177 | all_applets = self.applets.keys() + ["DockbarX", "Spacer"] 178 | applet_list = [a for a in applet_list if a in all_applets] 179 | if not "DockbarX" in applet_list: 180 | applet_list.append("DockbarX") 181 | GCONF_CLIENT.set_list(GCONF_DIR+"/applets/applet_list", 182 | gconf.VALUE_STRING, 183 | applet_list) 184 | 185 | # Functions used by both DockXApplet and DockXAppletDialog 186 | def set_setting(key, value, list_type=None, applet_name=None): 187 | if applet_name is None: 188 | return 189 | gdir = "%s/applets/%s" % (GCONF_DIR, applet_name) 190 | gconf_set = { str: GCONF_CLIENT.set_string, 191 | bool: GCONF_CLIENT.set_bool, 192 | float: GCONF_CLIENT.set_float, 193 | int: GCONF_CLIENT.set_int } 194 | if type(value) == list: 195 | list_types = { str: gconf.VALUE_STRING, 196 | bool: gconf.VALUE_BOOL, 197 | float: gconf.VALUE_FLOAT, 198 | int: gconf.VALUE_INT } 199 | if len(value) == 0: 200 | if type(list_type) in list_types: 201 | lt = list_types[type(list_type)] 202 | else: 203 | lt = GCONF_CLIENT.set_string 204 | else: 205 | for v in values: 206 | if v != value[0]: 207 | raise ValueError( 208 | "All values in the list must be of the same sort") 209 | lt = list_types[type(value[0])] 210 | GCONF_CLIENT.set_list(GCONF_DIR + "/applets/applet_list", 211 | list_types, VALUE) 212 | 213 | else: 214 | if type(value) not in gconf_set: 215 | raise ValueError( 216 | "The value must be a string, bool, int or list") 217 | gconf_set[type(value)]("%s/%s" % (gdir, key), value) 218 | 219 | 220 | def get_setting(key, default=None, applet_name=None): 221 | if applet_name is None: 222 | return 223 | gdir = "%s/applets/%s" % (GCONF_DIR, applet_name) 224 | try: 225 | value = GCONF_CLIENT.get_value("%s/%s" % (gdir, key)) 226 | except: 227 | if default is not None: 228 | set_setting(key, default, applet_name=applet_name) 229 | return default 230 | return value 231 | 232 | 233 | def get_value(value): 234 | if value.type == gconf.VALUE_LIST: 235 | return [get_value(item) for item in value.get_list()] 236 | else: 237 | return { 238 | "string": value.get_string, 239 | "int": value.get_int, 240 | "float": value.get_float, 241 | "bool": value.get_bool, 242 | "list": value.get_list 243 | }[value.type.value_nick]() 244 | 245 | class DockXApplet(gtk.EventBox): 246 | """This is the base class for DockX applets""" 247 | 248 | __gsignals__ = {"clicked": (gobject.SIGNAL_RUN_FIRST, 249 | gobject.TYPE_NONE,(gtk.gdk.Event, )), 250 | "enter-notify-event": "override", 251 | "leave-notify-event": "override", 252 | "button-release-event": "override", 253 | "button-press-event": "override"} 254 | 255 | def __init__(self, dbx_dict): 256 | self.dockx_r = weakref.ref(dbx_dict["dock"]) 257 | self.APPLET_NAME = dbx_dict["name"].lower().replace(" ", "") 258 | gtk.EventBox.__init__(self) 259 | self.set_visible_window(False) 260 | self.set_no_show_all(True) 261 | self.mouse_pressed = False 262 | self.expand = False 263 | # Set gconf notifiers 264 | gdir = "%s/applets/%s" % (GCONF_DIR, self.APPLET_NAME) 265 | GCONF_CLIENT.add_dir(gdir, gconf.CLIENT_PRELOAD_NONE) 266 | GCONF_CLIENT.notify_add(gdir, self.__on_gconf_changed, None) 267 | 268 | def get_setting(self, *args, **kwargs): 269 | kwargs["applet_name"]=self.APPLET_NAME 270 | return get_setting(*args, **kwargs) 271 | 272 | def set_setting(self, *args, **kwargs): 273 | kwargs["applet_name"]=self.APPLET_NAME 274 | return set_setting(*args, **kwargs) 275 | 276 | def on_setting_changed(self, key, value): 277 | # Method to be overridden by applet. 278 | pass 279 | 280 | def __on_gconf_changed(self, client, par2, entry, par4): 281 | if entry.get_value() is None: 282 | return 283 | key = entry.get_key().split("/")[-1] 284 | value = get_value(entry.get_value()) 285 | self.on_setting_changed(key, value) 286 | 287 | def update(self): 288 | # Method to be overriden by applet. 289 | pass 290 | 291 | def get_full_size(self): 292 | if self.dockx_r: 293 | dockx = self.dockx_r() 294 | rel_size = float(dockx.theme.get("rel_size", 100)) 295 | size = dockx.globals.settings["dock/size"] 296 | return max(size, int(size * rel_size / 100)) 297 | 298 | 299 | def get_size(self): 300 | if self.dockx_r: 301 | return self.dockx_r().globals.settings["dock/size"] 302 | 303 | def get_position(self): 304 | if self.dockx_r: 305 | return self.dockx_r().globals.settings["dock/position"] 306 | 307 | def get_monitor(self): 308 | if self.dockx_r: 309 | return self.dockx_r().monitor 310 | 311 | def get_expand(self): 312 | return self.expand 313 | 314 | def get_applet_size(self): 315 | if not self.dockx_r: 316 | return 0 317 | if not self.get_visible(): 318 | return 0 319 | if self.get_position() in ("top", "bottom"): 320 | return self.get_allocation().width 321 | else: 322 | return self.get_allocation().height 323 | 324 | def set_expand(self, expand): 325 | self.expand = expand 326 | 327 | def do_button_release_event(self, event): 328 | if self.mousepressed: 329 | self.emit("clicked", event) 330 | self.mousepressed=False 331 | 332 | def do_button_press_event(self, event): 333 | self.mousepressed = True 334 | 335 | def do_leave_notify_event(self, *args): 336 | self.mousepressed = False 337 | 338 | def do_enter_notify_event(self, *args): 339 | pass 340 | 341 | 342 | class DockXAppletDialog(gtk.Dialog): 343 | Title = "Applet Preferences" 344 | def __init__(self, name, t=None, flags=0, 345 | buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)): 346 | if not name: 347 | logger.error("Error: DockXAppletDialog can't be initialized" \ 348 | "without a name as it's first argument") 349 | self.APPLET_NAME = name.lower().replace(" ", "") 350 | if t is None: 351 | t = self.Title 352 | gtk.Dialog.__init__(self, _(t), None, flags, buttons) 353 | 354 | def get_setting(self, *args, **kwargs): 355 | kwargs["applet_name"]=self.APPLET_NAME 356 | return get_setting(*args, **kwargs) 357 | 358 | def set_setting(self, *args, **kwargs): 359 | kwargs["applet_name"]=self.APPLET_NAME 360 | return set_setting(*args, **kwargs) 361 | -------------------------------------------------------------------------------- /dockbarx/dbx_dbus.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # dockbar.py 4 | # 5 | # Copyright 2008, 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | import dbus 21 | import dbus.service 22 | import weakref 23 | 24 | class DockbarDBus(dbus.service.Object): 25 | def __init__(self, dockbar): 26 | self.bus_name = "org.dockbar.DockbarX" 27 | if "org.dockbar.DockbarX" in dbus.SessionBus().list_names(): 28 | for n in range(1, 100): 29 | name = "org.dockbar.DockbarX%s" % n 30 | if not name in dbus.SessionBus().list_names(): 31 | self.bus_name = name 32 | break 33 | self.dockbar_r = weakref.ref(dockbar) 34 | bus_name = dbus.service.BusName(self.bus_name, 35 | bus = dbus.SessionBus()) 36 | dbus.service.Object.__init__(self, bus_name, 37 | "/org/dockbar/DockbarX") 38 | 39 | @dbus.service.method(dbus_interface="org.dockbar.DockbarX", 40 | in_signature="", out_signature="",) 41 | def Reload(self): 42 | dockbar = self.dockbar_r() 43 | if not dockbar.no_dbus_reload: 44 | dockbar.reload() 45 | 46 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 47 | in_signature='ss', out_signature='v') 48 | def Get(self, interface_name, property_name): 49 | return self.GetAll(interface_name)[property_name] 50 | 51 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 52 | in_signature='s', out_signature='a{sv}') 53 | def GetAll(self, interface_name): 54 | if interface_name == "org.dockbar.DockbarX": 55 | return {} 56 | else: 57 | raise dbus.exceptions.DBusException( 58 | 'com.example.UnknownInterface', 59 | 'The Foo object does not implement the %s interface' 60 | % interface_name) 61 | 62 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 63 | in_signature='ssv', out_signature='') 64 | def Set(self, interface_name, property_name, property_value): 65 | pass 66 | 67 | @dbus.service.signal(dbus_interface=dbus.PROPERTIES_IFACE, 68 | signature='sa{sv}as') 69 | def PropertiesChanged(self, interface_name, changed_properties, 70 | invalidated_properties): 71 | pass 72 | -------------------------------------------------------------------------------- /dockbarx/dockmanager.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # dockbar.py 4 | # 5 | # Copyright 2008, 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | import weakref 21 | import dbus 22 | import dbus.service 23 | 24 | from common import ODict, Globals 25 | from log import logger 26 | 27 | class DockManager(dbus.service.Object): 28 | def __new__(cls, dockbar): 29 | if "net.launchpad.DockManager" in dbus.SessionBus().list_names(): 30 | logger.debug("Name net.launchpad.DockManager is already" + \ 31 | " in use. (This instance of) DockbarX will" + \ 32 | " not use DockManager.") 33 | return None 34 | else: 35 | return dbus.service.Object.__new__(cls) 36 | 37 | def __init__(self, dockbar): 38 | self.dockbar_r = weakref.ref(dockbar) 39 | bus_name = dbus.service.BusName("net.launchpad.DockManager", 40 | bus = dbus.SessionBus()) 41 | dbus.service.Object.__init__(self, bus_name, 42 | "/net/launchpad/DockManager") 43 | self.globals = Globals() 44 | 45 | 46 | @dbus.service.method(dbus_interface="net.launchpad.DockManager", 47 | in_signature="", out_signature="as",) 48 | def GetCapabilities(self): 49 | capabilities = ["menu-item-container-title", 50 | "menu-item-icon-file", 51 | "menu-item-icon-name", 52 | "menu-item-with-label", 53 | "dock-item-badge", 54 | "dock-item-progress"] 55 | return capabilities 56 | 57 | @dbus.service.method(dbus_interface="net.launchpad.DockManager", 58 | in_signature="", out_signature="ao",) 59 | def GetItems(self): 60 | path_list = [] 61 | for path in self.dockbar_r().get_dm_paths(): 62 | path_list.append(dbus.ObjectPath(path)) 63 | return path_list 64 | 65 | @dbus.service.method(dbus_interface="net.launchpad.DockManager", 66 | in_signature="s", out_signature="ao",) 67 | def GetItemsByDesktopFile(self, name): 68 | path_list = [] 69 | for path in self.dockbar_r().get_dm_paths_by_desktop_file(name): 70 | path_list.append(dbus.ObjectPath(path)) 71 | logger.debug("Items gotten by dekstop file: %s" % path_list) 72 | return path_list 73 | 74 | @dbus.service.method(dbus_interface="net.launchpad.DockManager", 75 | in_signature="s", out_signature="ao",) 76 | def GetItemsByName(self, name): 77 | path_list = [] 78 | for path in self.dockbar_r().get_dm_paths_by_name(name): 79 | path_list.append(dbus.ObjectPath(path)) 80 | logger.debug("Items gotten by name: %s" % path_list) 81 | return path_list 82 | 83 | @dbus.service.method(dbus_interface="net.launchpad.DockManager", 84 | in_signature="i", out_signature="ao",) 85 | def GetItemsByPid(self, pid): 86 | path_list = [] 87 | for path in self.dockbar_r().get_dm_paths_by_pid(pid): 88 | path_list.append(dbus.ObjectPath(path)) 89 | logger.debug("Items gotten by pid: %s" % path_list) 90 | return path_list 91 | 92 | @dbus.service.method(dbus_interface="net.launchpad.DockManager", 93 | in_signature="x", out_signature="ao",) 94 | def GetItemsByXid(self, xid): 95 | path_list = [] 96 | for path in self.dockbar_r().get_dm_paths_by_xid(xid): 97 | path_list.append(dbus.ObjectPath(path)) 98 | logger.debug("Items gotten by xid: %s" % path_list) 99 | return path_list 100 | 101 | @dbus.service.signal(dbus_interface='net.launchpad.DockManager', 102 | signature='o') 103 | def ItemAdded(self, obj_path): 104 | pass 105 | 106 | @dbus.service.signal(dbus_interface='net.launchpad.DockManager', 107 | signature='o') 108 | def ItemRemoved(self, obj_path): 109 | pass 110 | 111 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 112 | in_signature='ss', out_signature='v') 113 | def Get(self, interface_name, property_name): 114 | return self.GetAll(interface_name)[property_name] 115 | 116 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 117 | in_signature='s', out_signature='a{sv}') 118 | def GetAll(self, interface_name): 119 | if interface_name == "net.launchpad.DockManager": 120 | return {} 121 | else: 122 | raise dbus.exceptions.DBusException( 123 | 'com.example.UnknownInterface', 124 | 'The Foo object does not implement the %s interface' 125 | % interface_name) 126 | 127 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 128 | in_signature='ssv', out_signature='') 129 | def Set(self, interface_name, property_name, property_value): 130 | pass 131 | 132 | @dbus.service.signal(dbus_interface=dbus.PROPERTIES_IFACE, 133 | signature='sa{sv}as') 134 | def PropertiesChanged(self, interface_name, changed_properties, 135 | invalidated_properties): 136 | pass 137 | 138 | def reset(self): 139 | try: 140 | bus = dbus.SessionBus() 141 | proxy = bus.get_object("net.launchpad.DockManager.Daemon", 142 | "/net/launchpad/DockManager/Daemon") 143 | proxy.RestartAll(dbus_interface="net.launchpad.DockManager.Daemon") 144 | except: 145 | logger.exception("Restarting DockManager Helpers failed.") 146 | 147 | def remove(self): 148 | self.remove_from_connection() 149 | self.globals.disconnect(self.badge_sid) 150 | 151 | class DockManagerItem(dbus.service.Object): 152 | counter = 0 153 | def __init__(self, groupbutton): 154 | self.groupbutton_r = weakref.ref(groupbutton) 155 | self.menu_counter = 0 156 | self.menu_items = ODict() 157 | self.globals = Globals() 158 | 159 | DockManagerItem.counter += 1 160 | self.obj_path = "/net/launchpad/DockManager/Item" + \ 161 | str(DockManagerItem.counter) 162 | bus_name = dbus.service.BusName("net.launchpad.DockManager", 163 | bus = dbus.SessionBus()) 164 | dbus.service.Object.__init__(self, bus_name, self.obj_path) 165 | 166 | @dbus.service.method(dbus_interface="net.launchpad.DockItem", 167 | in_signature="a{sv}", out_signature="i") 168 | def AddMenuItem(self, properties): 169 | self.menu_counter += 1 170 | id = self.menu_counter 171 | self.menu_items[id] = dict(properties) 172 | return id 173 | 174 | @dbus.service.method(dbus_interface="net.launchpad.DockItem", 175 | in_signature="i", out_signature="") 176 | def RemoveMenuItem(self, id): 177 | try: 178 | del self.menu_items[id] 179 | except KeyError: 180 | pass 181 | 182 | @dbus.service.method(dbus_interface="net.launchpad.DockItem", 183 | in_signature="a{sv}", out_signature="") 184 | def UpdateDockItem(self, properties): 185 | group = groupbutton_r() 186 | if "bagde" in properties: 187 | group.button.set_badge(properties["badge"], backend="dockmanager") 188 | if "progress" in properties: 189 | progress = float(properties["progress"])/100 190 | group.button.set_progress_bar(progress, backend="dockmanager") 191 | if "attention" in properties: 192 | group.dm_attention = properties["attention"] 193 | if group.needs_attention != group.dm_attention: 194 | group.needs_attention_changed() 195 | 196 | @dbus.service.signal(dbus_interface='net.launchpad.DockItem', 197 | signature='i') 198 | def MenuItemActivated(self, id): 199 | pass 200 | 201 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 202 | in_signature='ss', out_signature='v') 203 | def Get(self, interface, propname): 204 | return self.GetAll(interface)[propname] 205 | 206 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 207 | in_signature='s', out_signature='a{sv}') 208 | def GetAll(self, interface): 209 | if interface == "net.launchpad.DockItem": 210 | path = self.groupbutton_r().get_desktop_entry_file_name() 211 | return { 'DesktopFile': path, 212 | 'Uri': '' 213 | } 214 | else: 215 | raise dbus.exceptions.DBusException( 216 | 'com.example.UnknownInterface', 217 | 'The Foo object does not implement the %s interface' 218 | % interface) 219 | 220 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 221 | in_signature='ssv', out_signature='') 222 | def Set(self, interface, propname, value): 223 | pass 224 | 225 | @dbus.service.signal(dbus_interface=dbus.PROPERTIES_IFACE, 226 | signature='sa{sv}as') 227 | def PropertiesChanged(self, interface_name, changed_properties, 228 | invalidated_properties): 229 | pass 230 | 231 | def get_path(self): 232 | return self.obj_path 233 | 234 | def get_menu_items(self): 235 | return self.menu_items 236 | 237 | def remove(self): 238 | self.groupbutton_r().button.set_badge(None, backend="dockmanager") 239 | self.groupbutton_r().button.set_progress_bar(None, 240 | backend="dockmanager") 241 | self.remove_from_connection() 242 | -------------------------------------------------------------------------------- /dockbarx/i18n.py: -------------------------------------------------------------------------------- 1 | import os, sys 2 | import locale 3 | import gettext 4 | 5 | 6 | 7 | APP_NAME = "dockbarx" 8 | 9 | 10 | APP_DIR = os.path.join (sys.prefix, 11 | "share") 12 | LOCALE_DIR = os.path.join(APP_DIR, "locale") 13 | 14 | mo_location = LOCALE_DIR 15 | 16 | 17 | gettext.install (True) 18 | 19 | gettext.bindtextdomain (APP_NAME, 20 | mo_location) 21 | gettext.textdomain (APP_NAME) 22 | language = gettext.translation (APP_NAME, 23 | mo_location, 24 | fallback = True) 25 | 26 | 27 | 28 | theme = None 29 | 30 | def load_theme_translation(): 31 | global theme 32 | gettext.bindtextdomain("dockbarx-themes", mo_location) 33 | theme = gettext.translation("dockbarx-themes", 34 | mo_location, 35 | fallback = True) 36 | -------------------------------------------------------------------------------- /dockbarx/log.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # log.py 4 | # 5 | # Copyright 2008, 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | import logging 21 | import logging.handlers 22 | import os 23 | 24 | logging.basicConfig(format="%(message)s", level=logging.DEBUG) 25 | logger = logging.getLogger("DockbarX") 26 | 27 | import common 28 | 29 | def log_to_file(): 30 | log_dir = os.path.join(common.get_app_homedir(), "log") 31 | if not os.path.exists(log_dir): 32 | os.makedirs(log_dir) 33 | log_file = os.path.join(log_dir, "dockbarx.log") 34 | file_handler = logging.handlers.RotatingFileHandler(log_file, "a", 0, 5) 35 | file_handler.setLevel(logging.DEBUG) 36 | formatter = logging.Formatter("%(levelname)s\t| " + \ 37 | "%(asctime)s\t| %(message)s") 38 | file_handler.setFormatter(formatter) 39 | logger.addHandler(file_handler) 40 | file_handler.doRollover() 41 | 42 | 43 | class StdOutWrapper(): 44 | """ 45 | Call wrapper for stdout 46 | """ 47 | 48 | def __init__(self): 49 | self.message_text = "" 50 | self.log_this = logger.debug 51 | 52 | def write(self, s): 53 | if s.startswith("\n") or s.startswith("\r"): 54 | if self.message_text: 55 | self.log_this(self.message_text) 56 | self.message_text = "" 57 | s = s.lstrip("\r\n") 58 | if s.endswith("\n") or s.endswith("\r") : 59 | s = s.rstrip("\r\n") 60 | self.message_text += s 61 | if self.message_text: 62 | self.log_this(self.message_text) 63 | self.message_text = "" 64 | else: 65 | self.message_text += s 66 | 67 | class StdErrWrapper(StdOutWrapper): 68 | """ 69 | Call wrapper for stderr 70 | """ 71 | 72 | def __init__(self): 73 | StdOutWrapper.__init__(self) 74 | self.log_this = logger.error 75 | 76 | -------------------------------------------------------------------------------- /dockbarx/mediabuttons.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # dockbar.py 4 | # 5 | # Copyright 2008, 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | import gtk 21 | import dbus 22 | from dbus.mainloop.glib import DBusGMainLoop 23 | 24 | from cairowidgets import * 25 | from log import logger 26 | import weakref 27 | 28 | DBusGMainLoop(set_as_default=True) 29 | BUS = dbus.SessionBus() 30 | 31 | class MediaButtons(gtk.Alignment): 32 | def __init__(self, name): 33 | self.sids = [] 34 | self.player = BUS.get_object("org.mpris.MediaPlayer2.%s" % name, 35 | "/org/mpris/MediaPlayer2") 36 | self.player_iface = dbus.Interface(self.player, 37 | dbus_interface=\ 38 | "org.mpris.MediaPlayer2.Player") 39 | self.signal = self.player.connect_to_signal("PropertiesChanged", 40 | self.__on_properties_changed, 41 | dbus_interface=\ 42 | "org.freedesktop.DBus.Properties") 43 | gtk.Alignment.__init__(self, 0.5, 0.5, 0, 0) 44 | hbox = gtk.HBox() 45 | self.previous_button = CairoNextButton(previous=True) 46 | self.playpause_button = CairoPlayPauseButton() 47 | self.next_button = CairoNextButton() 48 | connect(self.previous_button, "clicked", self.previous) 49 | connect(self.playpause_button,"clicked", self.playpause) 50 | connect(self.next_button, "clicked", self.next) 51 | hbox.pack_start(self.previous_button) 52 | hbox.pack_start(self.playpause_button, padding=4) 53 | hbox.pack_start(self.next_button) 54 | self.add(hbox) 55 | hbox.show_all() 56 | self.update_plaback_status() 57 | 58 | def get_property(self, property): 59 | # This function gets the property using a sync call 60 | # (in other words: avoid using it). 61 | try: 62 | ret_str = str(self.player.Get("org.mpris.MediaPlayer2.Player", 63 | property, 64 | dbus_interface=\ 65 | "org.freedesktop.DBus.Properties")) 66 | except: 67 | return 68 | return ret_str 69 | 70 | def previous(self, *args): 71 | self.player_iface.Previous(reply_handler=self.__reply_handler, 72 | error_handler=self.__error_handler) 73 | 74 | def playpause(self, *args): 75 | self.player_iface.PlayPause(reply_handler=self.__reply_handler, 76 | error_handler=self.__playpause_error_handler) 77 | 78 | def __playpause_error_handler(self, err): 79 | # Todo: There must be a less ugly way to catch this error. 80 | if str(err).startswith("org.freedesktop.DBus.Error.UnknownMethod"): 81 | # Todo: Would it be worth it to make this function async? 82 | if "Playing" in self.get_property("PlaybackStatus"): 83 | self.player_iface.Pause(reply_handler=self.__reply_handler, 84 | error_handler=self.__error_handler) 85 | else: 86 | self.player_iface.Play(reply_handler=self.__reply_handler, 87 | error_handler=self.__error_handler) 88 | 89 | def next(self, *args): 90 | self.player_iface.Next(reply_handler=self.__reply_handler, 91 | error_handler=self.__error_handler) 92 | 93 | def show_player(self, *args): 94 | try: 95 | self.player.Raise(dbus_interface="org.mpris.MediaPlayer2") 96 | except: 97 | return False 98 | return True 99 | 100 | def remove(self): 101 | self.signal.remove() 102 | disconnect(self.previous_button) 103 | disconnect(self.next_button) 104 | disconnect(self.playpause_button) 105 | self.previous_button.destroy() 106 | self.next_button.destroy() 107 | self.playpause_button.destroy() 108 | del self.player_iface 109 | del self.player 110 | 111 | def __reply_handler(self, *args): 112 | pass 113 | 114 | def __error_handler(self, err): 115 | print "DBus error in media buttons:", err 116 | 117 | def __on_properties_changed(self, iface, changed_props, inv_props): 118 | if "PlaybackStatus" in changed_props: 119 | pause = changed_props["PlaybackStatus"]== "Playing" 120 | self.playpause_button.set_pause(pause) 121 | 122 | def update_plaback_status(self): 123 | self.player.Get("org.mpris.MediaPlayer2.Player", 124 | "PlaybackStatus", 125 | dbus_interface="org.freedesktop.DBus.Properties", 126 | reply_handler=self.__playback_status_reply_handler, 127 | error_handler=self.__error_handler) 128 | 129 | def __playback_status_reply_handler(self, status): 130 | self.playpause_button.set_pause(status == "Playing") 131 | 132 | class Mpris2Watch(): 133 | def __init__(self, dockbar): 134 | self.dockbar_r = weakref.ref(dockbar) 135 | self.players = [] 136 | self.fdo = BUS.get_object("org.freedesktop.DBus", 137 | "/org/freedesktop/DBus") 138 | addresses = self.fdo.ListNames(dbus_interface="org.freedesktop.DBus") 139 | for address in addresses: 140 | if str(address).startswith("org.mpris.MediaPlayer2."): 141 | try: 142 | BUS.get_object(address, "/org/mpris/MediaPlayer2") 143 | except: 144 | logger.warning("Error: Couldn't make dbus connection " + \ 145 | "with %s" % address) 146 | continue 147 | self.players.append( 148 | str(address).replace("org.mpris.MediaPlayer2.", "")) 149 | 150 | self.fdo.connect_to_signal("NameOwnerChanged", 151 | self.__on_name_change_detected, 152 | dbus_interface=\ 153 | "org.freedesktop.DBus") 154 | 155 | def __on_name_change_detected(self, name, previous_owner, current_owner): 156 | if str(name).startswith("org.mpris.MediaPlayer2."): 157 | player_name = str(name).replace("org.mpris.MediaPlayer2.", "") 158 | if previous_owner == "" and current_owner !="": 159 | try: 160 | BUS.get_object(name, "/org/mpris/MediaPlayer2") 161 | except: 162 | logger.exception("Error: Couldn't make dbus " + \ 163 | "connection with %s" % name) 164 | return 165 | self.players.append(player_name) 166 | self.dockbar_r().media_player_added(player_name) 167 | if previous_owner != "" and current_owner == "": 168 | try: 169 | self.players.remove(player_name) 170 | except ValueError: 171 | pass 172 | else: 173 | self.dockbar_r().media_player_removed(player_name) 174 | 175 | def has_player(self, name): 176 | return name in self.players 177 | 178 | def get_players(self): 179 | return self.players 180 | 181 | -------------------------------------------------------------------------------- /dockbarx/unity.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # unity.py 4 | # 5 | # Copyright 2011 Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | 21 | import dbus 22 | import dbus.service 23 | import gobject 24 | import weakref 25 | from dbus.mainloop.glib import DBusGMainLoop 26 | from log import logger 27 | import time 28 | 29 | DBusGMainLoop(set_as_default=True) 30 | BUS = dbus.SessionBus() 31 | 32 | class UnityFakeDBus(dbus.service.Object): 33 | def __new__(cls): 34 | if "com.canonical.Unity" in dbus.SessionBus().list_names(): 35 | return None 36 | else: 37 | return dbus.service.Object.__new__(cls) 38 | 39 | def __init__(self): 40 | bus_name = dbus.service.BusName("com.canonical.Unity", 41 | bus = dbus.SessionBus()) 42 | dbus.service.Object.__init__(self, bus_name, 43 | "/org/dockbar/fakeunity") 44 | 45 | def stop(self): 46 | self.remove_from_connection() 47 | 48 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 49 | in_signature='ss', out_signature='v') 50 | def Get(self, interface_name, property_name): 51 | return self.GetAll(interface_name)[property_name] 52 | 53 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 54 | in_signature='s', out_signature='a{sv}') 55 | def GetAll(self, interface_name): 56 | if interface_name == "com.canonical.Unity": 57 | return {} 58 | else: 59 | raise dbus.exceptions.DBusException( 60 | 'com.example.UnknownInterface', 61 | 'The Foo object does not implement the %s interface' 62 | % interface_name) 63 | 64 | @dbus.service.method(dbus_interface=dbus.PROPERTIES_IFACE, 65 | in_signature='ssv', out_signature='') 66 | def Set(self, interface_name, property_name, property_value): 67 | pass 68 | 69 | @dbus.service.signal(dbus_interface=dbus.PROPERTIES_IFACE, 70 | signature='sa{sv}as') 71 | def PropertiesChanged(self, interface_name, changed_properties, 72 | invalidated_properties): 73 | pass 74 | 75 | 76 | class UnityWatcher(): 77 | def __init__(self, dockbar): 78 | self.dockbar_r = weakref.ref(dockbar) 79 | self.fake_unity = None 80 | self.sid = None 81 | self.name_owner_sid = None 82 | self.props_by_app = {} 83 | 84 | def start(self): 85 | if self.fake_unity is None: 86 | self.fake_unity = UnityFakeDBus() 87 | if self.sid is None: 88 | interface = "com.canonical.Unity.LauncherEntry" 89 | self.sid = BUS.add_signal_receiver(self.__on_signal_recieved, 90 | dbus_interface=interface, 91 | sender_keyword="sender") 92 | if self.name_owner_sid is None: 93 | self.name_owner_sid = BUS.add_signal_receiver( 94 | self.__on_name_owner_changed, 95 | signal_name="NameOwnerChanged", 96 | bus_name="org.freedesktop.DBus", 97 | path="/org/freedesktop/DBus", 98 | dbus_interface="org.freedesktop.DBus") 99 | 100 | def stop(self): 101 | for group in self.dockbar_r().groups: 102 | if group.unity_launcher_bus_name is not None: 103 | # Remove counts, quicklists etc. 104 | group.set_unity_properties({}, None) 105 | self.props_by_app = {} 106 | if self.sid is not None: 107 | BUS.remove_signal_receiver(self.sid) 108 | self.sid = None 109 | if self.name_owner_sid is not None: 110 | BUS.remove_signal_receiver(self.name_owner_sid) 111 | self.name_owner_sid = None 112 | if self.fake_unity is not None: 113 | self.fake_unity.stop() 114 | self.fake_unity = None 115 | 116 | def apply_for_group(self, group): 117 | app_uri = group.get_app_uri() 118 | if app_uri in self.props_by_app: 119 | group.set_unity_properties(self.props_by_app[app_uri], 120 | self.props_by_app[app_uri]["sender"]) 121 | 122 | def __on_signal_recieved(self, app_uri, properties, sender): 123 | if not app_uri or not sender: 124 | return 125 | properties["count"] = self.__fix_long(properties.get("count", 0)) 126 | dockbar = self.dockbar_r() 127 | if app_uri in self.props_by_app and \ 128 | sender == self.props_by_app[app_uri]["sender"]: 129 | for key, value in properties.items(): 130 | self.props_by_app[app_uri][key] = value 131 | else: 132 | self.props_by_app[app_uri] = properties 133 | properties["sender"] = sender 134 | for group in dockbar.groups: 135 | if group.get_app_uri() == app_uri: 136 | break 137 | else: 138 | return 139 | group.set_unity_properties(self.props_by_app[app_uri], sender) 140 | 141 | def __fix_long(self, count): 142 | # Apparently python dbus doensn't handle all kinds of int/long 143 | # variables correctly. Try the UnityFox firefox addon for example. 144 | # This is a hack to fix that. There's perhaps a more correct way 145 | # to do this? 146 | if count < -(1<<35): 147 | # We assume that the actual int value contains 36(?) bits but 148 | # python-dbus has made a number of 64 bits instead. The first bits 149 | # then contains garbage. 150 | count = int(bin(count)[-36:], 2) 151 | # The nuber will now start from 1<<35 and go downwards as the 152 | # actual number increases (because count was negative before we 153 | # cut the first half). Let's fix that. 154 | count = (1<<35) - count 155 | return count 156 | 157 | def __on_name_owner_changed(self, name, before, after): 158 | dockbar = self.dockbar_r() 159 | if not after: 160 | # Name disappeared. Check if it's one of the unity launchers. 161 | for group in dockbar.groups: 162 | if name == group.unity_launcher_bus_name: 163 | # Remove counts, quicklists etc. 164 | group.set_unity_properties({}, None) 165 | for key, value in self.props_by_app.items(): 166 | if name == value["sender"]: 167 | del self.props_by_app[key] 168 | 169 | 170 | class DBusMenu(object): 171 | def __new__(cls, group, bus_name, path): 172 | if not bus_name in BUS.list_names(): 173 | return None 174 | return object.__new__(cls) 175 | 176 | def __init__(self, group, bus_name, path): 177 | self.group_r = weakref.ref(group) 178 | self.sids = [] 179 | self.__needed_menu_updates = [] 180 | self.bus_name = bus_name 181 | self.path = path 182 | self.obj = BUS.get_object(bus_name, path) 183 | self.iface = dbus.Interface(self.obj, dbus_interface=\ 184 | "com.canonical.dbusmenu") 185 | self.layout = [0,{},[]] 186 | empty_list = dbus.Array([], "s") 187 | self.iface.GetLayout(0, -1, empty_list, 188 | reply_handler=self.__layout_loaded, 189 | error_handler=self.__error_loading) 190 | 191 | def __layout_loaded(self, revision, layout): 192 | group = self.group_r() 193 | if group is None: 194 | return 195 | self.layout = layout 196 | self.revision = revision 197 | self.sids.append(self.iface.connect_to_signal("ItemsPropertiesUpdated", 198 | self.__on_properties_updated)) 199 | self.sids.append(self.iface.connect_to_signal("LayoutUpdated", 200 | self.__on_layout_updated)) 201 | self.sids.append(self.iface.connect_to_signal("ItemActivationRequested", 202 | self.__on_item_activition_requested)) 203 | if group.menu: 204 | group.menu.update_quicklist_menu(layout) 205 | 206 | def __error_loading(self, *args): 207 | # The interface is probably not up and running yet 208 | time.sleep(0.2) 209 | empty_list = dbus.Array([], "s") 210 | self.iface.GetLayout(0, -1, empty_list, 211 | reply_handler=self.__layout_loaded, 212 | error_handler=self.__error_handler) 213 | 214 | def __error_handler(self, *args): 215 | pass 216 | 217 | def __reply_handler(self, *args): 218 | pass 219 | 220 | def fetch_layout(self): 221 | empty_list = dbus.Array([], "s") 222 | self.iface.GetLayout(0, -1, empty_list, 223 | reply_handler=self.__fetch_layout_reply_handler, 224 | error_handler=self.__fetch_layout_error_handler) 225 | 226 | def __fetch_layout_reply_handler(self, revision, layout): 227 | self.revision = revision 228 | self.layout = layout 229 | self.__update_group_menus() 230 | 231 | def __fetch_layout_error_handler(self, *args): 232 | logger.warning("Couldn't fetch layout %s" % args) 233 | 234 | def __update_group_menus(self): 235 | group = self.group_r() 236 | if group is None or not group.menu: 237 | self.__needed_menu_updates = [] 238 | return 239 | while self.__needed_menu_updates: 240 | parent = self.__needed_menu_updates.pop() 241 | layout = self.__recursive_match(self.layout, parent) 242 | group.menu.update_quicklist_menu(layout) 243 | 244 | def __recursive_match(self, a, k): 245 | if a[0] == k: 246 | return a 247 | for child in a[2]: 248 | result = self.__recursive_match(child, k) 249 | if result is not None: 250 | return result 251 | return None 252 | 253 | def __on_layout_updated(self, revision, parent): 254 | group = self.group_r() 255 | if revision != self.revision: 256 | if not parent in self.__needed_menu_updates: 257 | # Append parent number to the __needed_menu_updates so that 258 | # the menu can be updated when the layout has been reloaded. 259 | self.__needed_menu_updates.append(parent) 260 | self.fetch_layout() 261 | 262 | def send_event(self, id, event, data, event_time): 263 | self.iface.Event(id, event, data, event_time, 264 | reply_handler=self.__reply_handler, 265 | error_handler=self.__error_handler) 266 | 267 | def __on_properties_updated(self, changed_props, removed_props): 268 | group = self.group_r() 269 | changed_items = [] 270 | for props in changed_props: 271 | item = self.__recursive_match(self.layout, props[0]) 272 | if item is None: 273 | continue 274 | for key, value in props[1].items(): 275 | item[1][key] = value 276 | changed_items.append(item) 277 | if group.menu is not None: 278 | identifier = "unity_%s" % props[0] 279 | group.menu.set_properties(identifier, props[1]) 280 | for props in removed_props: 281 | item = self.__recursive_match(self.layout, props[0]) 282 | if item is None: 283 | continue 284 | for prop in props[1]: 285 | if prop in item[1]: 286 | del item[1][prop] 287 | changed_items.append(item) 288 | if group.menu is not None: 289 | for item in changed_items: 290 | identifier = "unity_%s" % item[0] 291 | group.menu.set_properties(identifier, item[1]) 292 | 293 | def __on_item_activition_requested(self, item_id, timestamp): 294 | #~ group = self.group_r() 295 | #~ group.menu_item_activision_requested(item_id, time_stamp) 296 | pass 297 | 298 | def destroy(self): 299 | for sid in self.sids[:]: 300 | sid.remove() 301 | self.sids.remove(sid) 302 | 303 | -------------------------------------------------------------------------------- /dockbarx/zg.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | 3 | # zg.py 4 | # Copyright 2010 Siegfried-Angel Gevatter Pujals and Matias Sars 5 | # 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | # This code is based on a python snipet. 21 | # SNIPPET_NAME: Recently used items 22 | # SNIPPET_CATEGORIES: Zeitgeist 23 | # SNIPPET_DESCRIPTION: Find recently used items from Zeitgeist (synchronously) 24 | # SNIPPET_AUTHOR: Siegfried-Angel Gevatter Pujals 25 | # SNIPPET_LICENSE: GPL 26 | 27 | from datetime import date 28 | try: 29 | from zeitgeist import client, datamodel 30 | except: 31 | iface = None 32 | else: 33 | try: 34 | iface = client.ZeitgeistDBusInterface() 35 | zgclient = client.ZeitgeistClient() 36 | except RuntimeError: 37 | print "Error: Could not connect to Zeitgeist." 38 | iface = None 39 | 40 | def pythonify_zg_events(events): 41 | return_list = [] 42 | for event in events: 43 | for subject in event.subjects: 44 | return_list.append((str(subject.text), str(subject.uri))) 45 | return return_list 46 | 47 | def err_handler(*args): 48 | print "Zeitgeist error:", args 49 | 50 | def _get(name=None, 51 | result_type=None, 52 | days=14, 53 | number_of_results=5, 54 | mimetypes=[], 55 | handler=None): 56 | if iface is None: 57 | return 58 | if result_type is None: 59 | result_type = datamodel.ResultType.MostRecentSubjects 60 | time_range = datamodel.TimeRange.from_seconds_ago(days * 3600 * 24) 61 | 62 | if not mimetypes: 63 | event_template = datamodel.Event() 64 | if name: 65 | event_template.set_actor("application://%s"%name) 66 | event_templates = [event_template] 67 | else: 68 | event_templates = [] 69 | for mimetype in mimetypes: 70 | event_template = datamodel.Event() 71 | if name: 72 | event_template.set_actor("application://%s"%name) 73 | event_template.append_subject( 74 | datamodel.Subject.new_for_values(mimetype=mimetype)) 75 | event_templates.append(event_template) 76 | 77 | #~ results = iface.FindEvents(time_range, 78 | #~ event_templates, 79 | #~ datamodel.StorageState.Any, 80 | #~ number_of_results, 81 | #~ result_type) 82 | #print "results", results 83 | zgclient.find_events_for_templates(event_templates, 84 | handler, 85 | timerange=time_range, 86 | storage_state=datamodel.StorageState.Any, 87 | num_events=number_of_results, 88 | result_type=result_type, 89 | error_handler=err_handler) 90 | 91 | #~ # Pythonize the result 92 | #~ return_list = [] 93 | #~ for result in results: 94 | #~ for subject in datamodel.Event(result).get_subjects(): 95 | #~ return_list.append((str(subject.text), str(subject.uri))) 96 | #~ return return_list 97 | 98 | 99 | def get_recent_for_app(name, days=14, number_of_results=5, handler=None): 100 | if iface is None: 101 | return [] 102 | return _get(name, datamodel.ResultType.MostRecentSubjects, 103 | days, number_of_results, handler=handler) 104 | 105 | def get_most_used_for_app(name, days=14, number_of_results=5, handler=None): 106 | if iface is None: 107 | return [] 108 | return _get(name, datamodel.ResultType.MostPopularSubjects, 109 | days, number_of_results, handler=handler) 110 | 111 | def get_most_used_for_mimetypes(mimetypes, days=1, \ 112 | number_of_results=5, handler=None): 113 | if iface is None: 114 | return [] 115 | return _get(mimetypes=mimetypes, 116 | result_type=datamodel.ResultType.MostPopularSubjects, 117 | days=days, 118 | number_of_results=number_of_results, 119 | handler=handler) 120 | 121 | def get_recent_for_mimetypes(mimetypes, days=1, number_of_results=5, \ 122 | handler=None): 123 | if iface is None: 124 | return [] 125 | return _get(mimetypes=mimetypes, 126 | result_type=datamodel.ResultType.MostRecentSubjects, 127 | days=days, 128 | number_of_results=number_of_results, 129 | handler=handler) 130 | 131 | 132 | -------------------------------------------------------------------------------- /dockbarx_factory: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # dockbarx_factory 4 | # 5 | # Copyright 2008, 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | from dockbarx.log import * 21 | import sys 22 | if not (len(sys.argv) == 2 and sys.argv[1] == "run-in-window"): 23 | log_to_file() 24 | sys.stderr = StdErrWrapper() 25 | sys.stdout = StdOutWrapper() 26 | 27 | import pygtk 28 | pygtk.require("2.0") 29 | import gtk 30 | import gnomeapplet 31 | import dockbarx.dockbar 32 | import gobject 33 | 34 | class DockBarWindow(): 35 | """DockBarWindow sets up the window if run-in-window is used.""" 36 | def __init__(self): 37 | self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 38 | self.window.set_default_size(200,40) 39 | self.window.show() 40 | self.window.set_property("skip-taskbar-hint",True) 41 | self.window.set_keep_above(True) 42 | self.window.connect ("destroy",self.__destroy) 43 | 44 | applet = gnomeapplet.Applet() 45 | applet.reparent(self.window) 46 | self.dockbar = dockbarx.dockbar.DockBar(self) 47 | 48 | def __on_pref_clicked(self, *args): 49 | self.dockbar.open_preference() 50 | 51 | def __destroy (self,widget,data=None): 52 | gtk.main_quit() 53 | 54 | def main(self): 55 | gtk.main() 56 | 57 | class DockbarGnomeapplet(): 58 | def __init__(self, applet): 59 | self.applet = applet 60 | self.dockbar = dockbarx.dockbar.DockBar(applet) 61 | applet.set_applet_flags(gnomeapplet.HAS_HANDLE | \ 62 | gnomeapplet.EXPAND_MINOR | \ 63 | gnomeapplet.EXPAND_MAJOR) 64 | orients = {gnomeapplet.ORIENT_DOWN: "down", 65 | gnomeapplet.ORIENT_UP: "up", 66 | gnomeapplet.ORIENT_LEFT: "left", 67 | gnomeapplet.ORIENT_RIGHT: "right"} 68 | self.dockbar.set_orient(orients[applet.get_orient()]) 69 | self.pp_menu_xml = """ 70 | 71 | 72 | 73 | 74 | 75 | """ 76 | 77 | self.pp_menu_verbs = [("About", self.dockbar.on_ppm_about), 78 | ("Pref", self.dockbar.on_ppm_pref), 79 | ("Reload", self.dockbar.reload)] 80 | applet.setup_menu(self.pp_menu_xml, self.pp_menu_verbs,None) 81 | 82 | # Set the applet coordinates to be way ofscreen until they've 83 | # been set correctly by a size allocate call. 84 | self.applet_origin_x = -1000 85 | self.applet_origin_y = -1000 86 | #~ applet.connect("delete-event", self.__cleanup) 87 | # Background bug workaround 88 | applet.set_background_widget(applet) 89 | applet.show_all() 90 | 91 | # Most of initializion must happen after dockbarx is 92 | # realized since python gnomeapplets crash if it 93 | # takes too long to realize. 94 | gobject.idle_add(self.__load_on_realized) 95 | 96 | def __load_on_realized(self): 97 | # Wait while gtk events are pending. 98 | while gtk.events_pending(): 99 | gtk.main_iteration(False) 100 | # Load DockbarX. 101 | self.dockbar.load() 102 | # Add it to the applet. 103 | self.applet.add(self.dockbar.get_container()) 104 | # Connect events. 105 | self.applet.connect("size-allocate", self.__on_applet_size_alloc) 106 | self.applet.connect("change_background", self.__on_change_background) 107 | self.applet.connect("change-orient", self.__on_change_orient) 108 | 109 | def __on_applet_size_alloc(self, widget, allocation): 110 | if not widget.window: 111 | return 112 | x,y = widget.window.get_origin() 113 | if x == self.applet_origin_x or y == self.applet_origin_y: 114 | # Nothing moved. 115 | return 116 | # Applet and/or panel moved, 117 | # icon_geo needs to be updated. 118 | self.applet_origin_x = x 119 | self.applet_origin_y = y 120 | self.dockbar.dockbar_moved() 121 | 122 | def __on_change_orient(self, arg1, data): 123 | orients = {gnomeapplet.ORIENT_DOWN: "down", 124 | gnomeapplet.ORIENT_UP: "up", 125 | gnomeapplet.ORIENT_LEFT: "left", 126 | gnomeapplet.ORIENT_RIGHT: "right"} 127 | self.applet.remove(self.dockbar.get_container()) 128 | self.dockbar.set_orient(orients[self.applet.get_orient()]) 129 | self.applet.add(self.dockbar.get_container()) 130 | 131 | def __on_change_background(self, applet, type, color, pixmap): 132 | applet.set_style(None) 133 | rc_style = gtk.RcStyle() 134 | applet.modify_style(rc_style) 135 | if type == gnomeapplet.COLOR_BACKGROUND: 136 | applet.modify_bg(gtk.STATE_NORMAL, color) 137 | elif type == gnomeapplet.PIXMAP_BACKGROUND: 138 | style = applet.style 139 | style.bg_pixmap[gtk.STATE_NORMAL] = pixmap 140 | applet.set_style(style) 141 | return 142 | 143 | def __cleanup(self,event): 144 | pass 145 | 146 | 147 | 148 | def dockbar_factory(applet, iid): 149 | DockbarGnomeapplet(applet) 150 | return True 151 | 152 | if len(sys.argv) == 2 and sys.argv[1] == "run-in-window": 153 | dockbarwin = DockBarWindow() 154 | dockbarwin.main() 155 | else: 156 | gnomeapplet.bonobo_factory("OAFIID:GNOME_DockBarXApplet_Factory", 157 | gnomeapplet.Applet.__gtype__, 158 | "dockbar applet", "0", dockbar_factory) 159 | -------------------------------------------------------------------------------- /dockx_applets/Creating applets: -------------------------------------------------------------------------------- 1 | An applet for Dockbarx stand alone dock needs to be a python file named dbx_applet_%name%.py, where %name% can be whatever you want. It doesn't have to be the same as the name of the applet you specify within the file. 2 | 3 | See dbx_applet_hello_world.py for a simple example or dbx_applet_clock.py for a more complex one. 4 | -------------------------------------------------------------------------------- /dockx_applets/appindicator.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=AppIndicator 3 | exec=appindicator.py 4 | 5 | @description 6 | Application Indicators applet 7 | -------------------------------------------------------------------------------- /dockx_applets/appindicator.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # dockbar.py 4 | # 5 | # Copyright 2008, 2009, 2010 Aleksey Shaferov and Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | import gtk 21 | import dbus 22 | import os 23 | import os.path 24 | import gobject 25 | import weakref 26 | from dbus.mainloop.glib import DBusGMainLoop 27 | from dockbarx.applets import DockXApplet 28 | from dockbarx.unity import DBusMenu 29 | from dockbarx.groupbutton import GroupMenu as Menu 30 | 31 | DBusGMainLoop(set_as_default=True) 32 | BUS = dbus.SessionBus() 33 | 34 | ICONSIZE = 18 35 | 36 | # List of possible commands to launch indicator-application-service 37 | service_cmds = ["/usr/lib/x86_64-linux-gnu/indicator-application/indicator-application-service", 38 | "/usr/lib/x86_64-linux-gnu/indicator-application-service", 39 | "/usr/lib/i386-linux-gnu/indicator-application/indicator-application-service", 40 | "/usr/lib/i386-linux-gnu/indicator-application-service", 41 | "/usr/lib/indicator-application/indicator-application-service"] 42 | 43 | class AppIndicator(gtk.EventBox): 44 | def __init__(self, applet, icon_name, position, address, obj, 45 | icon_path, label, labelguide, 46 | accessibledesc, hint=None, title=None): 47 | self.applet_r = weakref.ref(applet) 48 | self.menu = None 49 | gtk.EventBox.__init__(self) 50 | self.set_visible_window(False) 51 | self.box = None 52 | self.icon = gtk.Image() 53 | self.icon_name = None 54 | self.icon_pixbufs = {} 55 | self.label = gtk.Label() 56 | self.repack() 57 | self.icon_themepath = icon_path 58 | self.on_icon_changed(icon_name, None) 59 | self.on_label_changed(label, labelguide) 60 | 61 | # Older versions of application-indicator-service doesn't give a title. 62 | self.title = title 63 | 64 | self.dbusmenu = DBusMenu(self, address, obj) 65 | 66 | self.show_all() 67 | self.connect("button-press-event", self.on_button_press_event) 68 | 69 | def repack(self): 70 | if self.box is not None: 71 | self.box.remove(self.icon) 72 | self.box.remove(self.label) 73 | self.remove(self.box) 74 | self.box.destroy() 75 | if self.applet_r().get_position() in ("left", "right"): 76 | self.box = gtk.VBox() 77 | self.label.set_angle(270) 78 | else: 79 | self.box = gtk.HBox() 80 | self.label.set_angle(0) 81 | self.box.pack_start(self.icon) 82 | self.box.pack_start(self.label) 83 | self.add(self.box) 84 | 85 | def on_button_press_event(self, widget, event): 86 | self.show_menu(event) 87 | 88 | def show_menu(self, event): 89 | self.menu = Menu(gtk_menu=True) 90 | # Since some application menus doesn't seem to be 91 | # update, let's try to fetch just in case. 92 | self.dbusmenu.fetch_layout() 93 | 94 | self.menu.add_quicklist(self.dbusmenu.layout) 95 | self.sids = {} 96 | self.sids[0] = self.menu.connect("item-activated", 97 | self.on_menuitem_activated) 98 | #~ self.sids[1] = self.menu.connect("item-hovered", 99 | #~ self.__on_menuitem_hovered) 100 | #~ self.sids[2] = self.menu.connect("menu-resized", 101 | #~ self.__on_menu_resized) 102 | gtkmenu = self.menu.get_menu() 103 | self.sd_sid = gtkmenu.connect("selection-done", self.menu_closed) 104 | gtkmenu.popup(None, None, self.position_menu, 105 | event.button, event.time) 106 | 107 | def menu_closed(self, *args): 108 | if self.menu is not None: 109 | for key in self.sids.keys(): 110 | sid = self.sids.pop(key) 111 | self.menu.disconnect(sid) 112 | self.sd_sid = self.menu.get_menu().disconnect(self.sd_sid) 113 | self.menu.delete_menu() 114 | self.menu = None 115 | 116 | def on_menuitem_activated(self, menu_item, identifier): 117 | if identifier.startswith("unity_"): 118 | identifier = int(identifier.rsplit("_", 1)[-1]) 119 | data = dbus.String("", variant_level=1) 120 | t = dbus.UInt32(0) 121 | self.dbusmenu.send_event(identifier, "clicked", data, t) 122 | 123 | def on_icon_changed(self, icon_name=None, icon_desc=None): 124 | if self.icon_name == icon_name: 125 | return 126 | if icon_name is not None: 127 | self.icon_name = icon_name 128 | self.update_icon() 129 | 130 | def update_icon(self): 131 | if self.icon_name in self.icon_pixbufs: 132 | pixbuf = self.icon_pixbufs[self.icon_name] 133 | else: 134 | pixbuf = self.get_icon(self.icon_name) 135 | self.icon_pixbufs[self.icon_name] = pixbuf 136 | self.icon.set_from_pixbuf(pixbuf) 137 | 138 | def get_icon(self, icon_name): 139 | if icon_name.startswith("/") and os.path.exists(icon_name): 140 | pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_name, 141 | ICONSIZE, 142 | ICONSIZE) 143 | else: 144 | icon_theme = gtk.icon_theme_get_default() 145 | if self.icon_themepath != "" and \ 146 | os.path.exists(self.icon_themepath): 147 | icon_theme.prepend_search_path(self.icon_themepath) 148 | pixbuf = icon_theme.load_icon(self.icon_name, ICONSIZE, 0) 149 | return pixbuf 150 | 151 | def on_icon_themepath_changed(self, path): 152 | if self.icon_themepath == path: 153 | return 154 | self.icon_themepath = path 155 | #reset icon_pixbufs so that the icons will be reloaded. 156 | self.icon_pixbufs = {} 157 | # Update the icon 158 | if self.icon_name is not None: 159 | self.update_icon() 160 | 161 | def on_label_changed(self, label, guide): 162 | self.label.set_text(label) 163 | 164 | def on_title_changed(self, title): 165 | self.title = title 166 | 167 | def position_menu(self, menu): 168 | x, y = self.get_window().get_origin() 169 | a = self.get_allocation() 170 | w, h = menu.size_request() 171 | size = self.applet_r().get_size() 172 | if self.applet_r().get_position() == "left": 173 | x += size 174 | y += a.y 175 | if self.applet_r().get_position() == "right": 176 | x -= w 177 | y += a.y 178 | if self.applet_r().get_position() == "top": 179 | x += a.x 180 | y += size 181 | if self.applet_r().get_position() == "bottom": 182 | x += a.x 183 | y -= h 184 | screen = self.get_window().get_screen() 185 | if y + h > screen.get_height(): 186 | y = screen.get_height() - h 187 | if x + w >= screen.get_width(): 188 | x = screen.get_width() - w 189 | return (x, y, False) 190 | 191 | class AppIndicatorApplet(DockXApplet): 192 | def __init__(self, dbx_dict): 193 | DockXApplet.__init__(self, dbx_dict) 194 | self.alignment = gtk.Alignment(0.5, 0.5) 195 | self.add(self.alignment) 196 | self.alignment.show() 197 | 198 | self.box = None 199 | self.repack() 200 | self.show() 201 | self.fdo = BUS.get_object("org.freedesktop.DBus", 202 | "/org/freedesktop/DBus") 203 | addresses = self.fdo.ListNames(dbus_interface="org.freedesktop.DBus") 204 | for address in addresses: 205 | if str(address) == "com.canonical.indicator.application": 206 | self.connect_dbus(address) 207 | break 208 | else: 209 | gobject.idle_add(self.start_service) 210 | self.fdo.connect_to_signal("NameOwnerChanged", 211 | self.on_name_change_detected, 212 | dbus_interface=\ 213 | "org.freedesktop.DBus") 214 | self.menu = None 215 | 216 | def repack(self): 217 | children = [] 218 | if self.box is not None: 219 | children = self.box.get_children() 220 | for child in children: 221 | self.box.remove(child) 222 | self.alignment.remove(self.box) 223 | self.box.destroy() 224 | if self.get_position() in ("left", "right"): 225 | self.box = gtk.VBox(False, 4) 226 | else: 227 | self.box = gtk.HBox(False, 4) 228 | self.container = gtk.HBox() 229 | self.box.set_border_width(4) 230 | self.alignment.add(self.box) 231 | for child in children: 232 | self.box.pack_start(child) 233 | child.repack() 234 | self.box.show_all() 235 | 236 | def start_service(self): 237 | for cmd in service_cmds: 238 | if os.path.exists(cmd): 239 | os.system("/bin/sh -c '%s' &" % cmd) 240 | break 241 | return False 242 | 243 | def on_name_change_detected(self, name, previous_owner, current_owner): 244 | if str(name) == "com.canonical.indicator.application": 245 | if previous_owner == "" and current_owner !="": 246 | self.connect_dbus(name) 247 | if previous_owner != "" and current_owner == "": 248 | print "indicator-application-service disappeared" 249 | self.disconnect_dbus() 250 | 251 | def connect_dbus(self, address): 252 | try: 253 | self.ayatana = BUS.get_object(address, 254 | "/org/ayatana/indicator/service") 255 | except: 256 | print "Error: Couldn't make dbus connection with %s" % address 257 | return 258 | self.ayatana.Watch(dbus_interface="org.ayatana.indicator.service", 259 | reply_handler=self.reply_handler, 260 | error_handler=self.error_handler) 261 | self.obj = BUS.get_object(address, 262 | "/com/canonical/indicator/application/service") 263 | self.obj.GetApplications( 264 | dbus_interface="com.canonical.indicator.application.service", 265 | reply_handler=self.indicators_loaded, 266 | error_handler=self.error_loading) 267 | 268 | def disconnect_dbus(self): 269 | for sid in self.sids[:]: 270 | sid.remove() 271 | self.sids.remove(sid) 272 | indicators = self.box.get_children() 273 | for ind in indicators: 274 | ind.dbusmenu.destroy() 275 | if ind.menu is not None: 276 | ind.menu.delete_menu() 277 | ind.destroy() 278 | 279 | def indicators_loaded(self, indicators): 280 | for ind in indicators: 281 | self.ind_added(*ind) 282 | self.sids = [] 283 | 284 | iface = dbus.Interface(self.obj, 285 | dbus_interface="com.canonical.indicator.application.service") 286 | connections = {"ApplicationAdded": self.ind_added, 287 | "ApplicationIconChanged": self.on_icon_changed, 288 | "ApplicationIconThemePathChanged": 289 | self.on_icon_themepath_changed, 290 | "ApplicationLabelChanged": self.on_label_changed, 291 | "ApplicationRemoved": self.ind_removed, 292 | "ApplicationTitleChanged": self.on_title_changed} 293 | for sig, call_func in connections.items(): 294 | self.sids.append(iface.connect_to_signal(sig, call_func)) 295 | 296 | def ind_added(self, *args): 297 | position = args[1] 298 | ind = AppIndicator(self, *args) 299 | self.box.pack_start(ind) 300 | self.box.reorder_child(ind, position) 301 | 302 | def ind_removed(self, position): 303 | indicators = self.box.get_children() 304 | ind = indicators[position] 305 | ind.dbusmenu.destroy() 306 | if ind.menu is not None: 307 | ind.menu.delete_menu() 308 | ind.destroy() 309 | 310 | def on_icon_changed(self, position, icon_name, icon_desc): 311 | indicators = self.box.get_children() 312 | ind = indicators[position] 313 | ind.on_icon_changed(icon_name, icon_desc) 314 | 315 | def on_icon_themepath_changed(self, position, path): 316 | indicators = self.box.get_children() 317 | ind = indicators[position] 318 | ind.on_themepath_changed(path) 319 | 320 | def on_label_changed(self, position, label, guide): 321 | indicators = self.box.get_children() 322 | ind = indicators[position] 323 | ind.on_label_changed(label, guide) 324 | 325 | def on_title_changed(self, position, title): 326 | indicators = self.box.get_children() 327 | ind = indicators[position] 328 | ind.on_title_changed(title) 329 | 330 | def error_loading(self, err): 331 | print err 332 | 333 | def reply_handler(self, *args): 334 | pass 335 | 336 | def error_handler(self, err): 337 | print err 338 | 339 | def get_dbx_applet(dbx_dict): 340 | global aiapplet 341 | try: 342 | aiapplet.repack() 343 | except: 344 | # First run, make a new instance 345 | aiapplet = AppIndicatorApplet(dbx_dict) 346 | return aiapplet 347 | -------------------------------------------------------------------------------- /dockx_applets/battery_status.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Battery Status 3 | exec=battery_status.py 4 | 5 | @description 6 | Battery Status applet for the GNOME desktop 1.1 by Ivan Zorin ported to DockX 7 | -------------------------------------------------------------------------------- /dockx_applets/cardapio.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Cardapio 3 | exec=cardapio_dbx.py 4 | 5 | @description 6 | An alternative gnome menu, launcher and much more. 7 | -------------------------------------------------------------------------------- /dockx_applets/cardapio_dbx.py: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (C) 2010 Cardapio Team (tvst@hotmail.com) 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | # 17 | 18 | import sys 19 | import gtk 20 | from dockbarx.applets import DockXApplet 21 | sys.path.insert(0, "/usr/lib/cardapio") 22 | from misc import * 23 | from CardapioAppletInterface import * 24 | from Cardapio import Cardapio 25 | 26 | class CardapioDockXApplet(CardapioAppletInterface): 27 | 28 | panel_type = PANEL_TYPE_AWN 29 | 30 | IS_CONFIGURABLE = True 31 | IS_CONTROLLABLE = True 32 | 33 | ICON = 'cardapio-dark256' 34 | 35 | def __init__(self, applet): 36 | 37 | self.applet = applet 38 | 39 | self.applet_press_handler = None 40 | self.applet_enter_handler = None 41 | self.applet_leave_handler = None 42 | self.autohide_cookie = None 43 | 44 | self.applet.set_tooltip_text('Cardapio') 45 | 46 | 47 | def setup(self, cardapio): 48 | 49 | self.cardapio = cardapio 50 | 51 | self.preferences = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES) 52 | self.edit = gtk.ImageMenuItem(gtk.STOCK_EDIT) 53 | self.about = gtk.ImageMenuItem(gtk.STOCK_ABOUT) 54 | 55 | self.preferences.connect('activate', self._open_options_dialog) 56 | self.edit.connect('activate', self._launch_edit_app) 57 | self.about.connect('activate', self._open_about_dialog) 58 | self.applet.connect('unmap-event', self._on_applet_destroy) 59 | 60 | self.menu = gtk.Menu() 61 | self.menu.insert(self.preferences, 0) 62 | self.menu.insert(self.edit, 1) 63 | self.menu.insert(self.about, 2) 64 | self.menu.insert(gtk.SeparatorMenuItem(), 3) 65 | self.menu.show_all() 66 | 67 | 68 | def update_from_user_settings(self, settings): 69 | 70 | if self.applet_press_handler is not None: 71 | try: 72 | self.applet.disconnect(self.applet_press_handler) 73 | self.applet.disconnect(self.applet_enter_handler) 74 | self.applet.disconnect(self.applet_leave_handler) 75 | except: pass 76 | 77 | if settings['open on hover']: 78 | self.applet_press_handler = self.applet.connect('clicked', self._on_applet_clicked, True) 79 | self.applet_enter_handler = self.applet.connect('enter-notify-event', self._on_applet_cursor_enter) 80 | self.applet_leave_handler = self.applet.connect('leave-notify-event', self._on_applet_cursor_leave) 81 | 82 | else: 83 | self.applet_press_handler = self.applet.connect('clicked', self._on_applet_clicked, False) 84 | self.applet_enter_handler = self.applet.connect('enter-notify-event', return_true) 85 | self.applet_leave_handler = self.applet.connect('leave-notify-event', return_true) 86 | 87 | try: 88 | self.applet.set_icon_name(settings['applet icon']) 89 | return 90 | except: pass 91 | 92 | try: self.applet.set_icon_name(self.ICON) 93 | except: pass 94 | 95 | 96 | def get_size(self): 97 | icon_size = self.applet.get_size() 98 | return icon_size, icon_size 99 | 100 | 101 | def get_position(self): 102 | 103 | x, y = self.applet.get_window().get_origin() 104 | ax, ay, w, h = self.applet.get_allocation() 105 | x += ax 106 | y += ay 107 | icon_size = self.applet.get_full_size() 108 | 109 | pos_type = self.applet.get_position().lower() 110 | 111 | if pos_type == "bottom" : y = y + h - icon_size 112 | elif pos_type == "right" : x = x + w - icon_size 113 | return x, y 114 | 115 | 116 | def get_orientation(self): 117 | pos_type = self.applet.get_position().lower() 118 | if pos_type == "top" : return POS_TOP 119 | if pos_type == "bottom": return POS_BOTTOM 120 | if pos_type == "left" : return POS_LEFT 121 | else: return POS_RIGHT 122 | 123 | 124 | def has_mouse_cursor(self, mouse_x, mouse_y): 125 | return False 126 | 127 | 128 | def draw_toggled_state(self, state): 129 | pass 130 | 131 | 132 | def disable_autohide(self, state): 133 | 134 | if state: 135 | self.autohide_cookie = self.applet.inhibit_autohide('Showing Cardapio') 136 | 137 | elif self.autohide_cookie != None: 138 | self.applet.uninhibit_autohide(self.autohide_cookie) 139 | self.autohide_cookie = None 140 | 141 | 142 | def _on_applet_clicked(self, widget, event, ignore_main_button): 143 | if event.button == 1 and not ignore_main_button: 144 | self.cardapio.show_hide() 145 | elif event.button == 3: 146 | self.menu.popup(None, None, None, event.button, event.time) 147 | 148 | 149 | def _on_applet_cursor_enter(self, widget, event): 150 | self.cardapio.show_hide() 151 | return True 152 | 153 | 154 | def _on_applet_cursor_leave(self, widget, event): 155 | self.cardapio.handle_mainwindow_cursor_leave() 156 | 157 | 158 | def _open_options_dialog(self, widget): 159 | self.cardapio.open_options_dialog() 160 | 161 | 162 | def _launch_edit_app(self, widget): 163 | self.cardapio.launch_edit_app() 164 | 165 | 166 | def _open_about_dialog(self, widget): 167 | self.cardapio.handle_about_menu_item_clicked(widget) 168 | 169 | 170 | def _on_applet_destroy(self, *args): 171 | self.cardapio.save_and_quit() 172 | 173 | 174 | def get_screen_number(self): 175 | """ 176 | Returns the number of the screen where the applet is placed 177 | """ 178 | screen = self.applet.get_screen() 179 | if screen is None: return 0 180 | return screen.get_number() 181 | 182 | class MenuButtonApplet(DockXApplet): 183 | """An example applet for DockbarX standalone dock""" 184 | 185 | def __init__(self, dbx_dict): 186 | DockXApplet.__init__(self, dbx_dict) 187 | self.icon = gtk.Image() 188 | self.icon.set_from_icon_name("cardapio-dark256", gtk.ICON_SIZE_DIALOG) 189 | self.icon.set_pixel_size(self.get_size()) 190 | self.add(self.icon) 191 | self.icon.show() 192 | self.show() 193 | 194 | def set_icon_name(self, name): 195 | if os.path.isfile(name): 196 | self.icon.set_from_file(name) 197 | else: 198 | self.icon.set_from_icon_name(name, gtk.ICON_SIZE_DIALOG) 199 | self.icon.set_pixel_size(self.get_size()) 200 | 201 | def get_dbx_applet(dbx_dict): 202 | global mbapplet 203 | try: 204 | return mbapplet 205 | except: 206 | # First run, make a new instance 207 | mbapplet = MenuButtonApplet(dbx_dict) 208 | cardapio_applet = CardapioDockXApplet(mbapplet) 209 | cardapio = Cardapio(panel_applet=cardapio_applet) 210 | return mbapplet 211 | -------------------------------------------------------------------------------- /dockx_applets/clock.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Clock 3 | exec=clock.py 4 | 5 | @description 6 | Shows the time. 7 | -------------------------------------------------------------------------------- /dockx_applets/clock.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # Hello world dockbarx applet 4 | # 5 | # Copyright 2011 Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see %H:%M" 29 | DEFAULT_COMMAND = "orage" 30 | 31 | class ClockApplet(DockXApplet): 32 | """A clock applet for DockbarX standalone dock""" 33 | applet_name = "Clock" 34 | applet_description = "Shows the time." 35 | 36 | def __init__(self, dbx_dict): 37 | DockXApplet.__init__(self, dbx_dict) 38 | alignment = gtk.Alignment(xalign=0.5, yalign=0.5) 39 | self.add(alignment) 40 | self.label = gtk.Label() 41 | self.label.set_use_markup(True) 42 | alignment.add(self.label) 43 | alignment.show_all() 44 | self.show() 45 | self.label_text = "" 46 | self.set_text_direction(self.get_setting("text_direction", "default")) 47 | self.font = self.get_setting("font", "Sans 14") 48 | self.color = self.get_setting("color", "#FFFFFF") 49 | self.show_date = self.get_setting("show_date", False) 50 | self.use_custom_format = self.get_setting("use_custom_format", False) 51 | self.custom_format = self.get_setting("custom_format", 52 | DEFAULT_CUSTOM_FORMAT) 53 | self.command = self.get_setting("command", DEFAULT_COMMAND) 54 | self.update() 55 | gobject.timeout_add(1000, self.update) 56 | self.connect("clicked", self.on_clicked) 57 | 58 | self.menu = gtk.Menu() 59 | preferences_item = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES) 60 | preferences_item.connect('activate', self.open_preferences) 61 | self.menu.insert(preferences_item, 0) 62 | self.menu.show_all() 63 | 64 | def update(self, *args): 65 | if self.use_custom_format: 66 | # Todo: User made markup errors needs to be catched but how? 67 | text = time.strftime(self.custom_format) 68 | if text != self.label_text: 69 | self.label.set_label(text) 70 | self.label_text = text 71 | return True 72 | if self.show_date: 73 | tstr = time.strftime("%x %H:%M") 74 | else: 75 | tstr = time.strftime("%H:%M") 76 | text ="%s" % (self.color, 77 | self.font, 78 | tstr) 79 | if text != self.label_text: 80 | self.label.set_label(text) 81 | self.label_text = text 82 | return True 83 | 84 | def on_setting_changed(self, key, value): 85 | if key == "font": 86 | self.font = value 87 | if key == "color": 88 | self.color = value 89 | if key == "show_date": 90 | self.show_date = value 91 | if key == "custom_format": 92 | self.custom_format = value 93 | if key == "use_custom_format": 94 | self.use_custom_format = value 95 | if key == "text_direction": 96 | self.set_text_direction(value) 97 | if key == "command": 98 | self.command = value 99 | self.update() 100 | 101 | def set_text_direction(self, direction): 102 | if direction == "default": 103 | if self.get_position() in ("left", "right"): 104 | direction = "top-down" 105 | else: 106 | direction = "left-right" 107 | angles = {"left-right": 0, "top-down": 270, "bottom-up": 90} 108 | self.label.set_angle(angles[direction]) 109 | 110 | def on_clicked(self, widget, event): 111 | if event.button == 1: 112 | os.system("/bin/sh -c '%s' &" % self.command) 113 | elif event.button == 3: 114 | self.menu.popup(None, None, None, event.button, event.time) 115 | 116 | def open_preferences(self, *args): 117 | run_applet_dialog(self.APPLET_NAME) 118 | 119 | 120 | class ClockAppletPreferences(DockXAppletDialog): 121 | Title = "Clock Applet Preferences" 122 | 123 | def __init__(self, applet_name): 124 | DockXAppletDialog.__init__(self, applet_name) 125 | table = gtk.Table(2, 3) 126 | self.vbox.pack_start(table) 127 | 128 | self.font_button = gtk.FontButton() 129 | self.font_button.set_use_font(True) 130 | self.font_button.set_use_size(True) 131 | self.font_button.set_show_style(True) 132 | label = gtk.Label(_("Font:")) 133 | table.attach(label, 0, 1, 0, 1) 134 | self.font_button.set_title(_("Clock font")) 135 | self.font_button.connect("font_set", self.__set_font) 136 | table.attach(self.font_button, 1, 2, 0, 1) 137 | 138 | label = gtk.Label(_("Color:")) 139 | table.attach(label, 0, 1, 1, 2) 140 | self.color_button = gtk.ColorButton() 141 | self.color_button.set_title(_("Font color")) 142 | self.color_button.connect("color-set", self.__color_set) 143 | table.attach(self.color_button, 1, 2, 1, 2) 144 | 145 | self.date_cb = gtk.CheckButton(_("Show Date")) 146 | self.date_cb.connect("toggled", self.__cb_toggled, "show_date") 147 | table.attach(self.date_cb, 1, 2, 2, 3) 148 | 149 | frame = gtk.Frame() 150 | self.vbox.pack_start(frame) 151 | vbox = gtk.VBox() 152 | frame.add(vbox) 153 | self.custom_clock_cb = gtk.CheckButton(_("Use custom clock")) 154 | self.custom_clock_cb.connect("toggled", 155 | self.__cb_toggled, "use_custom_format") 156 | vbox.pack_start(self.custom_clock_cb) 157 | hbox = gtk.HBox() 158 | vbox.pack_start(hbox) 159 | self.cf_entry = gtk.Entry() 160 | self.cf_entry.set_tooltip_text("The format is identical to gnome-panel clock's custom format. Google 'gnome-panel custom clock' for exampels.") 161 | hbox.pack_start(self.cf_entry) 162 | self.cf_button = gtk.Button() 163 | image = gtk.image_new_from_stock(gtk.STOCK_APPLY, 164 | gtk.ICON_SIZE_SMALL_TOOLBAR) 165 | self.cf_button.add(image) 166 | self.cf_button.connect("clicked", self.__set_custom_format) 167 | hbox.pack_start(self.cf_button) 168 | 169 | hbox = gtk.HBox() 170 | self.vbox.pack_start(hbox) 171 | label = gtk.Label(_("Text direction: ")) 172 | hbox.pack_start(label) 173 | self.td_cbt = gtk.combo_box_new_text() 174 | self.td_cbt.append_text(_("default")) 175 | self.td_cbt.append_text(_("left-right")) 176 | self.td_cbt.append_text(_("top-down")) 177 | self.td_cbt.append_text(_("bottom-up")) 178 | self.td_cbt.connect("changed", self.__text_direction_changed) 179 | hbox.pack_start(self.td_cbt) 180 | 181 | self.show_all() 182 | 183 | def run(self): 184 | font = self.get_setting("font", "Sans 14") 185 | self.font_button.set_font_name(font) 186 | color = gtk.gdk.color_parse(self.get_setting("color", "#FFFFFF")) 187 | self.color_button.set_color(color) 188 | self.cf_entry.set_text(self.get_setting("custom_format", 189 | DEFAULT_CUSTOM_FORMAT)) 190 | td = self.get_setting("text_direction", "default") 191 | tds = ["default", "left-right", "top-down", "bottom-up"] 192 | self.td_cbt.set_active(tds.index(td)) 193 | cf = self.get_setting("use_custom_format", False) 194 | self.custom_clock_cb.set_active(cf) 195 | self.font_button.set_sensitive(not cf) 196 | self.color_button.set_sensitive(not cf) 197 | self.date_cb.set_sensitive(not cf) 198 | self.cf_entry.set_sensitive(cf) 199 | self.cf_button.set_sensitive(cf) 200 | return DockXAppletDialog.run(self) 201 | 202 | def __set_font(self, button): 203 | self.set_setting("font", button.get_font_name()) 204 | 205 | def __color_set(self, button): 206 | # Read the value from color (and alpha) and write 207 | # it as 8-bit/channel hex string for gconf. 208 | # (Alpha is written like int (0-255).) 209 | color = button.get_color().to_string() 210 | # cs has 16-bit per color, we want 8. 211 | color = color[0:3] + color[5:7] + color[9:11] 212 | self.set_setting("color", color) 213 | 214 | def __cb_toggled(self, button, key): 215 | self.set_setting(key, button.get_active()) 216 | if key == "use_custom_format": 217 | cf = button.get_active() 218 | self.font_button.set_sensitive(not cf) 219 | self.color_button.set_sensitive(not cf) 220 | self.date_cb.set_sensitive(not cf) 221 | self.cf_entry.set_sensitive(cf) 222 | self.cf_button.set_sensitive(cf) 223 | 224 | def __set_custom_format(self, *args): 225 | self.set_setting("custom_format", self.cf_entry.get_text()) 226 | 227 | def __text_direction_changed(self, cbt): 228 | text = cbt.get_active_text() 229 | direction = {_("default"): "default", 230 | _("left-right"):"left-right", 231 | _("top-down"):"top-down", 232 | _("bottom-up"):"bottom-up"}.get(text, "default") 233 | self.set_setting("text_direction", direction) 234 | 235 | # All applets needs to have this functions 236 | def get_dbx_applet(dbx_dict): 237 | # This is the function that dockx will be calling. 238 | # Returns an instance of the applet. 239 | applet = ClockApplet(dbx_dict) 240 | return applet 241 | 242 | def run_applet_dialog(name): 243 | dialog = ClockAppletPreferences(name) 244 | dialog.run() 245 | dialog.destroy() 246 | 247 | -------------------------------------------------------------------------------- /dockx_applets/hello_world.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Hello World 3 | exec=hello_world.py 4 | 5 | @description 6 | Writes "Hello World" on the panel. 7 | -------------------------------------------------------------------------------- /dockx_applets/hello_world.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # Hello world dockbarx applet 4 | # 5 | # Copyright 2011 Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see Hello World!") 30 | label.set_use_markup(True) 31 | # DockXApplet base class is pretty much a gtk.EventBox. 32 | # so all you have to do is adding your widget with self.add() 33 | self.add(label) 34 | label.show() 35 | self.show() 36 | 37 | #~ class HelloWorldPreferences(DockXAppletDialog): 38 | #~ Title = "Clock Applet Preference" 39 | #~ 40 | #~ def __init__(self): 41 | #~ DockXAppletDialog.__init__(self, APPLET_NAME) 42 | 43 | #~ def run(self): 44 | #~ DockXApplet.run(self) 45 | 46 | # All applets needs to have this function 47 | def get_dbx_applet(dbx_dict): 48 | # This is the function that dockx will be calling. 49 | # Returns an instance of the applet. 50 | applet = HelloWorldApplet(dbx_dict) 51 | return applet 52 | 53 | 54 | #~ def run_applet_dialog(): 55 | #~ dialog = HelloWorldPreferences() 56 | #~ dialog.run() 57 | #~ dialog.destroy() 58 | 59 | -------------------------------------------------------------------------------- /dockx_applets/namebar.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Namebar 3 | exec=namebar.py 4 | 5 | @description 6 | Shows the name and minimize/maximize/close buttons of the active or topmost maximized window. 7 | -------------------------------------------------------------------------------- /dockx_applets/namebar_themes/Dust-ish.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/dockx_applets/namebar_themes/Dust-ish.tar.gz -------------------------------------------------------------------------------- /dockx_applets/namebar_themes/Human-ish.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/dockx_applets/namebar_themes/Human-ish.tar.gz -------------------------------------------------------------------------------- /dockx_applets/namebar_themes/New Wave-ish.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/dockx_applets/namebar_themes/New Wave-ish.tar.gz -------------------------------------------------------------------------------- /dockx_applets/namebar_window_buttons.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Window Buttons 3 | exec=namebar_window_buttons.py 4 | 5 | @description 6 | Shows minimize/maximize/close buttons for the active or the topmost maximized window. 7 | -------------------------------------------------------------------------------- /dockx_applets/namebar_window_title.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Window Title 3 | exec=namebar_window_title.py 4 | 5 | @description 6 | Shows the name of the active or the topmost maximized window. 7 | -------------------------------------------------------------------------------- /dockx_applets/vc-themes/Black/index.theme: -------------------------------------------------------------------------------- 1 | [Icon Theme] 2 | Name=Black 3 | 4 | Directories=scalable 5 | 6 | [scalable] 7 | Size=48 8 | MaxSize=256 9 | Context=Apps 10 | Type=Scalable 11 | 12 | -------------------------------------------------------------------------------- /dockx_applets/vc-themes/Minimal/index.theme: -------------------------------------------------------------------------------- 1 | [Icon Theme] 2 | Name=Minimal 3 | 4 | Directories=scalable 5 | 6 | [scalable] 7 | Size=48 8 | MaxSize=256 9 | Context=Apps 10 | Type=Scalable 11 | 12 | -------------------------------------------------------------------------------- /dockx_applets/volume-control.applet: -------------------------------------------------------------------------------- 1 | @dbx applet 2 | name=Volume Control 3 | exec=volume-control.py 4 | 5 | @description 6 | Applet to control your computer's volume 7 | -------------------------------------------------------------------------------- /dockx_applets/volume-control.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 100 7 | 4 8 | 10 9 | 10 | 11 | 12 | 13 | True 14 | 3 15 | 18 16 | 17 | 18 | True 19 | 6 20 | 21 | 22 | True 23 | 0 24 | none 25 | 26 | 27 | True 28 | 6 29 | 12 30 | 31 | 32 | True 33 | 6 34 | 35 | 36 | True 37 | 12 38 | 39 | 40 | True 41 | 0 42 | _Device: 43 | True 44 | combobox-device 45 | 46 | 47 | 48 | 49 | 50 | False 51 | 0 52 | 53 | 54 | 55 | 56 | True 57 | liststore-device 58 | 59 | 60 | 61 | 62 | 63 | 1 64 | 65 | 66 | 67 | 68 | 0 69 | 70 | 71 | 72 | 73 | True 74 | 12 75 | 76 | 77 | True 78 | 6 79 | 80 | 81 | True 82 | 0 83 | _Mixer track: 84 | True 85 | combobox-mixer-track 86 | 87 | 88 | 89 | 90 | False 91 | 0 92 | 93 | 94 | 95 | 96 | True 97 | liststore-mixer-track 98 | 99 | 100 | 101 | 102 | 103 | 1 104 | 105 | 106 | 107 | 108 | 1 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | True 118 | <b>Audio Options</b> 119 | True 120 | 121 | 122 | 123 | 124 | False 125 | 0 126 | 127 | 128 | 129 | 130 | False 131 | 0 132 | 133 | 134 | 135 | 136 | True 137 | 6 138 | 139 | 140 | True 141 | 0 142 | none 143 | 144 | 145 | True 146 | 6 147 | 12 148 | 149 | 150 | True 151 | 6 152 | 153 | 154 | True 155 | 12 156 | 157 | 158 | True 159 | 0 160 | _Theme: 161 | True 162 | combobox-theme 163 | 164 | 165 | 166 | 167 | 168 | False 169 | 0 170 | 171 | 172 | 173 | 174 | True 175 | liststore-theme 176 | 177 | 178 | 179 | 180 | 181 | 1 182 | 183 | 184 | 185 | 186 | 0 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | True 196 | <b>Display</b> 197 | True 198 | 199 | 200 | 201 | 202 | False 203 | 0 204 | 205 | 206 | 207 | 208 | False 209 | 1 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | True 219 | 1 220 | 6 221 | 222 | 223 | True 224 | 0 225 | audio-volume-low 226 | 227 | 228 | False 229 | 0 230 | 231 | 232 | 233 | 234 | True 235 | 0 236 | 0 237 | 3 238 | 239 | 240 | 180 241 | True 242 | True 243 | adjustment1 244 | False 245 | right 246 | 247 | 248 | 249 | 250 | 1 251 | 252 | 253 | 254 | 255 | True 256 | 0 257 | 4 258 | 259 | 260 | True 261 | 1 262 | 0 263 | 100% 264 | 5 265 | 266 | 267 | 268 | 269 | False 270 | 2 271 | 272 | 273 | 274 | 275 | True 276 | 0 277 | audio-volume-high 278 | 279 | 280 | False 281 | 3 282 | 283 | 284 | 285 | 286 | True 287 | 0 288 | 0 289 | 0 290 | 291 | 292 | _Mute 293 | True 294 | True 295 | False 296 | False 297 | True 298 | True 299 | 300 | 301 | 302 | 303 | False 304 | 4 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | -------------------------------------------------------------------------------- /icons/hicolor/128x128/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/128x128/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/16x16/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/16x16/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/22x22/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/22x22/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/24x24/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/24x24/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/36x36/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/36x36/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/48x48/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/48x48/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/64x64/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/64x64/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/72x72/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/72x72/apps/dockbarx.png -------------------------------------------------------------------------------- /icons/hicolor/96x96/apps/dockbarx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/icons/hicolor/96x96/apps/dockbarx.png -------------------------------------------------------------------------------- /make_translate_template.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Run this to make a dockbarx.pot template file for translation of dockbarx. 3 | xgettext --language=Python --keyword=_ --output=po/dockbarx.pot --from-code=UTF-8 `find . -name "*.py" -not -path "./build/*"` dockx dbx_preference dockbarx_factory 4 | -------------------------------------------------------------------------------- /msgfmt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Written by Martin v. Lwis 3 | # Plural forms support added by alexander smishlajev 4 | """ 5 | Generate binary message catalog from textual translation description. 6 | This program converts a textual Uniforum-style message catalog (.po file) into 7 | a binary GNU catalog (.mo file). This is essentially the same function as the 8 | GNU msgfmt program, however, it is a simpler implementation. 9 | 10 | Usage: msgfmt.py [OPTIONS] filename.po 11 | 12 | Options: 13 | -o file 14 | --output-file=file 15 | Specify the output file to write to. If omitted, output will go to a 16 | file named filename.mo (based off the input file name). 17 | -h 18 | --help 19 | Print this message and exit. 20 | 21 | -V 22 | --version 23 | Display version information and exit. 24 | """ 25 | 26 | import sys 27 | import os 28 | import getopt 29 | import struct 30 | import array 31 | 32 | __version__ = "1.1" 33 | 34 | MESSAGES = {} 35 | 36 | 37 | def usage (ecode, msg=""): 38 | """ 39 | Print usage and msg and exit with given code. 40 | """ 41 | print >> sys.stderr, __doc__ 42 | if msg: 43 | print >> sys.stderr, msg 44 | sys.exit(ecode) 45 | 46 | def add (msgid, transtr, fuzzy): 47 | """ 48 | Add a non-fuzzy translation to the dictionary. 49 | """ 50 | global MESSAGES 51 | if not fuzzy and transtr and not transtr.startswith("\0"): 52 | MESSAGES[msgid] = transtr 53 | 54 | def generate (): 55 | """ 56 | Return the generated output. 57 | """ 58 | global MESSAGES 59 | keys = MESSAGES.keys() 60 | # the keys are sorted in the .mo file 61 | keys.sort() 62 | offsets = [] 63 | ids = strs = "" 64 | for _id in keys: 65 | # For each string, we need size and file offset. Each string is NUL 66 | # terminated; the NUL does not count into the size. 67 | offsets.append((len(ids), len(_id), len(strs), len(MESSAGES[_id]))) 68 | ids += _id + "\0" 69 | strs += MESSAGES[_id] + "\0" 70 | output = "" 71 | # The header is 7 32-bit unsigned integers. We don't use hash tables, so 72 | # the keys start right after the index tables. 73 | # translated string. 74 | keystart = 7*4+16*len(keys) 75 | # and the values start after the keys 76 | valuestart = keystart + len(ids) 77 | koffsets = [] 78 | voffsets = [] 79 | # The string table first has the list of keys, then the list of values. 80 | # Each entry has first the size of the string, then the file offset. 81 | for o1, l1, o2, l2 in offsets: 82 | koffsets += [l1, o1+keystart] 83 | voffsets += [l2, o2+valuestart] 84 | offsets = koffsets + voffsets 85 | output = struct.pack("Iiiiiii", 86 | 0x950412deL, # Magic 87 | 0, # Version 88 | len(keys), # # of entries 89 | 7*4, # start of key index 90 | 7*4+len(keys)*8, # start of value index 91 | 0, 0) # size and offset of hash table 92 | output += array.array("i", offsets).tostring() 93 | output += ids 94 | output += strs 95 | return output 96 | 97 | 98 | def make (filename, outfile): 99 | ID = 1 100 | STR = 2 101 | global MESSAGES 102 | MESSAGES = {} 103 | 104 | # Compute .mo name from .po name and arguments 105 | if filename.endswith(".po"): 106 | infile = filename 107 | else: 108 | infile = filename + ".po" 109 | if outfile is None: 110 | outfile = os.path.splitext(infile)[0] + ".mo" 111 | 112 | try: 113 | lines = open(infile).readlines() 114 | except IOError, msg: 115 | print >> sys.stderr, msg 116 | sys.exit(1) 117 | section = None 118 | fuzzy = 0 119 | 120 | # Parse the catalog 121 | msgid = msgstr = "" 122 | lno = 0 123 | for l in lines: 124 | lno += 1 125 | # If we get a comment line after a msgstr, this is a new entry 126 | if l[0] == "#" and section == STR: 127 | add(msgid, msgstr, fuzzy) 128 | section = None 129 | fuzzy = 0 130 | # Record a fuzzy mark 131 | if l[:2] == "#," and (l.find("fuzzy") >= 0): 132 | fuzzy = 1 133 | # Skip comments 134 | if l[0] == "#": 135 | continue 136 | # Start of msgid_plural section, separate from singular form with \0 137 | if l.startswith("msgid_plural"): 138 | msgid += "\0" 139 | l = l[12:] 140 | # Now we are in a msgid section, output previous section 141 | elif l.startswith("msgid"): 142 | if section == STR: 143 | add(msgid, msgstr, fuzzy) 144 | section = ID 145 | l = l[5:] 146 | msgid = msgstr = "" 147 | # Now we are in a msgstr section 148 | elif l.startswith("msgstr"): 149 | section = STR 150 | l = l[6:] 151 | # Check for plural forms 152 | if l.startswith("["): 153 | # Separate plural forms with \0 154 | if not l.startswith("[0]"): 155 | msgstr += "\0" 156 | # Ignore the index - must come in sequence 157 | l = l[l.index("]") + 1:] 158 | # Skip empty lines 159 | l = l.strip() 160 | if not l: 161 | continue 162 | # XXX: Does this always follow Python escape semantics? 163 | l = eval(l) 164 | if section == ID: 165 | msgid += l 166 | elif section == STR: 167 | msgstr += l 168 | else: 169 | print >> sys.stderr, "Syntax error on %s:%d" % (infile, lno), \ 170 | "before:" 171 | print >> sys.stderr, l 172 | sys.exit(1) 173 | # Add last entry 174 | if section == STR: 175 | add(msgid, msgstr, fuzzy) 176 | # Compute output 177 | output = generate() 178 | 179 | try: 180 | open(outfile,"wb").write(output) 181 | except IOError,msg: 182 | print >> sys.stderr, msg 183 | 184 | def main (): 185 | try: 186 | opts, args = getopt.getopt(sys.argv[1:], "hVo:", 187 | ["help", "version", "output-file="]) 188 | except getopt.error, msg: 189 | usage(1, msg) 190 | 191 | outfile = None 192 | # parse options 193 | for opt, arg in opts: 194 | if opt in ("-h", "--help"): 195 | usage(0) 196 | elif opt in ("-V", "--version"): 197 | print >> sys.stderr, "msgfmt.py", __version__ 198 | sys.exit(0) 199 | elif opt in ("-o", "--output-file"): 200 | outfile = arg 201 | # do it 202 | if not args: 203 | print >> sys.stderr, "No input file given" 204 | print >> sys.stderr, "Try `msgfmt --help' for more information." 205 | return 206 | 207 | for filename in args: 208 | make(filename, outfile) 209 | 210 | 211 | if __name__ == "__main__": 212 | main() 213 | -------------------------------------------------------------------------------- /po-themes/bg.po: -------------------------------------------------------------------------------- 1 | # Bulgarian translation for dockbar 2 | # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2011. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-10-10 12:40+0000\n" 12 | "Last-Translator: Svetoslav Stefanov \n" 13 | "Language-Team: Bulgarian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Фон на списъка с прозорци" 22 | 23 | msgid "Normal text" 24 | msgstr "Нормален текст" 25 | 26 | msgid "Active window text" 27 | msgstr "Текст на активния прозорец" 28 | 29 | msgid "Active window" 30 | msgstr "Активен прозорец" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Текст на минимизирания прозорец" 34 | 35 | msgid "Active color" 36 | msgstr "Цвят на активния прозорец" 37 | 38 | msgid "Not used" 39 | msgstr "Не се използва" 40 | 41 | msgid "Active" 42 | msgstr "Активен" 43 | 44 | msgid "Launching color" 45 | msgstr "Цвят на стартиране" 46 | 47 | msgid "Attention color" 48 | msgstr "Цвят на внимание" 49 | 50 | msgid "Minimized color" 51 | msgstr "Цвят на минимизиран прозорец" 52 | 53 | msgid "Active glow" 54 | msgstr "Осветяване на активния прозорец" 55 | 56 | msgid "Button color" 57 | msgstr "Цвят на бутона" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Цвят на активния прозорец и индикатора" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Цвят на активния прозорец и точките" 64 | -------------------------------------------------------------------------------- /po-themes/cs.po: -------------------------------------------------------------------------------- 1 | # Czech translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-12-07 19:39+0000\n" 12 | "Last-Translator: Matias Särs \n" 13 | "Language-Team: Czech \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Pozadí seznamu oken" 22 | 23 | msgid "Normal text" 24 | msgstr "Normální text" 25 | 26 | msgid "Active window text" 27 | msgstr "Text aktivního okna" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Text minimalizovaného okna" 34 | 35 | msgid "Active color" 36 | msgstr "Aktivní barva" 37 | 38 | msgid "Not used" 39 | msgstr "Nepoužito" 40 | 41 | msgid "Active" 42 | msgstr "Aktivní" 43 | 44 | msgid "Launching color" 45 | msgstr "Barva spouštění" 46 | 47 | msgid "Attention color" 48 | msgstr "Barva upozornění" 49 | 50 | msgid "Minimized color" 51 | msgstr "Barva minimalizovaného" 52 | 53 | msgid "Active glow" 54 | msgstr "Záře aktivního" 55 | 56 | msgid "Button color" 57 | msgstr "Barva tlačítka" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Barva aktivní + indikátor" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Barva aktivní + tečky" 64 | -------------------------------------------------------------------------------- /po-themes/da.po: -------------------------------------------------------------------------------- 1 | # Danish translation for dockbar 2 | # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2011. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-02-20 02:59+0000\n" 12 | "Last-Translator: Glenn Dufke \n" 13 | "Language-Team: Danish \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Vinduesliste baggrund" 22 | 23 | msgid "Normal text" 24 | msgstr "Normal tekst" 25 | 26 | msgid "Active window text" 27 | msgstr "Aktive vindues tekst" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Minimeret vindues tekst" 34 | 35 | msgid "Active color" 36 | msgstr "Aktive farve" 37 | 38 | msgid "Not used" 39 | msgstr "Ikke brugt" 40 | 41 | msgid "Active" 42 | msgstr "Aktiv" 43 | 44 | msgid "Launching color" 45 | msgstr "Farve ved opstart" 46 | 47 | msgid "Attention color" 48 | msgstr "Farve ved opmærksomhed" 49 | 50 | msgid "Minimized color" 51 | msgstr "Farve ved minimeret" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktive glød" 55 | 56 | msgid "Button color" 57 | msgstr "Knap farve" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Aktive + indikator farve" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Aktive + prik farve" 64 | -------------------------------------------------------------------------------- /po-themes/de.po: -------------------------------------------------------------------------------- 1 | # German translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2012-02-24 00:15+0000\n" 12 | "Last-Translator: Macedon \n" 13 | "Language-Team: German \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Active window" 21 | msgstr "Aktive Fenster" 22 | 23 | msgid "Window list background" 24 | msgstr "Fensterlisten-Hintergrund" 25 | 26 | msgid "Normal text" 27 | msgstr "Normaler Text" 28 | 29 | msgid "Active window text" 30 | msgstr "Text eines aktiven Fensters" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Text eines minimierten Fensters" 34 | 35 | msgid "Active color" 36 | msgstr "Aktive Farbe" 37 | 38 | msgid "Not used" 39 | msgstr "Nicht verwendet" 40 | 41 | msgid "Active" 42 | msgstr "Aktiv" 43 | 44 | msgid "Launching color" 45 | msgstr "Startfarbe" 46 | 47 | msgid "Attention color" 48 | msgstr "Aufmerksamkeitsfarbe" 49 | 50 | msgid "Minimized color" 51 | msgstr "Farbe eines minimierten Fensters" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktives Leuchten" 55 | 56 | msgid "Button color" 57 | msgstr "Knopffarbe" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Aktiv- + Anzeigefarbe" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Aktiv- + Punktefarbe" 64 | -------------------------------------------------------------------------------- /po-themes/dockbarx-themes.pot: -------------------------------------------------------------------------------- 1 | #, fuzzy 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: PACKAGE VERSION\n" 5 | "Report-Msgid-Bugs-To: \n" 6 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 7 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 8 | "Last-Translator: FULL NAME \n" 9 | "Language-Team: LANGUAGE \n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "X-Launchpad-Export-Date: 2011-09-29 20:48+0000\n" 14 | "X-Generator: Launchpad (build 14063)\n" 15 | 16 | msgid "Window list background" 17 | msgstr "" 18 | 19 | msgid "Normal text" 20 | msgstr "" 21 | 22 | msgid "Active window text" 23 | msgstr "" 24 | 25 | msgid "Active window" 26 | msgstr "" 27 | 28 | msgid "Minimized window text" 29 | msgstr "" 30 | 31 | msgid "Active color" 32 | msgstr "" 33 | 34 | msgid "Not used" 35 | msgstr "" 36 | 37 | msgid "Active" 38 | msgstr "" 39 | 40 | msgid "Launching color" 41 | msgstr "" 42 | 43 | msgid "Attention color" 44 | msgstr "" 45 | 46 | msgid "Minimized color" 47 | msgstr "" 48 | 49 | msgid "Active glow" 50 | msgstr "" 51 | 52 | msgid "Button color" 53 | msgstr "" 54 | 55 | # Theme unite_v 56 | msgid "Active + indicator color" 57 | msgstr "" 58 | 59 | # Theme Dock[_v] 60 | msgid "Active + dots color" 61 | msgstr "" 62 | -------------------------------------------------------------------------------- /po-themes/el.po: -------------------------------------------------------------------------------- 1 | # Greek translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-10-03 23:49+0000\n" 12 | "Last-Translator: Matias Särs \n" 13 | "Language-Team: Greek \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "" 22 | 23 | msgid "Normal text" 24 | msgstr "Κανονικό κείμενο" 25 | 26 | msgid "Active window text" 27 | msgstr "Κείμενο ενεργού παραθύρου" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Κείμενο ελαχιστοποιημένου παραθύρου" 34 | 35 | msgid "Active color" 36 | msgstr "Ενεργό χρώμα" 37 | 38 | msgid "Not used" 39 | msgstr "Δε χρησιμοποιείται" 40 | 41 | msgid "Active" 42 | msgstr "Ενεργό" 43 | 44 | msgid "Launching color" 45 | msgstr "Χρώμα εκκίνησης" 46 | 47 | msgid "Attention color" 48 | msgstr "Χρώμα προσοχής" 49 | 50 | msgid "Minimized color" 51 | msgstr "" 52 | 53 | msgid "Active glow" 54 | msgstr "Λάμψη ενεργού παραθύρου" 55 | 56 | msgid "Button color" 57 | msgstr "Χρώμα κουμπιού" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "" 61 | 62 | msgid "Active + dots color" 63 | msgstr "" 64 | -------------------------------------------------------------------------------- /po-themes/en_GB.po: -------------------------------------------------------------------------------- 1 | # English (United Kingdom) translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-09-02 18:06+0000\n" 12 | "Last-Translator: Anthony Harrington \n" 13 | "Language-Team: English (United Kingdom) \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Window list background" 22 | 23 | msgid "Normal text" 24 | msgstr "Normal text" 25 | 26 | msgid "Active window text" 27 | msgstr "Active window text" 28 | 29 | msgid "Active window" 30 | msgstr "Active window" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Minimised window text" 34 | 35 | msgid "Active color" 36 | msgstr "Active colour" 37 | 38 | msgid "Not used" 39 | msgstr "Not used" 40 | 41 | msgid "Active" 42 | msgstr "Active" 43 | 44 | msgid "Launching color" 45 | msgstr "Launching colour" 46 | 47 | msgid "Attention color" 48 | msgstr "Attention colour" 49 | 50 | msgid "Minimized color" 51 | msgstr "Minimised colour" 52 | 53 | msgid "Active glow" 54 | msgstr "Active glow" 55 | 56 | msgid "Button color" 57 | msgstr "Button colour" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Active + indicator colour" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Active + dots colour" 64 | -------------------------------------------------------------------------------- /po-themes/es.po: -------------------------------------------------------------------------------- 1 | # Spanish translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2012-01-06 12:16+0000\n" 12 | "Last-Translator: Marti Bosch \n" 13 | "Language-Team: Spanish \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Fondo de la lista de ventanas" 22 | 23 | msgid "Normal text" 24 | msgstr "Texto normal" 25 | 26 | msgid "Active window text" 27 | msgstr "Texto para la ventana activa" 28 | 29 | msgid "Active window" 30 | msgstr "Ventana activa" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Texto para ventana minimizada" 34 | 35 | msgid "Active color" 36 | msgstr "Color activo" 37 | 38 | msgid "Not used" 39 | msgstr "No usado" 40 | 41 | msgid "Active" 42 | msgstr "Activo" 43 | 44 | msgid "Launching color" 45 | msgstr "Color al abrir" 46 | 47 | msgid "Attention color" 48 | msgstr "Color de atención" 49 | 50 | msgid "Minimized color" 51 | msgstr "Color al minimizar" 52 | 53 | msgid "Active glow" 54 | msgstr "Resplandor activo" 55 | 56 | msgid "Button color" 57 | msgstr "Color de botón" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Color activo + indicador" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Active + puntos de colores" 64 | -------------------------------------------------------------------------------- /po-themes/eu.po: -------------------------------------------------------------------------------- 1 | # Basque translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-12-08 20:03+0000\n" 12 | "Last-Translator: Ander Elortondo \n" 13 | "Language-Team: Basque \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Leiho zerrendaren atzeko planoa" 22 | 23 | msgid "Normal text" 24 | msgstr "Testu normala" 25 | 26 | msgid "Active window text" 27 | msgstr "Leiho aktiboaren testua" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Leiho minimizatuaren testua" 34 | 35 | msgid "Active color" 36 | msgstr "Aktiboaren kolorea" 37 | 38 | msgid "Not used" 39 | msgstr "Erabili gabe" 40 | 41 | msgid "Active" 42 | msgstr "Aktiboa" 43 | 44 | msgid "Launching color" 45 | msgstr "Abiarazten kolorea" 46 | 47 | msgid "Attention color" 48 | msgstr "Harreta kolorea" 49 | 50 | msgid "Minimized color" 51 | msgstr "Minimizatu kolorea" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktiboaren disdira" 55 | 56 | msgid "Button color" 57 | msgstr "Botoi kolorea" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Aktiboa + adierazlea kolorea" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Aktiboa + puntuak kolorea" 64 | -------------------------------------------------------------------------------- /po-themes/fi.po: -------------------------------------------------------------------------------- 1 | # Finnish translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-10-09 21:20+0000\n" 12 | "Last-Translator: Jiri Grönroos \n" 13 | "Language-Team: Finnish \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Ikkunalistan tausta" 22 | 23 | msgid "Normal text" 24 | msgstr "Tavallinen teksti" 25 | 26 | msgid "Active window text" 27 | msgstr "Aktiivisen ikkunan teksti" 28 | 29 | msgid "Active window" 30 | msgstr "Aktiivinen ikkuna" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Pienennetyn ikkunan teksti" 34 | 35 | msgid "Active color" 36 | msgstr "Aktiivinen väri" 37 | 38 | msgid "Not used" 39 | msgstr "Ei käytössä" 40 | 41 | msgid "Active" 42 | msgstr "Käytössä" 43 | 44 | msgid "Launching color" 45 | msgstr "Käynnistysväri" 46 | 47 | msgid "Attention color" 48 | msgstr "Huomioväri" 49 | 50 | msgid "Minimized color" 51 | msgstr "Pienennettyjen väri" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktiivinen hehku" 55 | 56 | msgid "Button color" 57 | msgstr "Painikkeen väri" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Aktiivinen + ilmoittimen väri" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Aktiivinen + pisteiden väri" 64 | -------------------------------------------------------------------------------- /po-themes/fr.po: -------------------------------------------------------------------------------- 1 | # French translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-11-20 16:17+0000\n" 12 | "Last-Translator: Aurélien RIVIERE \n" 13 | "Language-Team: French \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Arrière-plan de la liste des fenêtres" 22 | 23 | msgid "Normal text" 24 | msgstr "Texte normal" 25 | 26 | msgid "Active window text" 27 | msgstr "Texte de la fenêtre active" 28 | 29 | msgid "Active window" 30 | msgstr "Fenêtre active" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Texte de la fenêtre minimisée" 34 | 35 | msgid "Active color" 36 | msgstr "Couleur active" 37 | 38 | msgid "Not used" 39 | msgstr "Non utilisé" 40 | 41 | msgid "Active" 42 | msgstr "Active" 43 | 44 | msgid "Launching color" 45 | msgstr "Couleur de lancement" 46 | 47 | msgid "Attention color" 48 | msgstr "Couleur de demande d'attention" 49 | 50 | msgid "Minimized color" 51 | msgstr "Couleur minimisée" 52 | 53 | msgid "Active glow" 54 | msgstr "Lueur active" 55 | 56 | msgid "Button color" 57 | msgstr "Couleur du bouton" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Active + indicateur de couleur" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Active + points de couleur" 64 | -------------------------------------------------------------------------------- /po-themes/hu.po: -------------------------------------------------------------------------------- 1 | # Hungarian translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2012-06-13 17:03+0000\n" 12 | "Last-Translator: Molditz György \n" 13 | "Language-Team: Hungarian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Ablak lista háttér" 22 | 23 | msgid "Normal text" 24 | msgstr "Normál szöveg" 25 | 26 | msgid "Active window text" 27 | msgstr "Aktív ablak szöveg" 28 | 29 | msgid "Active window" 30 | msgstr "Aktív ablak" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Minimalizált ablak szöveg" 34 | 35 | msgid "Active color" 36 | msgstr "Aktív szín" 37 | 38 | msgid "Not used" 39 | msgstr "Nem használt" 40 | 41 | msgid "Active" 42 | msgstr "Aktív" 43 | 44 | msgid "Launching color" 45 | msgstr "Indítás színe" 46 | 47 | msgid "Attention color" 48 | msgstr "Figyelmeztetés színe" 49 | 50 | msgid "Minimized color" 51 | msgstr "Minimalizált szín" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktív fény" 55 | 56 | msgid "Button color" 57 | msgstr "Gomb színe" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Aktív + jelző szín" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Aktív + pontok színe" 64 | -------------------------------------------------------------------------------- /po-themes/it.po: -------------------------------------------------------------------------------- 1 | # Italian translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-09-21 19:54+0000\n" 12 | "Last-Translator: simone.sandri \n" 13 | "Language-Team: Italian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Sfondo lista finestre" 22 | 23 | msgid "Normal text" 24 | msgstr "Testo normale" 25 | 26 | msgid "Active window text" 27 | msgstr "Testo della finestra attiva" 28 | 29 | msgid "Active window" 30 | msgstr "Finestra attiva" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Testo della finestra minimizzata" 34 | 35 | msgid "Active color" 36 | msgstr "Colore attivo" 37 | 38 | msgid "Not used" 39 | msgstr "Non usato" 40 | 41 | msgid "Active" 42 | msgstr "Attiva" 43 | 44 | msgid "Launching color" 45 | msgstr "Colore al lancio" 46 | 47 | msgid "Attention color" 48 | msgstr "Colore ad una richiesta di attenzione" 49 | 50 | msgid "Minimized color" 51 | msgstr "Colore dell'applicazione minimizzata" 52 | 53 | msgid "Active glow" 54 | msgstr "Bagliore del pulsante attivo" 55 | 56 | msgid "Button color" 57 | msgstr "Colore del pulsante" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Colore del pulsante attivo (con indicatore)" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Colore del pulsante attivo (con punto)" 64 | -------------------------------------------------------------------------------- /po-themes/ja.po: -------------------------------------------------------------------------------- 1 | # Japanese translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-09-18 02:34+0000\n" 12 | "Last-Translator: kawaji \n" 13 | "Language-Team: Japanese \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "ウィンドウリストの背景" 22 | 23 | msgid "Normal text" 24 | msgstr "通常時の文字" 25 | 26 | msgid "Active window text" 27 | msgstr "アクティブウィンドウの文字" 28 | 29 | msgid "Active window" 30 | msgstr "アクティブウィンドウ" 31 | 32 | msgid "Minimized window text" 33 | msgstr "最小化ウィンドウの文字" 34 | 35 | msgid "Active color" 36 | msgstr "アクティブ時の色" 37 | 38 | msgid "Not used" 39 | msgstr "不使用" 40 | 41 | msgid "Active" 42 | msgstr "アクティブ時" 43 | 44 | msgid "Launching color" 45 | msgstr "起動途中時の色" 46 | 47 | msgid "Attention color" 48 | msgstr "注意要求時の色" 49 | 50 | msgid "Minimized color" 51 | msgstr "最小化時の色" 52 | 53 | msgid "Active glow" 54 | msgstr "アクティブ時の発光" 55 | 56 | msgid "Button color" 57 | msgstr "ボタンの色" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "アクティブ時+インジケータの色" 61 | 62 | msgid "Active + dots color" 63 | msgstr "アクティブ時+ドットの色" 64 | -------------------------------------------------------------------------------- /po-themes/ko.po: -------------------------------------------------------------------------------- 1 | # Korean translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-09-04 06:39+0000\n" 12 | "Last-Translator: Kim Boram \n" 13 | "Language-Team: Kim Boram \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "창 목록 배경" 22 | 23 | msgid "Normal text" 24 | msgstr "보통 글자" 25 | 26 | msgid "Active window text" 27 | msgstr "사용 중인 창 글자" 28 | 29 | msgid "Active window" 30 | msgstr "활성 창" 31 | 32 | msgid "Minimized window text" 33 | msgstr "최소화된 창 글자" 34 | 35 | msgid "Active color" 36 | msgstr "사용 중인 창 강조" 37 | 38 | msgid "Not used" 39 | msgstr "사용하지 않음" 40 | 41 | msgid "Active" 42 | msgstr "사용 중" 43 | 44 | msgid "Launching color" 45 | msgstr "실행 중인 것을 나타낼 색" 46 | 47 | msgid "Attention color" 48 | msgstr "주의가 필요한 것을 나타낼 색" 49 | 50 | msgid "Minimized color" 51 | msgstr "최소화된 창 색" 52 | 53 | msgid "Active glow" 54 | msgstr "사용 중인 창 발광" 55 | 56 | msgid "Button color" 57 | msgstr "단추 색" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "사용 중 + 알리미 색" 61 | 62 | msgid "Active + dots color" 63 | msgstr "사용 중 + 점 색" 64 | -------------------------------------------------------------------------------- /po-themes/lt.po: -------------------------------------------------------------------------------- 1 | # Lithuanian translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-12-07 19:35+0000\n" 12 | "Last-Translator: Mantas Kriaučiūnas \n" 13 | "Language-Team: Lithuanian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "" 22 | 23 | msgid "Normal text" 24 | msgstr "Normalus tekstas" 25 | 26 | msgid "Active window text" 27 | msgstr "" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "" 34 | 35 | msgid "Active color" 36 | msgstr "" 37 | 38 | msgid "Not used" 39 | msgstr "" 40 | 41 | msgid "Active" 42 | msgstr "Aktyvus" 43 | 44 | msgid "Launching color" 45 | msgstr "" 46 | 47 | msgid "Attention color" 48 | msgstr "" 49 | 50 | msgid "Minimized color" 51 | msgstr "" 52 | 53 | msgid "Active glow" 54 | msgstr "" 55 | 56 | msgid "Button color" 57 | msgstr "Mygtuko spalva" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "" 61 | 62 | msgid "Active + dots color" 63 | msgstr "" 64 | -------------------------------------------------------------------------------- /po-themes/nl.po: -------------------------------------------------------------------------------- 1 | # Dutch translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-12-07 15:52+0000\n" 12 | "Last-Translator: Justin van Beusekom \n" 13 | "Language-Team: Dutch \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Schermlijst achtergrond" 22 | 23 | msgid "Normal text" 24 | msgstr "Normale tekst" 25 | 26 | msgid "Active window text" 27 | msgstr "Tekst in actief venster" 28 | 29 | msgid "Active window" 30 | msgstr "Actief venster" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Tekst in geminimaliseerd venster" 34 | 35 | msgid "Active color" 36 | msgstr "Actieve kleur" 37 | 38 | msgid "Not used" 39 | msgstr "Niet gebruikt" 40 | 41 | msgid "Active" 42 | msgstr "Actief" 43 | 44 | msgid "Launching color" 45 | msgstr "Opstartkleur" 46 | 47 | msgid "Attention color" 48 | msgstr "Opvallende kleur" 49 | 50 | msgid "Minimized color" 51 | msgstr "Geminimaliseerde kleur" 52 | 53 | msgid "Active glow" 54 | msgstr "Actieve gloed" 55 | 56 | msgid "Button color" 57 | msgstr "Knop kleur" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Actieve + aanwijzer kleur" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Actief + stippellijn kleur" 64 | -------------------------------------------------------------------------------- /po-themes/pl.po: -------------------------------------------------------------------------------- 1 | # Polish translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-11-18 22:34+0000\n" 12 | "Last-Translator: Solve \n" 13 | "Language-Team: Polish \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Tło listy okien" 22 | 23 | msgid "Normal text" 24 | msgstr "Zwykły tekst" 25 | 26 | msgid "Active window text" 27 | msgstr "Tekst aktywnego okna" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Tekst zminimalizowanego okna" 34 | 35 | msgid "Active color" 36 | msgstr "Kolor aktywnej pozycji" 37 | 38 | msgid "Not used" 39 | msgstr "Nieużywane" 40 | 41 | msgid "Active" 42 | msgstr "Aktywne" 43 | 44 | msgid "Launching color" 45 | msgstr "Kolor uruchamianego" 46 | 47 | msgid "Attention color" 48 | msgstr "Kolor ostrzeżenia" 49 | 50 | msgid "Minimized color" 51 | msgstr "Kolor zminimalizowanego" 52 | 53 | msgid "Active glow" 54 | msgstr "Poświata aktywnego" 55 | 56 | msgid "Button color" 57 | msgstr "Kolor przycisku" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Kolor aktywnego + powiadomienia" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Kolor aktywnego + kropek" 64 | -------------------------------------------------------------------------------- /po-themes/pt_BR.po: -------------------------------------------------------------------------------- 1 | # Brazilian Portuguese translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-09-02 19:59+0000\n" 12 | "Last-Translator: Matheus de Araújo \n" 13 | "Language-Team: Brazilian Portuguese \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Plano de fundo da lista de janelas" 22 | 23 | msgid "Normal text" 24 | msgstr "Texto normal" 25 | 26 | msgid "Active window text" 27 | msgstr "Texto da janela ativa" 28 | 29 | msgid "Active window" 30 | msgstr "Janela ativa" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Texto da janela minimizada" 34 | 35 | msgid "Active color" 36 | msgstr "Cor ativa" 37 | 38 | msgid "Not used" 39 | msgstr "Não utilizado" 40 | 41 | msgid "Active" 42 | msgstr "Ativo" 43 | 44 | msgid "Launching color" 45 | msgstr "Cor ao iniciar aplicativo" 46 | 47 | msgid "Attention color" 48 | msgstr "Cor de atenção" 49 | 50 | msgid "Minimized color" 51 | msgstr "Cor de minimizado" 52 | 53 | msgid "Active glow" 54 | msgstr "Brilho ativo" 55 | 56 | msgid "Button color" 57 | msgstr "Cor do botão" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Ativo + cor indicadora" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Ativo + cor dos pontos" 64 | -------------------------------------------------------------------------------- /po-themes/ro.po: -------------------------------------------------------------------------------- 1 | # Romanian translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2012-07-29 21:41+0000\n" 12 | "Last-Translator: Cristian Moldovan \n" 13 | "Language-Team: Romanian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Fundal listă ferestre" 22 | 23 | msgid "Normal text" 24 | msgstr "Text normal" 25 | 26 | msgid "Active window text" 27 | msgstr "Text fereastră activă" 28 | 29 | msgid "Active window" 30 | msgstr "Fereastră activă" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Text fereastră minimizată" 34 | 35 | msgid "Active color" 36 | msgstr "Culoare activă" 37 | 38 | msgid "Not used" 39 | msgstr "Nefolosit" 40 | 41 | msgid "Active" 42 | msgstr "Activ" 43 | 44 | msgid "Launching color" 45 | msgstr "Culoare lansare" 46 | 47 | msgid "Attention color" 48 | msgstr "Culoare atenție" 49 | 50 | msgid "Minimized color" 51 | msgstr "Culoare minimizată" 52 | 53 | msgid "Active glow" 54 | msgstr "Strălucire activă" 55 | 56 | msgid "Button color" 57 | msgstr "Culoare buton" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Culoare activă + indicator" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Culoare activă + puncte" 64 | -------------------------------------------------------------------------------- /po-themes/ru.po: -------------------------------------------------------------------------------- 1 | # Russian translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-12-15 20:33+0000\n" 12 | "Last-Translator: ZwS \n" 13 | "Language-Team: Russian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Фон списка окон" 22 | 23 | msgid "Normal text" 24 | msgstr "Обычный текст" 25 | 26 | msgid "Active window text" 27 | msgstr "Текст активного окна" 28 | 29 | msgid "Active window" 30 | msgstr "Активное окно" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Текст свернутого окна" 34 | 35 | msgid "Active color" 36 | msgstr "Активный цвет" 37 | 38 | msgid "Not used" 39 | msgstr "Не используется" 40 | 41 | msgid "Active" 42 | msgstr "Активно" 43 | 44 | msgid "Launching color" 45 | msgstr "Цвет запуска" 46 | 47 | msgid "Attention color" 48 | msgstr "Цвет привлечения внимания" 49 | 50 | msgid "Minimized color" 51 | msgstr "Цвет скрытого приложения" 52 | 53 | msgid "Active glow" 54 | msgstr "Свечение активности" 55 | 56 | msgid "Button color" 57 | msgstr "Цвет кнопки" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Цвет активность + индикатор" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Цвет активность + точки" 64 | -------------------------------------------------------------------------------- /po-themes/sk.po: -------------------------------------------------------------------------------- 1 | # Slovak translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2011-01-15 17:28+0000\n" 12 | "Last-Translator: Marcel \n" 13 | "Language-Team: Slovak \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Pozadie zoznamu okien" 22 | 23 | msgid "Normal text" 24 | msgstr "Normálny text" 25 | 26 | msgid "Active window text" 27 | msgstr "Text aktívneho okna" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Text minimalizovaného okna" 34 | 35 | msgid "Active color" 36 | msgstr "Aktívna farba" 37 | 38 | msgid "Not used" 39 | msgstr "Nepoužíva sa" 40 | 41 | msgid "Active" 42 | msgstr "Aktívne" 43 | 44 | msgid "Launching color" 45 | msgstr "Farba pri spúšťaní" 46 | 47 | msgid "Attention color" 48 | msgstr "Farba pozornosť" 49 | 50 | msgid "Minimized color" 51 | msgstr "Farba minimalizované" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktivovať žiaru" 55 | 56 | msgid "Button color" 57 | msgstr "Farba tlačidla" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Aktívne + farba indikátora" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Aktívne + farba bodiek" 64 | -------------------------------------------------------------------------------- /po-themes/sv.po: -------------------------------------------------------------------------------- 1 | # Tranlation template for DockbarX. 2 | # Copyright (C) 2010 Matias Sars 3 | # This file is distributed under the same GPL and BSD. 4 | msgid "" 5 | msgstr "" 6 | "Project-Id-Version: dockbarx-themes\n" 7 | "Report-Msgid-Bugs-To: \n" 8 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 9 | "PO-Revision-Date: 2012-03-09 16:26+0000\n" 10 | "Last-Translator: Rikard Edgren \n" 11 | "Language-Team: Launchpad Swedish Translators \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=utf-8\n" 15 | "Content-Transfer-Encoding: 8bit\n" 16 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 17 | "X-Generator: Launchpad (build 16165)\n" 18 | "X-Poedit-Language: Swedish\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Fönsterlistans bakgrund" 22 | 23 | msgid "Normal text" 24 | msgstr "Normal text" 25 | 26 | msgid "Active window text" 27 | msgstr "Text för aktivt fönster" 28 | 29 | msgid "Active window" 30 | msgstr "Aktivt fönster" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Text för minimierat fönster" 34 | 35 | msgid "Active color" 36 | msgstr "Aktiv färg" 37 | 38 | msgid "Not used" 39 | msgstr "Används inte" 40 | 41 | msgid "Active" 42 | msgstr "Aktiv" 43 | 44 | msgid "Launching color" 45 | msgstr "Färg vid programstart" 46 | 47 | msgid "Attention color" 48 | msgstr "Färg för uppmärksamhet" 49 | 50 | msgid "Minimized color" 51 | msgstr "Färg vid minimering" 52 | 53 | msgid "Active glow" 54 | msgstr "Aktiv glöd" 55 | 56 | msgid "Button color" 57 | msgstr "Knappfärg" 58 | 59 | # Theme unite_v 60 | msgid "Active + indicator color" 61 | msgstr "Aktiv + indikatorfärg" 62 | 63 | # Theme Dock[_v] 64 | msgid "Active + dots color" 65 | msgstr "Aktiv + punktfärg" 66 | -------------------------------------------------------------------------------- /po-themes/th.po: -------------------------------------------------------------------------------- 1 | # Thai translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-08-08 10:01+0000\n" 12 | "Last-Translator: Matias Särs \n" 13 | "Language-Team: Thai \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "" 22 | 23 | msgid "Normal text" 24 | msgstr "" 25 | 26 | msgid "Active window text" 27 | msgstr "" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "" 34 | 35 | msgid "Active color" 36 | msgstr "" 37 | 38 | msgid "Not used" 39 | msgstr "ไม่ใช้" 40 | 41 | msgid "Active" 42 | msgstr "เปิดใช้งาน" 43 | 44 | msgid "Launching color" 45 | msgstr "" 46 | 47 | msgid "Attention color" 48 | msgstr "" 49 | 50 | msgid "Minimized color" 51 | msgstr "" 52 | 53 | msgid "Active glow" 54 | msgstr "" 55 | 56 | msgid "Button color" 57 | msgstr "" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "" 61 | 62 | msgid "Active + dots color" 63 | msgstr "" 64 | -------------------------------------------------------------------------------- /po-themes/uk.po: -------------------------------------------------------------------------------- 1 | # Ukrainian translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-12-07 19:32+0000\n" 12 | "Last-Translator: Matias Särs \n" 13 | "Language-Team: Ukrainian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "Колір фону перегляду мініатюр" 22 | 23 | msgid "Normal text" 24 | msgstr "Звичайний текст" 25 | 26 | msgid "Active window text" 27 | msgstr "Текст активного вікна" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "Текст мінімізованого вікна" 34 | 35 | msgid "Active color" 36 | msgstr "Активний колір" 37 | 38 | msgid "Not used" 39 | msgstr "Не використовується" 40 | 41 | msgid "Active" 42 | msgstr "Активний" 43 | 44 | msgid "Launching color" 45 | msgstr "Колір кнопок запуску" 46 | 47 | msgid "Attention color" 48 | msgstr "Колір звертання уваги" 49 | 50 | msgid "Minimized color" 51 | msgstr "Колір мінімізованого вікна" 52 | 53 | msgid "Active glow" 54 | msgstr "Активне світіння" 55 | 56 | msgid "Button color" 57 | msgstr "Колір кнопок" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "Колір активності та індикатору" 61 | 62 | msgid "Active + dots color" 63 | msgstr "Колір активності та крапок" 64 | -------------------------------------------------------------------------------- /po-themes/zh_CN.po: -------------------------------------------------------------------------------- 1 | # Chinese (Simplified) translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2012-10-18 11:43+0000\n" 12 | "Last-Translator: 张海 \n" 13 | "Language-Team: Chinese (Simplified) \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "窗口列表背景" 22 | 23 | msgid "Normal text" 24 | msgstr "普通文本" 25 | 26 | msgid "Active window text" 27 | msgstr "活动窗口文本" 28 | 29 | msgid "Active window" 30 | msgstr "活动窗口" 31 | 32 | msgid "Minimized window text" 33 | msgstr "最小化窗口文本" 34 | 35 | msgid "Active color" 36 | msgstr "活动颜色" 37 | 38 | msgid "Not used" 39 | msgstr "未使用" 40 | 41 | msgid "Active" 42 | msgstr "活动" 43 | 44 | msgid "Launching color" 45 | msgstr "正在启动颜色" 46 | 47 | msgid "Attention color" 48 | msgstr "焦点颜色" 49 | 50 | msgid "Minimized color" 51 | msgstr "最小化颜色" 52 | 53 | msgid "Active glow" 54 | msgstr "活动发光" 55 | 56 | msgid "Button color" 57 | msgstr "按钮颜色" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "活动指示器颜色" 61 | 62 | msgid "Active + dots color" 63 | msgstr "活动点颜色" 64 | -------------------------------------------------------------------------------- /po-themes/zh_TW.po: -------------------------------------------------------------------------------- 1 | # Chinese (Traditional) translation for dockbar 2 | # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 3 | # This file is distributed under the same license as the dockbar package. 4 | # FIRST AUTHOR , 2010. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: dockbar\n" 9 | "Report-Msgid-Bugs-To: FULL NAME \n" 10 | "POT-Creation-Date: 2010-06-09 13:23+0300\n" 11 | "PO-Revision-Date: 2010-12-07 19:27+0000\n" 12 | "Last-Translator: Matias Särs \n" 13 | "Language-Team: Chinese (Traditional) \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Launchpad-Export-Date: 2012-10-20 14:31+0000\n" 18 | "X-Generator: Launchpad (build 16165)\n" 19 | 20 | msgid "Window list background" 21 | msgstr "視窗清單背景" 22 | 23 | msgid "Normal text" 24 | msgstr "普通文字" 25 | 26 | msgid "Active window text" 27 | msgstr "執行中視窗文字" 28 | 29 | msgid "Active window" 30 | msgstr "" 31 | 32 | msgid "Minimized window text" 33 | msgstr "最小化視窗文字" 34 | 35 | msgid "Active color" 36 | msgstr "執行中顏色" 37 | 38 | msgid "Not used" 39 | msgstr "並未使用" 40 | 41 | msgid "Active" 42 | msgstr "執行中" 43 | 44 | msgid "Launching color" 45 | msgstr "啟動中顏色" 46 | 47 | msgid "Attention color" 48 | msgstr "焦點顏色" 49 | 50 | msgid "Minimized color" 51 | msgstr "最小化顏色" 52 | 53 | msgid "Active glow" 54 | msgstr "執行中光暈" 55 | 56 | msgid "Button color" 57 | msgstr "按鈕顏色" 58 | 59 | msgid "Active + indicator color" 60 | msgstr "執行中標識符顏色" 61 | 62 | msgid "Active + dots color" 63 | msgstr "執行中的點顏色" 64 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python2 2 | 3 | # groupbutton.py 4 | # 5 | # Copyright 2010 Matias Sars 6 | # 7 | # DockbarX is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # DockbarX is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with dockbar. If not, see . 19 | 20 | from distutils.core import setup 21 | from distutils.core import setup 22 | from distutils import cmd 23 | from distutils.command.install_data import install_data as _install_data 24 | from distutils.command.build import build as _build 25 | 26 | import msgfmt 27 | import os 28 | import sys 29 | 30 | VERSION = "0.93" 31 | 32 | class build_trans(cmd.Command): 33 | description = "Compile .po files into .mo files" 34 | def initialize_options(self): 35 | pass 36 | 37 | def finalize_options(self): 38 | pass 39 | 40 | def run(self): 41 | po_dict = { 42 | "dockbarx": os.path.join(os.path.dirname(os.curdir), "po"), 43 | "dockbarx-themes": os.path.join(os.path.dirname(os.curdir), "po-themes") 44 | } 45 | for (mo_file, po_dir) in po_dict.items(): 46 | for path, names, filenames in os.walk(po_dir): 47 | for f in filenames: 48 | if f.endswith(".po"): 49 | lang = f[:len(f) - 3] 50 | src = os.path.join(path, f) 51 | dest_path = os.path.join("build", "locale", lang, "LC_MESSAGES") 52 | dest = os.path.join(dest_path, "%s.mo"%mo_file) 53 | if not os.path.exists(dest_path): 54 | os.makedirs(dest_path) 55 | if not os.path.exists(dest): 56 | print "Compiling %s for %s" % (src, mo_file) 57 | msgfmt.make(src, dest) 58 | else: 59 | src_mtime = os.stat(src)[8] 60 | dest_mtime = os.stat(dest)[8] 61 | if src_mtime > dest_mtime: 62 | print "Compiling %s for %s" % (src, mo_file) 63 | msgfmt.make(src, dest) 64 | 65 | class build(_build): 66 | sub_commands = _build.sub_commands + [("build_trans", None)] 67 | def run(self): 68 | _build.run(self) 69 | 70 | class install_data(_install_data): 71 | 72 | def run(self): 73 | for lang in os.listdir("build/locale/"): 74 | lang_dir = os.path.join("/", "usr", "share", 75 | "locale", lang, "LC_MESSAGES") 76 | lang_files = [] 77 | d_file = os.path.join("build", "locale", lang, 78 | "LC_MESSAGES", "dockbarx.mo") 79 | dt_file = os.path.join("build", "locale", lang, 80 | "LC_MESSAGES", "dockbarx-themes.mo") 81 | if os.path.exists(d_file): 82 | lang_files.append(d_file) 83 | if os.path.exists(dt_file): 84 | lang_files.append(dt_file) 85 | self.data_files.append( (lang_dir, lang_files) ) 86 | # Scan folders for the right files 87 | self.scan_path("/usr/share/dockbarx/themes", "themes", ext=".tar.gz") 88 | self.scan_path("share/icons/", "icons", ext=".png") 89 | self.scan_path("/usr/share/namebar/themes", 90 | "dockx_applets/namebar_themes", 91 | ext=".tar.gz") 92 | self.scan_path("/usr/share/dockbarx/applets/vc-themes", 93 | "dockx_applets/vc-themes") 94 | _install_data.run(self) 95 | 96 | def scan_path(self, install_path, base_path, path="", ext=""): 97 | files = [] 98 | for f in os.listdir(os.path.join(base_path, path)): 99 | fpath = os.path.join(base_path, path, f) 100 | if os.path.isdir(fpath): 101 | self.scan_path(install_path, base_path, 102 | os.path.join(path, f), ext) 103 | elif os.path.isfile(fpath) and fpath.endswith(ext): 104 | files.append(fpath) 105 | if files: 106 | self.data_files.append((os.path.join(install_path, path), files)) 107 | 108 | 109 | cmdclass = { 110 | "build": build, 111 | "build_trans": build_trans, 112 | "install_data": install_data, 113 | } 114 | 115 | data_files=[ 116 | ("/usr/share/dockbarx/applets", ["dockx_applets/cardapio_dbx.py", 117 | "dockx_applets/cardapio.applet", 118 | "dockx_applets/clock.py", 119 | "dockx_applets/clock.applet", 120 | "dockx_applets/namebar.py", 121 | "dockx_applets/namebar.applet", 122 | "dockx_applets/appindicator.py", 123 | "dockx_applets/appindicator.applet", 124 | "dockx_applets/hello_world.py", 125 | "dockx_applets/hello_world.applet", 126 | "dockx_applets/battery_status.py", 127 | "dockx_applets/battery_status.applet", 128 | "dockx_applets/volume-control.py", 129 | "dockx_applets/volume-control.applet", 130 | "dockx_applets/volume-control.ui", 131 | "dockx_applets/namebar_window_buttons.applet", 132 | "dockx_applets/namebar_window_buttons.py", 133 | "dockx_applets/namebar_window_title.applet", 134 | "dockx_applets/namebar_window_title.py"]), 135 | ("/usr/bin", ["dockbarx_factory", "dbx_preference", "dockx"]), 136 | ("/usr/lib/bonobo/servers", ["GNOME_DockBarXApplet.server"]), 137 | ("/usr/share/applications/", ["dbx_preference.desktop"]), 138 | ("/usr/share/applications/", ["DockX.desktop"]), 139 | ] 140 | 141 | setup(name="Dockbarx", 142 | version=VERSION, 143 | description="A dock-ish gnome-applet", 144 | author="Aleksey Shaferov and Matias Sars", 145 | url="http://launchpad.net/dockbar/", 146 | packages=["dockbarx"], 147 | data_files=data_files, 148 | cmdclass=cmdclass 149 | ) 150 | 151 | 152 | 153 | if len(sys.argv) == 2 and sys.argv[1] == "install": 154 | if os.path.exists("/usr/bin/dockbarx.py"): 155 | # Remove old dockbarx.py so that it isn't imported 156 | # instead of the package dockbarx when dockbarx is run. 157 | print 158 | print "There is a dockbarx.py in /usr/bin. " + \ 159 | "This has to be removed to make DockbarX run correctly." 160 | remove = raw_input("Remove /usr/bin/dockbarx.py? (Y/n)") 161 | if remove == "" or remove[0].lower() == "y": 162 | os.remove("/usr/bin/dockbarx.py") 163 | else: 164 | print "/usr/bin/dockbarx.py is not removed. " + \ 165 | "Please remove it or rename it manually." 166 | 167 | if os.path.exists("/usr/bin/dockbarx_factory.py"): 168 | print 169 | print "There is a dockbarx_factory.py in /usr/bin. " + \ 170 | "This file is no longer used." 171 | remove = raw_input("Remove /usr/bin/dockbarx_factory.py? (Y/n)") 172 | if remove == "" or remove[0].lower() == "y": 173 | os.remove("/usr/bin/dockbarx_factory.py") 174 | print "/usr/bin/dockbarx_factory.py is removed. " 175 | else: 176 | print "/usr/bin/dockbarx_factory.py is not removed. " 177 | 178 | if os.path.exists("/usr/bin/dbx_preference.py"): 179 | print 180 | print "There is a dbx_preference.py in /usr/bin. " + \ 181 | "This file is no longer used." 182 | remove = raw_input("Remove /usr/bin/dbx_preference.py? (Y/n)") 183 | if remove == "" or remove[0].lower() == "y": 184 | os.remove("/usr/bin/dbx_preference.py") 185 | print "/usr/bin/dbx_preference.py is removed. " 186 | else: 187 | print "/usr/bin/dbx_preference.py is not removed. " 188 | -------------------------------------------------------------------------------- /themes/Colors.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/Colors.tar.gz -------------------------------------------------------------------------------- /themes/Deep.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/Deep.tar.gz -------------------------------------------------------------------------------- /themes/Glass_DMD.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/Glass_DMD.tar.gz -------------------------------------------------------------------------------- /themes/Magic_trans.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/Magic_trans.tar.gz -------------------------------------------------------------------------------- /themes/dock/Colors.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/Colors.tar.gz -------------------------------------------------------------------------------- /themes/dock/Glass_DMD.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/Glass_DMD.tar.gz -------------------------------------------------------------------------------- /themes/dock/Magic_trans.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/Magic_trans.tar.gz -------------------------------------------------------------------------------- /themes/dock/dbx.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/dbx.tar.gz -------------------------------------------------------------------------------- /themes/dock/deep.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/deep.tar.gz -------------------------------------------------------------------------------- /themes/dock/folded.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/folded.tar.gz -------------------------------------------------------------------------------- /themes/dock/glass-dock.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/glass-dock.tar.gz -------------------------------------------------------------------------------- /themes/dock/invisible.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dock/invisible.tar.gz -------------------------------------------------------------------------------- /themes/dockxyz.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/dockxyz.tar.gz -------------------------------------------------------------------------------- /themes/glassified.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/glassified.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/Colors.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/Colors.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/DMD_Glass.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/DMD_Glass.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/Elegance.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/Elegance.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/Magic_trans.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/Magic_trans.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/Radiance.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/Radiance.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/dbx.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/dbx.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/deep.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/deep.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/gradent.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/gradent.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/old.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/old.tar.gz -------------------------------------------------------------------------------- /themes/popup_styles/square.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/popup_styles/square.tar.gz -------------------------------------------------------------------------------- /themes/sunny-c.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/M7S/dockbarx/ca784021a555ea28cf51985e70e17ee95dd2f4eb/themes/sunny-c.tar.gz --------------------------------------------------------------------------------