bustle 0.7.4 → 0.7.5
raw patch · 15 files changed
+456/−615 lines, 15 files
Files
- Bustle/Loader/Pcap.hs +1/−6
- Bustle/Renderer.hs +23/−28
- Bustle/Types.hs +35/−0
- Bustle/UI.hs +7/−9
- Bustle/UI/DetailsView.hs +17/−25
- Bustle/UI/FilterDialog.hs +128/−65
- CONTRIBUTING.md +0/−1
- INSTALL.md +28/−38
- NEWS.md +14/−0
- bustle.cabal +2/−2
- data/FilterDialog.ui +77/−0
- data/icons/hicolor/scalable/apps/org.freedesktop.Bustle-symbolic.svg +50/−45
- data/icons/hicolor/scalable/apps/org.freedesktop.Bustle.svg +68/−69
- data/org.freedesktop.Bustle.appdata.xml.in +6/−1
- po/messages.pot +0/−326
Bustle/Loader/Pcap.hs view
@@ -28,16 +28,12 @@ import Data.Maybe (fromMaybe) import Data.Either (partitionEithers)-import Data.List (isSuffixOf) import qualified Data.Map as Map import Data.Map (Map)-import Control.Exception (try, tryJust)+import Control.Exception (try) import Control.Monad.State import System.IO.Error ( mkIOError , userErrorType- , isUserError- , ioeGetErrorString- , ioeSetErrorString ) import Network.Pcap@@ -47,7 +43,6 @@ import qualified Data.ByteString as BS import qualified Bustle.Types as B-import Bustle.Translation (__) -- Conversions from dbus-core's types into Bustle's more stupid types. This -- whole section is pretty upsetting.
Bustle/Renderer.hs view
@@ -42,8 +42,8 @@ import Data.List.NonEmpty (NonEmpty(..)) import qualified Data.Set as Set import Data.Set (Set)-import qualified Data.Map as Map-import Data.Map (Map)+import qualified Data.Map.Strict as Map+import Data.Map.Strict (Map) import Control.Arrow (first) import Control.Monad@@ -59,10 +59,6 @@ | SystemBus deriving (Show, Eq, Ord) -describeBus :: Bus -> String-describeBus SessionBus = "session"-describeBus SystemBus = "system"- -- We keep the column in the map to allow the Monoid instance to preserve the -- ordering returned by sessionParticipants, which is the only view on this -- type exported.@@ -142,8 +138,8 @@ instance Monoid apps => Monoid (RendererResult apps) where mempty = RendererResult 0 0 [] [] mempty [] -processWithFilters :: (Log, Set UniqueName)- -> (Log, Set UniqueName)+processWithFilters :: (Log, NameFilter)+ -> (Log, NameFilter) -> RendererResult () processWithFilters (sessionBusLog, sessionFilter) (systemBusLog, systemFilter ) =@@ -159,7 +155,7 @@ -- Doesn't let you filter rendererStateNew :: RendererState-rendererStateNew = initialState Set.empty Set.empty+rendererStateNew = initialState emptyNameFilter emptyNameFilter buildResult :: RendererOutput -> RendererState@@ -243,7 +239,8 @@ , nextColumn :: Double , columnsInUse :: Set Double , pending :: Pending- , bsIgnoredNames :: Set UniqueName+ , bsFilter :: NameFilter+ , nextFakeName :: Integer } data RendererState =@@ -254,7 +251,7 @@ , startTime :: Microseconds } -initialBusState :: Set UniqueName+initialBusState :: NameFilter -> Double -> BusState initialBusState ignore x =@@ -263,17 +260,18 @@ , nextColumn = x , columnsInUse = Set.empty , pending = Map.empty- , bsIgnoredNames = ignore+ , bsFilter = ignore+ , nextFakeName = 0 } -initialSessionBusState, initialSystemBusState :: Set UniqueName -> BusState+initialSessionBusState, initialSystemBusState :: NameFilter -> BusState initialSessionBusState f = initialBusState f $ timestampAndMemberWidth + firstColumnOffset initialSystemBusState f = initialBusState f $ negate firstColumnOffset -initialState :: Set UniqueName- -> Set UniqueName+initialState :: NameFilter+ -> NameFilter -> RendererState initialState sessionFilter systemFilter = RendererState { sessionBusState = initialSessionBusState sessionFilter@@ -359,18 +357,12 @@ case filter (Set.member o . aiCurrentNames . snd) (Map.assocs as) of [details] -> return details - -- No matches indicates a corrupt log, which we try to recover from …+ -- No known owner for the well-known name. This happens in many cases,+ -- especially when a method call causes service activation. [] -> do- warn $ concat [ "'"- , unOtherName o- , "' appeared unheralded on the "- , describeBus bus- , " bus; making something up..."- ]- let namesInUse = Map.keys as- candidates = map (fakeUniqueName . show)- ([1..] :: [Integer])- u = head $ filter (not . (`elem` namesInUse)) candidates+ n <- getsBusState nextFakeName bus+ modifyBusState bus $ \bs -> bs { nextFakeName = n + 1 }+ let u = fakeUniqueName (show n) addUnique bus u addOther bus o u ai <- lookupUniqueName bus u@@ -648,9 +640,12 @@ -> Message -> Renderer Bool shouldShow bus m = do- ignored <- getsBusState bsIgnoredNames bus+ nameFilter <- getsBusState bsFilter bus names <- mapM (fmap fst . lookupApp bus) (mentionedNames m)- return $ Set.null (ignored `Set.intersection` Set.fromList names)+ return $+ not (any (flip Set.member $ nfNever nameFilter) names)+ && (Set.null (nfOnly nameFilter)+ || any (flip Set.member $ nfOnly nameFilter) names) processOne :: Bus -> Detailed Event
Bustle/Types.hs view
@@ -38,6 +38,12 @@ , unOtherName , unBusName + , NameFilter(..)+ , emptyNameFilter+ , nameFilterAddOnly+ , nameFilterAddNever+ , nameFilterRemove+ , dbusName , dbusInterface @@ -68,6 +74,8 @@ ) import Data.Maybe (maybeToList) import Data.Either (partitionEithers)+import Data.Set (Set)+import qualified Data.Set as Set type Serial = Word32 @@ -94,6 +102,33 @@ unBusName :: TaggedBusName -> String unBusName (U (UniqueName x)) = formatBusName x unBusName (O (OtherName x)) = formatBusName x++data NameFilter =+ NameFilter { nfOnly :: Set UniqueName+ , nfNever :: Set UniqueName+ }+ deriving+ (Show, Eq, Ord)++emptyNameFilter :: NameFilter+emptyNameFilter = NameFilter Set.empty Set.empty++nameFilterModify :: (Set UniqueName -> Set UniqueName)+ -> (Set UniqueName -> Set UniqueName)+ -> NameFilter+ -> NameFilter+nameFilterModify updateOnly updateNever nf =+ nf { nfOnly = updateOnly $ nfOnly nf+ , nfNever = updateNever $ nfNever nf+ }++nameFilterAddOnly, nameFilterAddNever, nameFilterRemove+ :: UniqueName+ -> NameFilter+ -> NameFilter+nameFilterAddOnly u = nameFilterModify (Set.insert u) (Set.delete u)+nameFilterAddNever u = nameFilterModify (Set.delete u) (Set.insert u)+nameFilterRemove u = nameFilterModify (Set.delete u) (Set.delete u) -- These useful constants disappeared from dbus in the grand removing of the -- -core suffix.
Bustle/UI.hs view
@@ -30,7 +30,6 @@ import Data.IORef import qualified Data.Map as Map-import qualified Data.Set as Set import Data.List (intercalate) import Data.Time import Data.Tuple (swap)@@ -672,7 +671,7 @@ rr = io $ void $ do wiSetLogDetails wi logDetails - hiddenRef <- newIORef Set.empty+ nameFilterRef <- newIORef emptyNameFilter updateDisplayedLog wi rr @@ -697,13 +696,12 @@ widgetHide sidebarHeader widgetSetSensitivity filterNames True- onMenuItemActivate filterNames $ do- hidden <- readIORef hiddenRef- hidden' <- runFilterDialog window (sessionParticipants $ rrApplications rr) hidden- writeIORef hiddenRef hidden'- let rr' = processWithFilters (sessionMessages, hidden') (systemMessages, Set.empty)-- updateDisplayedLog wi rr'+ onMenuItemActivate filterNames $+ -- FIXME: also allow filtering system bus in two-bus case+ runFilterDialog window (sessionParticipants $ rrApplications rr) nameFilterRef $ do+ nameFilter <- readIORef nameFilterRef+ let rr' = processWithFilters (sessionMessages, nameFilter) (systemMessages, emptyNameFilter)+ updateDisplayedLog wi rr' showOpenDialog :: Window -> B ()
Bustle/UI/DetailsView.hs view
@@ -93,23 +93,19 @@ getErrorName :: Detailed a -> Maybe String getErrorName (Detailed _ _ _ rm) = case rm of- (D.ReceivedMethodError _ (MethodError { methodErrorName = ErrorName en})) -> Just en- _ -> Nothing--getErrorMessage :: Detailed a- -> Maybe String-getErrorMessage (Detailed _ _ _ (D.ReceivedMethodError _ (MethodError _ _ _ _ body))) =- case D.fromVariant <$> body of- [message] -> message- _ -> Nothing-getErrorMessage _ = Nothing+ D.ReceivedMethodError _ MethodError{ methodErrorName = ErrorName en} -> Just en+ _ -> Nothing formatMessage :: Detailed Message -> String formatMessage (Detailed _ _ _ rm) =- formatArgs $ D.receivedMessageBody rm+ case (rm, D.fromVariant <$> body) of+ -- Special-case errors, which (are supposed to) have a single+ -- human-readable string argument+ (D.ReceivedMethodError _ _, [Just message]) -> message+ _ -> formatted where- formatArgs = intercalate "\n" . map (format_Variant VariantStyleSignature)--- TODO: suppress escaping and type sig for errors, which are always (s)+ body = D.receivedMessageBody rm+ formatted = intercalate "\n" $ map (format_Variant VariantStyleSignature) body detailsViewGetTop :: DetailsView -> Widget detailsViewGetTop = toWidget . detailsGrid@@ -117,15 +113,13 @@ setOptionalRow :: OptionalRow -> Maybe String -> IO ()-setOptionalRow (caption, label) s_ = do- case s_ of- Just s -> do- labelSetText label s- widgetShow label- widgetShow caption- Nothing -> do- widgetHide label- widgetHide caption+setOptionalRow (caption, label) (Just s) = do+ labelSetText label s+ widgetShow label+ widgetShow caption+setOptionalRow (caption, label) Nothing = do+ widgetHide label+ widgetHide caption detailsViewUpdate :: DetailsView -> Detailed Message@@ -143,8 +137,6 @@ labelSetText (detailsPath d) (maybe unknown (D.formatObjectPath . path) member_) labelSetMarkup (detailsMember d) (maybe unknown getMemberMarkup member_)- textBufferSetText buf $ case getErrorMessage m of- Just message -> message- Nothing -> formatMessage m+ textBufferSetText buf (formatMessage m) where unknown = ""
Bustle/UI/FilterDialog.hs view
@@ -1,8 +1,8 @@-{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleContexts #-} {- Bustle.UI.FilterDialog: allows the user to filter the displayed log Copyright © 2011 Collabora Ltd.+Copyright © 2019 Will Thompson This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public@@ -23,28 +23,52 @@ ) where -import Data.List (intercalate, groupBy, elemIndices)+import Control.Monad (forM_)+import Data.List (intercalate, groupBy, elemIndices, elemIndex) import qualified Data.Set as Set import Data.Set (Set) import qualified Data.Function as F+import Data.IORef import Graphics.UI.Gtk+import Graphics.UI.Gtk.ModelView.CellRendererCombo (cellComboTextModel) import Bustle.Translation (__) import Bustle.Types +import Paths_bustle++data NameVisibility = NameVisibilityDefault+ | NameVisibilityOnly+ | NameVisibilityNever+ deriving (Show, Eq, Ord, Enum, Bounded)++nameVisibilityName :: NameVisibility+ -> String+nameVisibilityName v = case v of+ NameVisibilityDefault -> __ "Default"+ NameVisibilityOnly -> __ "Only this"+ NameVisibilityNever -> __ "Hidden"++data NameEntry = NameEntry { neUniqueName :: UniqueName+ , neOtherNames :: Set OtherName+ , neVisibility :: NameVisibility+ }+ namespace :: String -> (String, String) namespace name = case reverse (elemIndices '.' name) of [] -> ("", name) (i:_) -> splitAt (i + 1) name -formatNames :: (UniqueName, Set OtherName)+formatNames :: NameEntry -> String-formatNames (u, os)- | Set.null os = unUniqueName u+formatNames ne+ | Set.null os = unUniqueName (neUniqueName ne) | otherwise = intercalate "\n" . map (formatGroup . groupGroup) $ groups where+ os = neOtherNames ne+ groups = groupBy ((==) `F.on` fst) . map (namespace . unOtherName) $ Set.toAscList os groupGroup [] = error "unpossible empty group from groupBy"@@ -53,89 +77,128 @@ formatGroup (ns, [y]) = ns ++ y formatGroup (ns, ys) = ns ++ "{" ++ intercalate "," ys ++ "}" -type NameStore = ListStore (Bool, (UniqueName, Set OtherName))+type NameStore = ListStore NameEntry makeStore :: [(UniqueName, Set OtherName)]- -> Set UniqueName+ -> NameFilter -> IO NameStore-makeStore names currentlyHidden =- listStoreNew $ map toPair names+makeStore names nameFilter =+ listStoreNew $ map toNameEntry names where- toPair name@(u, _) = (not (Set.member u currentlyHidden), name)--makeView :: NameStore- -> IO ScrolledWindow-makeView nameStore = do- nameView <- treeViewNewWithModel nameStore- -- We want rules because otherwise it's tough to see where each group- -- starts and ends- treeViewSetRulesHint nameView True- treeViewSetHeadersVisible nameView False- widgetSetSizeRequest nameView 600 371-- tickyCell <- cellRendererToggleNew- tickyColumn <- treeViewColumnNew- treeViewColumnPackStart tickyColumn tickyCell True- treeViewAppendColumn nameView tickyColumn+ toNameEntry (u, os) = NameEntry { neUniqueName = u+ , neOtherNames = os+ , neVisibility = toVisibility u+ }+ toVisibility u | Set.member u (nfOnly nameFilter) = NameVisibilityOnly+ | Set.member u (nfNever nameFilter) = NameVisibilityNever+ | otherwise = NameVisibilityDefault - cellLayoutSetAttributes tickyColumn tickyCell nameStore $ \(ticked, _) ->- [ cellToggleActive := ticked ]+nameStoreUpdate :: NameStore+ -> Int+ -> (NameEntry -> NameEntry)+ -> IO ()+nameStoreUpdate nameStore i f = do+ ne <- listStoreGetValue nameStore i+ listStoreSetValue nameStore i $ f ne - on tickyCell cellToggled $ \pathstr -> do- let [i] = stringToTreePath pathstr- (v, ns) <- listStoreGetValue nameStore i- listStoreSetValue nameStore i (not v, ns)+makeView :: NameStore+ -> TreeView+ -> IO ()+makeView nameStore nameView = do+ treeViewSetModel nameView (Just nameStore) + -- Bus name column nameCell <- cellRendererTextNew nameColumn <- treeViewColumnNew+ nameColumn `set` [ treeViewColumnTitle := __ "Bus Name"+ , treeViewColumnExpand := True+ ] treeViewColumnPackStart nameColumn nameCell True treeViewAppendColumn nameView nameColumn - cellLayoutSetAttributes nameColumn nameCell nameStore $ \(_, ns) ->- [ cellText := formatNames ns ]+ cellLayoutSetAttributes nameColumn nameCell nameStore $ \ne ->+ [ cellText := formatNames ne ] - sw <- scrolledWindowNew Nothing Nothing- scrolledWindowSetPolicy sw PolicyAutomatic PolicyAutomatic- containerAdd sw nameView+ -- TreeStore of possible visibility states+ let nameVisibilities = [minBound..]+ let nameVisibilityNames = map nameVisibilityName nameVisibilities+ visibilityModel <- listStoreNew nameVisibilityNames+ let visibilityNameCol = makeColumnIdString 1+ treeModelSetColumn visibilityModel visibilityNameCol id - return sw+ -- Visibility column+ comboCell <- cellRendererComboNew+ comboCell `set` [ cellTextEditable := True+ , cellComboHasEntry := False+ ] + comboColumn <- treeViewColumnNew+ comboColumn `set` [ treeViewColumnTitle := __ "Visibility"+ , treeViewColumnExpand := False+ ]+ treeViewColumnPackStart comboColumn comboCell True+ treeViewAppendColumn nameView comboColumn++ cellLayoutSetAttributes comboColumn comboCell nameStore $ \ne ->+ [ cellComboTextModel := (visibilityModel, visibilityNameCol)+ , cellText :=> do+ let Just j = elemIndex (neVisibility ne) nameVisibilities+ listStoreGetValue visibilityModel j+ ]+ comboCell `on` edited $ \[i] str -> do+ let (Just j) = elemIndex str nameVisibilityNames+ nameStoreUpdate nameStore i $ \ne ->+ ne { neVisibility = nameVisibilities !! j }++ return ()+ runFilterDialog :: WindowClass parent => parent -- ^ The window to which to attach the dialog -> [(UniqueName, Set OtherName)] -- ^ Names, in order of appearance- -> Set UniqueName -- ^ Currently-hidden names- -> IO (Set UniqueName) -- ^ The set of names to *hide*-runFilterDialog parent names currentlyHidden = do- d <- dialogNew- (windowWidth, windowHeight) <- windowGetSize parent- windowSetDefaultSize d (windowWidth * 7 `div` 8) (windowHeight `div` 2)+ -> IORef NameFilter -- ^ Current filter+ -> IO () -- ^ Callback when filter changes+ -> IO ()+runFilterDialog parent names filterRef callback = do+ builder <- builderNew+ builderAddFromFile builder =<< getDataFileName "data/FilterDialog.ui"++ d <- builderGetObject builder castToDialog ("filterDialog" :: String)+ (_, windowHeight) <- windowGetSize parent+ windowSetDefaultSize d (-1) (windowHeight * 3 `div` 4) d `set` [ windowTransientFor := parent ]- dialogAddButton d stockClose ResponseClose- vbox <- castToBox <$> dialogGetContentArea d- boxSetSpacing vbox 6 - nameStore <- makeStore names currentlyHidden- sw <- makeView nameStore+ nameStore <- makeStore names =<< readIORef filterRef+ makeView nameStore =<< builderGetObject builder castToTreeView ("filterTreeView" :: String) - instructions <- labelNew (Nothing :: Maybe String)- widgetSetSizeRequest instructions 600 (-1)- labelSetMarkup instructions- (__ "Unticking a service hides its column in the diagram, \- \and all messages it is involved in. That is, all methods it calls \- \or are called on it, the corresponding returns, and all signals it \- \emits will be hidden.")- labelSetLineWrap instructions True- boxPackStart vbox instructions PackNatural 0+ resetButton <- builderGetObject builder castToButton ("resetButton" :: String)+ resetButton `on` buttonActivated $ do+ n <- listStoreGetSize nameStore+ forM_ [0..n-1] $ \i -> do+ ne <- listStoreGetValue nameStore i+ case neVisibility ne of+ NameVisibilityDefault -> return ()+ _ -> listStoreSetValue nameStore i $+ ne { neVisibility = NameVisibilityDefault } - boxPackStart vbox sw PackGrow 0- widgetShowAll vbox+ let updateResetSensitivity = do+ nf <- readIORef filterRef+ let isEmpty = Set.null (nfOnly nf) && Set.null (nfNever nf)+ widgetSetSensitive resetButton $ not isEmpty + updateResetSensitivity+ nameStore `on` rowChanged $ \[i] _iter -> do+ ne <- listStoreGetValue nameStore i+ let u = neUniqueName ne+ -- Should we smush this into nameFilterModify, move the enum into+ -- Bustle.Types?+ let f = case neVisibility ne of+ NameVisibilityDefault -> nameFilterRemove+ NameVisibilityOnly -> nameFilterAddOnly+ NameVisibilityNever -> nameFilterAddNever+ modifyIORef' filterRef $ f u+ updateResetSensitivity+ callback+ _ <- dialogRun d widgetDestroy d-- results <- listStoreToList nameStore- return $ Set.fromList [ u- | (ticked, (u, _)) <- results- , not ticked- ]
CONTRIBUTING.md view
@@ -35,7 +35,6 @@ * Ideally, automate the steps below * Write news in `NEWS.md` and `data/org.freedesktop.Bustle.appdata.xml.in`-* Update `po/messages.pot` * Update version number in `bustle.cabal` ```sh
INSTALL.md view
@@ -1,47 +1,37 @@-Building from source-====================--First, make sure the Haskell Platform is installed, preferably along with the-Gtk+ bindings for Haskell, and some other dependencies. On Debian-flavoured-systems, well, actually just `apt-get build-dep bustle`, but:-- sudo apt-get install \- pkg-config \- libdbus-1-dev \- libglib2.0-dev \- libpcap0.8-dev \- haskell-platform \- libghc-mtl-dev \- libghc-cairo-dev \- libghc-gtk-dev \- libghc-glade-dev \- libghc-dbus-dev \- libghc-pcap-dev \- help2man+Installing from Flathub+======================= -(If you can't get the Haskell Platform via your package manager, see-<http://hackage.haskell.org/platform/>. If you can't get the Gtk+ binding for-Haskell via your package manager, you'll need to run:+If you don't want to modify Bustle, by far the easiest way to install it is to+[get it from Flathub](https://gitlab.freedesktop.org/bustle/bustle). - cabal install gtk2hs-buildtools+<a href='https://flathub.org/apps/details/org.freedesktop.Bustle'><img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/></a> -and ensure that ~/.cabal/bin is in your PATH before continuing.)+Building from source+==================== -Got that? Great!+I recommend using Stack; see the instructions in+[CONTRIBUTING.md](./CONTRIBUTING.md). You can also build a Git checkout using+Flatpak: - export PREFIX=/opt/bustle+```+flatpak-builder --install --user --force-clean app flatpak/org.freedesktop.Bustle.yaml+``` - # Build and install Bustle itself.- cabal install --prefix=$PREFIX+On exotic platforms with no Haskell toolchain+============================================= - # Build and install the stand-alone logger binary, plus the icons, desktop- # file, etc. etc.- make install PREFIX=$PREFIX+If you're working on an embedded platform, you may have D-Bus but no Haskell+toolchain, and you may not want to bootstrap everything just to run Bustle on+the target device. That's fine: Bustle was originally written for exactly this+situation! -If the Haskell Platform is not available on the platform you want to do-some D-Bus profiling on, that's fine: the logger is written in C, and-you can view logs generated on your fancy embedded hardware on your more-pedestrian Linux laptop. The logger only depends on a few widely-available-libraries:+First, install Bustle on your (x86_64) development system as above. You then+have two options to monitor D-Bus traffic on the target device: - sudo apt-get install libglib2.0-dev libpcap-dev+1. On the target device, run `dbus-monitor --pcap --session >session.pcap`, and+ hit `Ctrl+C` when you're done. Then copy `session.pcap` to your development+ system, and open it in Bustle.+2. On the target device, arrange for D-Bus to be accessible via TCP or via some+ kind of socket forwarding. On your development system, run Bustle, choose+ _Record → Record Address_, and enter the remote address in the same form+ accepted by `dbus-monitor`.
NEWS.md view
@@ -1,3 +1,17 @@+Bustle 0.7.5 (2019-03-08)+-------------------------++User-facing changes:++* As well as being able to filter out messages involving certain+ services, you can now also filter messages to only show certain+ services.++Internal changes:++* SVGs are now 256×256px to placate flatpak-validate-icon+* Add Nix compatibility (Daniel Firth)+ Bustle 0.7.4 (2018-12-07) -------------------------
bustle.cabal view
@@ -1,6 +1,6 @@ Name: bustle Category: Network, Desktop-Version: 0.7.4+Version: 0.7.5 Cabal-Version: 2.0 Tested-With: GHC == 8.4.3 Synopsis: Draw sequence diagrams of D-Bus traffic@@ -11,6 +11,7 @@ Maintainer: Will Thompson <will@willthompson.co.uk> Homepage: https://gitlab.freedesktop.org/bustle/bustle#readme Data-files: data/bustle.ui,+ data/FilterDialog.ui, data/OpenTwoDialog.ui, data/RecordAddressDialog.ui, LICENSE@@ -36,7 +37,6 @@ -- wow many translate , po/*.po- , po/*.pot -- intl bits , data/org.freedesktop.Bustle.appdata.xml.in
+ data/FilterDialog.ui view
@@ -0,0 +1,77 @@+<?xml version="1.0" encoding="UTF-8"?>+<!-- Generated with glade 3.22.1 -->+<interface>+ <requires lib="gtk+" version="3.20"/>+ <object class="GtkDialog" id="filterDialog">+ <property name="can_focus">False</property>+ <property name="type_hint">dialog</property>+ <child type="titlebar">+ <object class="GtkHeaderBar">+ <property name="visible">True</property>+ <property name="can_focus">False</property>+ <property name="title" translatable="yes">Filter Visible Services</property>+ <property name="has_subtitle">False</property>+ <property name="show_close_button">True</property>+ <child>+ <object class="GtkButton" id="resetButton">+ <property name="label" translatable="yes">_Reset</property>+ <property name="visible">True</property>+ <property name="can_focus">True</property>+ <property name="receives_default">True</property>+ <property name="use_underline">True</property>+ </object>+ </child>+ </object>+ </child>+ <child internal-child="vbox">+ <object class="GtkBox">+ <property name="can_focus">False</property>+ <property name="orientation">vertical</property>+ <!-- FIXME: round-tripping through Glade removes this property. -->+ <property name="border_width">0</property>+ <child internal-child="action_area">+ <object class="GtkButtonBox">+ <property name="can_focus">False</property>+ <property name="layout_style">end</property>+ <child>+ <placeholder/>+ </child>+ <child>+ <placeholder/>+ </child>+ </object>+ <packing>+ <property name="expand">False</property>+ <property name="fill">False</property>+ <property name="position">0</property>+ </packing>+ </child>+ <child>+ <object class="GtkScrolledWindow">+ <property name="visible">True</property>+ <property name="can_focus">True</property>+ <property name="border_width">0</property>+ <property name="hscrollbar_policy">never</property>+ <property name="shadow_type">in</property>+ <child>+ <object class="GtkTreeView" id="filterTreeView">+ <property name="visible">True</property>+ <property name="can_focus">True</property>+ <property name="headers_clickable">False</property>+ <property name="rules_hint">True</property>+ <child internal-child="selection">+ <object class="GtkTreeSelection"/>+ </child>+ </object>+ </child>+ </object>+ <packing>+ <property name="expand">True</property>+ <property name="fill">True</property>+ <property name="position">1</property>+ </packing>+ </child>+ </object>+ </child>+ </object>+</interface>
data/icons/hicolor/scalable/apps/org.freedesktop.Bustle-symbolic.svg view
@@ -9,12 +9,12 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"- width="600"- height="600"+ width="256"+ height="256" id="svg2" version="1.1"- inkscape:version="0.91 r13725"- sodipodi:docname="bustle-symbolic.svg">+ inkscape:version="0.92.4 5da689c313, 2019-01-14"+ sodipodi:docname="org.freedesktop.Bustle-symbolic.svg"> <defs id="defs4" /> <sodipodi:namedview@@ -24,16 +24,16 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2"- inkscape:zoom="1.18"- inkscape:cx="296.02826"- inkscape:cy="407.83651"+ inkscape:zoom="9.6796875"+ inkscape:cx="128"+ inkscape:cy="93.172193" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false"- inkscape:window-width="1440"- inkscape:window-height="824"+ inkscape:window-width="3200"+ inkscape:window-height="1671" inkscape:window-x="0"- inkscape:window-y="27"+ inkscape:window-y="55" inkscape:window-maximized="1" fit-margin-top="0" fit-margin-left="0"@@ -48,8 +48,10 @@ visible="true" enabled="true" snapvisiblegridlinesonly="true"- originx="-56.941089px"- originy="-465.18127px" />+ originx="-228.94108"+ originy="-779.84559"+ spacingx="1"+ spacingy="1" /> </sodipodi:namedview> <metadata id="metadata7">@@ -67,38 +69,41 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"- transform="translate(-56.941089,12.819102)">- <path- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:57.94400024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:115.88800049, 57.94400024;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"- d="m 349.58008,-12.728516 c -19.78034,0.499891 -39.51808,2.890348 -58.82031,7.2539096 4.10872,18.8723954 8.21745,37.7447914 12.32617,56.6171874 33.74925,-7.665785 69.12626,-7.971229 103.02539,-1.0293 3.71633,-18.821141 8.65912,-38.435398 11.61328,-56.7636714 -22.39128,-4.5980686 -45.29405,-6.6135646 -68.14453,-6.0781256 z m 105.80078,78.716797 c 31.47813,14.008295 59.87299,34.867319 82.70703,60.664059 14.44727,-12.81901 28.89453,-25.63802 43.3418,-38.457028 C 553.05494,56.141376 517.74279,30.253699 478.60547,12.900391 470.86393,30.596354 463.1224,48.292318 455.38086,65.988281 Z M 227.18164,16.626953 C 189.51961,34.723972 155.71119,60.77538 128.625,92.591797 c 14.7487,12.470703 29.49739,24.941413 44.24609,37.412113 22.37137,-26.20404 50.37565,-47.593699 81.60157,-62.169926 -8.17123,-17.501302 -16.34245,-35.002604 -24.51368,-52.503906 -0.92578,0.432292 -1.85156,0.864583 -2.77734,1.296875 z M 568.0293,168.66016 c 16.99699,30.09909 27.33124,63.91871 30.12695,98.36914 19.23893,-1.70833 38.47787,-3.41667 57.7168,-5.125 -3.5014,-42.55686 -16.29754,-84.32012 -37.26568,-121.51953 -16.85936,9.42513 -33.71871,18.85026 -50.57807,28.27539 z M 89.939453,150.27539 c -18.701268,36.38678 -29.811885,76.6502 -32.357428,117.48438 19.276042,1.22135 38.552083,2.44271 57.828125,3.66406 2.15345,-34.4883 11.88032,-68.47463 28.29492,-98.88281 -17.08268,-9.01302 -34.16536,-18.02605 -51.248045,-27.03907 -0.839191,1.59115 -1.678381,3.18229 -2.517572,4.77344 z"- id="path4626"- inkscape:connector-curvature="0" />- <circle- style="fill:none;stroke:#bebebe;stroke-width:75.08624021;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"- id="path2985-7"- cx="381.42856"- cy="433.79074"- transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"- ry="118.57143"- rx="130" />- <path- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"- d="m 430,220 30,55 -85,0 0,50 85,0 -30,55 170,-80 z"- transform="translate(56.941089,-12.819102)"- id="path3757-7"- inkscape:connector-curvature="0"- sodipodi:nodetypes="cccccccc" />- <path- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"- d="m 170,220 -170,80 170,80 -30,-55 85,0 0,-50 -85,0 z"- transform="translate(56.941089,-12.819102)"- id="path3761-7"- inkscape:connector-curvature="0"- sodipodi:nodetypes="cccccccc" />- <path- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:34.40008163;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:94.40000153;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"- d="m 356.94141,187.18164 c -55.02475,0 -100.00001,44.97526 -100,100 -1e-5,55.02475 44.97525,100 100,100 55.02475,0 100,-44.97525 100,-100 0,-55.02475 -44.97525,-100 -100,-100 z m 0,34.39844 c 36.43357,0 65.59961,29.168 65.59961,65.60156 0,36.43356 -29.16604,65.59961 -65.59961,65.59961 -36.43357,0 -65.59961,-29.16605 -65.59961,-65.59961 0,-36.43356 29.16604,-65.60156 65.59961,-65.60156 z"- id="path4619"- inkscape:connector-curvature="0" />+ transform="translate(-228.94108,-16.516576)">+ <g+ id="g1404"+ transform="matrix(0.42666667,0,0,0.42666667,204.64622,21.983358)">+ <path+ inkscape:connector-curvature="0"+ id="path4626"+ d="m 349.58008,-12.728516 c -19.78034,0.499891 -39.51808,2.890348 -58.82031,7.2539096 4.10872,18.8723954 8.21745,37.7447914 12.32617,56.6171874 33.74925,-7.665785 69.12626,-7.971229 103.02539,-1.0293 3.71633,-18.821141 8.65912,-38.435398 11.61328,-56.7636714 -22.39128,-4.5980686 -45.29405,-6.6135646 -68.14453,-6.0781256 z m 105.80078,78.716797 c 31.47813,14.008295 59.87299,34.867319 82.70703,60.664059 14.44727,-12.81901 28.89453,-25.63802 43.3418,-38.457028 C 553.05494,56.141376 517.74279,30.253699 478.60547,12.900391 470.86393,30.596354 463.1224,48.292318 455.38086,65.988281 Z M 227.18164,16.626953 C 189.51961,34.723972 155.71119,60.77538 128.625,92.591797 c 14.7487,12.470703 29.49739,24.941413 44.24609,37.412113 22.37137,-26.20404 50.37565,-47.593699 81.60157,-62.169926 -8.17123,-17.501302 -16.34245,-35.002604 -24.51368,-52.503906 -0.92578,0.432292 -1.85156,0.864583 -2.77734,1.296875 z M 568.0293,168.66016 c 16.99699,30.09909 27.33124,63.91871 30.12695,98.36914 19.23893,-1.70833 38.47787,-3.41667 57.7168,-5.125 -3.5014,-42.55686 -16.29754,-84.32012 -37.26568,-121.51953 -16.85936,9.42513 -33.71871,18.85026 -50.57807,28.27539 z M 89.939453,150.27539 c -18.701268,36.38678 -29.811885,76.6502 -32.357428,117.48438 19.276042,1.22135 38.552083,2.44271 57.828125,3.66406 2.15345,-34.4883 11.88032,-68.47463 28.29492,-98.88281 -17.08268,-9.01302 -34.16536,-18.02605 -51.248045,-27.03907 -0.839191,1.59115 -1.678381,3.18229 -2.517572,4.77344 z"+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#dedede;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:57.94400024;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:115.88800049, 57.94400024;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />+ <circle+ transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"+ cy="433.79074"+ cx="381.42856"+ id="path2985-7"+ style="fill:none;stroke:#bebebe;stroke-width:75.08624268;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ r="0" />+ <path+ sodipodi:nodetypes="cccccccc"+ inkscape:connector-curvature="0"+ id="path3757-7"+ transform="translate(56.941089,-12.819102)"+ d="m 430,220 30,55 h -85 v 50 h 85 l -30,55 170,-80 z"+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />+ <path+ sodipodi:nodetypes="cccccccc"+ inkscape:connector-curvature="0"+ id="path3761-7"+ transform="translate(56.941089,-12.819102)"+ d="M 170,220 0,300 170,380 140,325 h 85 v -50 h -85 z"+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:60;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />+ <path+ inkscape:connector-curvature="0"+ id="path4619"+ d="m 356.94141,187.18164 c -55.02475,0 -100.00001,44.97526 -100,100 -1e-5,55.02475 44.97525,100 100,100 55.02475,0 100,-44.97525 100,-100 0,-55.02475 -44.97525,-100 -100,-100 z m 0,34.39844 c 36.43357,0 65.59961,29.168 65.59961,65.60156 0,36.43356 -29.16604,65.59961 -65.59961,65.59961 -36.43357,0 -65.59961,-29.16605 -65.59961,-65.59961 0,-36.43356 29.16604,-65.60156 65.59961,-65.60156 z"+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:34.40008163;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:5.19999981;stroke-dasharray:none;stroke-dashoffset:94.40000153;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />+ </g> </g> </svg>
data/icons/hicolor/scalable/apps/org.freedesktop.Bustle.svg view
@@ -9,12 +9,12 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"- width="605.06"- height="605.06"+ width="256"+ height="256" id="svg2" version="1.1"- inkscape:version="0.48.4 r9939"- sodipodi:docname="bustle.svg">+ inkscape:version="0.92.4 5da689c313, 2019-01-14"+ sodipodi:docname="org.freedesktop.Bustle.svg"> <defs id="defs4"> <inkscape:path-effect@@ -94,7 +94,7 @@ height="2" y="-0.5" x="-0.30000001"- color-interpolation-filters="sRGB">+ style="color-interpolation-filters:sRGB"> <feTurbulence id="feTurbulence4106" baseFrequency="0.4"@@ -124,7 +124,7 @@ height="2" y="-0.5" x="-0.30000001"- color-interpolation-filters="sRGB">+ style="color-interpolation-filters:sRGB"> <feTurbulence id="feTurbulence4185" baseFrequency="0.4"@@ -157,18 +157,18 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2"- inkscape:zoom="0.59"- inkscape:cx="351.05408"- inkscape:cy="216.30891"+ inkscape:zoom="9.2695312"+ inkscape:cx="128"+ inkscape:cy="71.987112" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false"- inkscape:window-width="1388"- inkscape:window-height="833"- inkscape:window-x="50"- inkscape:window-y="223"- inkscape:window-maximized="0"- fit-margin-top="0"+ inkscape:window-width="3200"+ inkscape:window-height="1671"+ inkscape:window-x="0"+ inkscape:window-y="55"+ inkscape:window-maximized="1"+ fit-margin-top="1" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0">@@ -179,8 +179,10 @@ visible="true" enabled="true" snapvisiblegridlinesonly="true"- originx="-56.941089px"- originy="-465.18127px" />+ originx="-232.64974"+ originy="-799.15823"+ spacingx="1"+ spacingy="1" /> </sodipodi:namedview> <metadata id="metadata7">@@ -190,7 +192,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />- <dc:title />+ <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata>@@ -198,56 +200,53 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"- transform="translate(-56.941089,17.879098)">- <path- style="fill:none;stroke:#74b674;stroke-width:27.59247017;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:82.77741051, 27.59247017;stroke-dashoffset:27.59247017"- d="m 70.761814,288.36996 c -0.01207,-1.2669 -0.02449,-2.53589 -0.02449,-3.80671 0,-159.41492 129.271656,-288.6461129 288.736206,-288.6461129 159.46457,0 288.73621,129.2311929 288.73621,288.6461129 l 0,0 0,0 c 0,1.27082 -0.009,2.53969 -0.0245,3.80671"- id="path3802-8"- inkscape:connector-curvature="0" />- <path- sodipodi:type="arc"- style="fill:none;stroke:#000000;stroke-width:34.42315674;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"- id="path2985-7"- sodipodi:cx="381.42856"- sodipodi:cy="433.79074"- sodipodi:rx="130"- sodipodi:ry="118.57143"- d="m 511.42856,433.79074 a 130,118.57143 0 1 1 -260,0 130,118.57143 0 1 1 260,0 z"- transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"- />- <path- style="fill:none;stroke:#000000;stroke-width:18.45480156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"- d="m 417.41556,287.80173 211.44171,0"- id="path3757-7"- inkscape:path-effect="#path-effect3759-7"- inkscape:original-d="m 417.41556,287.80173 211.44171,0"- inkscape:connector-curvature="0"- />- <path- style="fill:none;stroke:#000000;stroke-width:18.17925262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"- d="m 294.08479,287.66116 -211.718251,0.2812"- id="path3761-7"- inkscape:path-effect="#path-effect3763-2"- inkscape:original-d="m 294.08479,287.66116 -211.718251,0.2812"- inkscape:connector-curvature="0"- />- <path- style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"- d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"- id="path3768-2"- inkscape:path-effect="#path-effect3770-6"- inkscape:original-d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"- inkscape:connector-curvature="0"- sodipodi:nodetypes="ccc"- />- <path- style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"- d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"- id="path3768-9-7"- inkscape:path-effect="#path-effect3770-3-1"- inkscape:original-d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"- inkscape:connector-curvature="0"- sodipodi:nodetypes="ccc"- />+ transform="translate(-232.64974,2.7960645)">+ <g+ id="g1412"+ transform="matrix(0.41816393,0,0,0.41816393,209.83903,7.3082603)">+ <path+ inkscape:connector-curvature="0"+ id="path3802-8"+ d="m 70.761814,288.36996 c -0.01207,-1.2669 -0.02449,-2.53589 -0.02449,-3.80671 0,-159.41492 129.271656,-288.6461129 288.736206,-288.6461129 159.46457,0 288.73621,129.2311929 288.73621,288.6461129 v 0 0 c 0,1.27082 -0.009,2.53969 -0.0245,3.80671"+ style="fill:none;stroke:#74b674;stroke-width:27.59247017;stroke-miterlimit:4;stroke-dasharray:82.77741051, 27.59247017;stroke-dashoffset:27.59247017;stroke-opacity:1" />+ <ellipse+ transform="matrix(0.50880116,0,0,0.55776489,164.13818,45.848517)"+ id="path2985-7"+ style="fill:none;stroke:#000000;stroke-width:34.42315674;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"+ cx="381.42856"+ cy="433.79074"+ rx="130"+ ry="118.57143" />+ <path+ inkscape:connector-curvature="0"+ inkscape:original-d="M 417.41556,287.80173 H 628.85727"+ inkscape:path-effect="#path-effect3759-7"+ id="path3757-7"+ d="M 417.41556,287.80173 H 628.85727"+ style="fill:none;stroke:#000000;stroke-width:18.45480156;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ inkscape:connector-curvature="0"+ inkscape:original-d="m 294.08479,287.66116 -211.718251,0.2812"+ inkscape:path-effect="#path-effect3763-2"+ id="path3761-7"+ d="m 294.08479,287.66116 -211.718251,0.2812"+ style="fill:none;stroke:#000000;stroke-width:18.17925262;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ sodipodi:nodetypes="ccc"+ inkscape:connector-curvature="0"+ inkscape:original-d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"+ inkscape:path-effect="#path-effect3770-6"+ id="path3768-2"+ d="M 200.97285,226.67532 77.897224,289.6408 200.97285,348.92819"+ style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ <path+ sodipodi:nodetypes="ccc"+ inkscape:connector-curvature="0"+ inkscape:original-d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"+ inkscape:path-effect="#path-effect3770-3-1"+ id="path3768-9-7"+ d="M 520.66838,225.39683 643.74401,288.36232 520.66838,347.6497"+ style="fill:none;stroke:#000000;stroke-width:18.33793068;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+ </g> </g> </svg>
data/org.freedesktop.Bustle.appdata.xml.in view
@@ -41,6 +41,11 @@ <id>bustle.desktop</id> </provides> <releases>+ <release date="2019-03-08" version="0.7.5">+ <description>+ <p>As well as being able to filter out messages involving certain services, you can now also filter messages to only show certain services.</p>+ </description>+ </release> <release date="2018-12-07" version="0.7.4"> <description> <p>In the details for an error reply, the error name is now shown, and the error message is formatted more legibly.</p>@@ -54,7 +59,7 @@ </release> <release date="2018-07-24" version="0.7.2"> <description>- <p>You can now explore messages while they're being recorded. (Filtering, statistics and exporting are still only available once you stop recording.)</p>+ <p>You can now explore messages while they're being recorded. Filtering, statistics and exporting are still only available once you stop recording.</p> <p>The raw sender and destination for each message is now shown in the details pane.</p> <p>Bytestrings with embedded NULs which are otherwise ASCII are now shown as ASCII strings.</p> </description>
− po/messages.pot
@@ -1,326 +0,0 @@-# SOME DESCRIPTIVE TITLE.-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER-# This file is distributed under the same license as the PACKAGE package.-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.-#-#, fuzzy-msgid ""-msgstr ""-"Project-Id-Version: PACKAGE VERSION\n"-"Report-Msgid-Bugs-To: \n"-"POT-Creation-Date: 2018-12-07 09:43+0000\n"-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"-"Language-Team: LANGUAGE <LL@li.org>\n"-"Language: \n"-"MIME-Version: 1.0\n"-"Content-Type: text/plain; charset=UTF-8\n"-"Content-Transfer-Encoding: 8bit\n"--#: Bustle/StatisticsPane.hs:189 Bustle/StatisticsPane.hs:192-msgid "%.1f ms"-msgstr ""--#: Bustle/Noninteractive.hs:55-msgid "(no interface)"-msgstr ""--#: Bustle/UI/AboutDialog.hs:46 data/bustle.ui:101-#: data/org.freedesktop.Bustle.desktop.in:3-#: data/org.freedesktop.Bustle.appdata.xml.in:9-msgid "Bustle"-msgstr ""--#: Bustle/StatisticsPane.hs:190-msgid "Calls"-msgstr ""--#: Bustle/UI.hs:456-msgid "Close _Without Saving"-msgstr ""--#: Bustle/UI.hs:226-msgid "Could not read '%s'"-msgstr ""--#: Bustle/UI.hs:763-msgid "Couldn't export log as PDF: "-msgstr ""--#: Bustle/Noninteractive.hs:48-msgid "Couldn't parse '%s': %s"-msgstr ""--#: Bustle/UI.hs:431-msgid "Couldn't save log: "-msgstr ""--#: Bustle/StatisticsPane.hs:222 data/bustle.ui:787 data/bustle.ui:896-msgid "Error"-msgstr ""--#: Bustle/StatisticsPane.hs:150-msgid "Frequency"-msgstr ""--#: Bustle/UI.hs:455-msgid "If you don't save, this log will be lost forever."-msgstr ""--#: Bustle/StatisticsPane.hs:229-msgid "Largest"-msgstr ""--#: Bustle/UI.hs:239-msgid "Logged <b>%u</b> messages"-msgstr ""--#: Bustle/StatisticsPane.hs:191 Bustle/StatisticsPane.hs:228-msgid "Mean"-msgstr ""--#: Bustle/StatisticsPane.hs:135 Bustle/StatisticsPane.hs:213 data/bustle.ui:688-msgid "Member"-msgstr ""--#: Bustle/StatisticsPane.hs:142 Bustle/StatisticsPane.hs:179-msgid "Method"-msgstr ""--#: Bustle/StatisticsPane.hs:220 data/bustle.ui:762-msgid "Method call"-msgstr ""--#: Bustle/StatisticsPane.hs:221 data/bustle.ui:774-msgid "Method return"-msgstr ""--#: Bustle/UI.hs:348-msgid "Recording %s…"-msgstr ""--#: Bustle/UI.hs:448-msgid "Save log '%s' before closing?"-msgstr ""--#: Bustle/StatisticsPane.hs:143 Bustle/StatisticsPane.hs:223 data/bustle.ui:800-msgid "Signal"-msgstr ""--#: Bustle/StatisticsPane.hs:227-msgid "Smallest"-msgstr ""--#: Bustle/UI/AboutDialog.hs:48-msgid "Someone's favourite D-Bus profiler"-msgstr ""--#: Bustle/StatisticsPane.hs:188-msgid "Total"-msgstr ""--#: Bustle/UI/FilterDialog.hs:123-msgid ""-"Unticking a service hides its column in the diagram, and all messages it is "-"involved in. That is, all methods it calls or are called on it, the "-"corresponding returns, and all signals it emits will be hidden."-msgstr ""--#: Bustle/Util.hs:48-msgid "Warning: "-msgstr ""--#: Bustle/UI.hs:433-msgid ""-"You might want to manually recover the log from the temporary file at \"%s\"."-msgstr ""--#: data/bustle.ui:14-msgid "_Filter Visible Services…"-msgstr ""--#: data/bustle.ui:24-msgid "_Statistics"-msgstr ""--#: data/bustle.ui:62-msgid ""-"Display two logs—one for the session bus, one for the system bus—side by "-"side."-msgstr ""--#: data/bustle.ui:63-msgid "O_pen a Pair of Logs…"-msgstr ""--#: data/bustle.ui:75-msgid "Record S_ession Bus"-msgstr ""--#: data/bustle.ui:84-msgid "Record S_ystem Bus"-msgstr ""--#: data/bustle.ui:93-msgid "Record _Address…"-msgstr ""--#: data/bustle.ui:138-msgid "Record a new log"-msgstr ""--#: data/bustle.ui:149-msgid "_Record"-msgstr ""--#: data/bustle.ui:182-msgid "_Stop"-msgstr ""--#: data/bustle.ui:200-msgid "Open an existing log"-msgstr ""--#: data/bustle.ui:310-msgid "Export as PDF"-msgstr ""--#: data/bustle.ui:334-msgid "Save"-msgstr ""--#: data/bustle.ui:493-msgid ""-"Start recording D-Bus activity with the <b>Record</b> button above\n"-" You can also run <i>dbus-monitor --pcap</i> from the command line"-msgstr ""--#: data/bustle.ui:512-msgid "Welcome to Bustle"-msgstr ""--#: data/bustle.ui:537-msgid "<big><b>Waiting for D-Bus traffic; please hold…</b></big>"-msgstr ""--#: data/bustle.ui:564-msgid "Frequencies"-msgstr ""--#: data/bustle.ui:578-msgid "Durations"-msgstr ""--#: data/bustle.ui:593-msgid "Sizes"-msgstr ""--#: data/bustle.ui:640-msgid "Type"-msgstr ""--#: data/bustle.ui:656-msgid "Path"-msgstr ""--#: data/bustle.ui:720-msgid "Arguments"-msgstr ""--#: data/bustle.ui:813-msgid "Directed signal"-msgstr ""--#: data/bustle.ui:832-msgid "Sender"-msgstr ""--#: data/bustle.ui:848-msgid "Destination"-msgstr ""--#: data/org.freedesktop.Bustle.desktop.in:4-#: data/org.freedesktop.Bustle.appdata.xml.in:10-msgid "Draw sequence diagrams of D-Bus activity"-msgstr ""--#: data/org.freedesktop.Bustle.desktop.in:6-msgid "org.freedesktop.Bustle"-msgstr ""--#: data/org.freedesktop.Bustle.desktop.in:11-msgid "debug;profile;d-bus;dbus;sequence;monitor;"-msgstr ""--#. Translators: These are the application description paragraphs in the AppData file.-#: data/org.freedesktop.Bustle.appdata.xml.in:13-msgid ""-"Bustle draws sequence diagrams of D-Bus activity. It shows signal emissions, "-"method calls and their corresponding returns, with time stamps for each "-"individual event and the duration of each method call. This can help you "-"check for unwanted D-Bus traffic, and pinpoint why your D-Bus-based "-"application is not performing as well as you like. It also provides "-"statistics like signal frequencies and average method call times."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:26-msgid "Explore sequence diagrams of D-Bus activity"-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:30-msgid "See statistics summarizing the log"-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:34-msgid "Relax with this soothing greyscale welcome page"-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:46-msgid ""-"In the details for an error reply, the error name is now shown, and the "-"error message is formatted more legibly."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:47-msgid ""-"The default file extension for log files is now ‘.pcap’, reflecting what "-"they actually are."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:52-msgid ""-"Bustle now handles the application/vnd.tcpdump.pcap MIME type, which in "-"practice means that your file manager will offer to open pcap files with "-"Bustle."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:57-msgid ""-"You can now explore messages while they're being recorded. (Filtering, "-"statistics and exporting are still only available once you stop recording.)"-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:58-msgid ""-"The raw sender and destination for each message is now shown in the details "-"pane."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:59-msgid ""-"Bytestrings with embedded NULs which are otherwise ASCII are now shown as "-"ASCII strings."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:64-msgid ""-"It's now possible to monitor the system bus (from the user interface and "-"with the bustle-pcap command-line tool), with no need to reconfigure the "-"system bus. It's also possible to monitor an arbitrary bus by address."-msgstr ""--#: data/org.freedesktop.Bustle.appdata.xml.in:65-msgid ""-"Bustle now requires that dbus-monitor (≥ 1.9.10) and pkexec are installed on "-"your system."-msgstr ""