summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2019-02-09 02:13:06 +0100
committertv <tv@krebsco.de>2019-02-09 02:33:04 +0100
commit9d688b6ffad14912bd1afe42555747cb3d213d95 (patch)
treebfe639002a97508784e1c52135f566f4399d0dbb
parent03623ce6c011c1e85df7d91aed4458c098ff22ff (diff)
Main.app: copy capture to clipboard with xclipv1.1.0
-rw-r--r--flameshot-once.cabal2
-rw-r--r--src/Flameshot/Internal.hs18
-rw-r--r--src/Flameshot/Internal/Process.hs26
-rw-r--r--src/main.hs2
4 files changed, 30 insertions, 18 deletions
diff --git a/flameshot-once.cabal b/flameshot-once.cabal
index 772c464..91a710c 100644
--- a/flameshot-once.cabal
+++ b/flameshot-once.cabal
@@ -1,5 +1,5 @@
name: flameshot-once
-version: 1.0.1
+version: 1.1.0
license: MIT
author: tv <tv@krebsco.de>
maintainer: tv <tv@krebsco.de>
diff --git a/src/Flameshot/Internal.hs b/src/Flameshot/Internal.hs
index 56a35b4..b01b145 100644
--- a/src/Flameshot/Internal.hs
+++ b/src/Flameshot/Internal.hs
@@ -10,19 +10,17 @@ import Control.Concurrent.Async (race)
import Control.Concurrent.Extended
import Control.Exception
import Data.ByteString (ByteString)
-import qualified Data.ByteString as BS
import qualified Data.Char as C
import Data.Function (on)
import Data.Maybe (fromMaybe)
-import Data.Time.Clock
import Data.Time.Clock.System
-import Data.Time.Format
import Data.Time.ISO8601
import DBus
import DBus.Internal.Message
import DBus.Socket
import Data.Text (Text)
import qualified Data.Text.Extended as T
+import qualified Flameshot.Internal.Process as P
blessBusName :: BusName -> Blessings Text
@@ -110,14 +108,6 @@ showUnprintable =
. T.groupBy ((==) `on` p)
-saveImage :: FilePath -> ByteString -> IO ()
-saveImage cGuiPath rawImage = do
- t <- formatISO8601Seconds . systemToUTCTime <$> getSystemTime
- let path = cGuiPath <> "/" <> baseName
- baseName = t <> "_flameshot.png"
- BS.writeFile path rawImage
-
-
-formatISO8601Seconds :: UTCTime -> String
-formatISO8601Seconds =
- formatTime defaultTimeLocale (iso8601DateFormat $ Just "%H:%M:%SZ")
+copyToClipboard :: String -> ByteString -> IO ()
+copyToClipboard mimetype =
+ P.writeDaemon "xclip" ["-selection", "clipboard", "-t", mimetype, "-i"]
diff --git a/src/Flameshot/Internal/Process.hs b/src/Flameshot/Internal/Process.hs
index c435d48..47220a3 100644
--- a/src/Flameshot/Internal/Process.hs
+++ b/src/Flameshot/Internal/Process.hs
@@ -3,12 +3,14 @@
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
-module Flameshot.Internal.Process (run,Callbacks(..)) where
+module Flameshot.Internal.Process (run,Callbacks(..),writeDaemon) where
import Control.Concurrent (forkIO,threadDelay)
import Control.Concurrent.Async (race)
import Control.Exception
-import Control.Monad.Extended (untilM_,unless)
+import Control.Monad.Extended (untilM_,unless,void)
+import Data.ByteString (ByteString)
+import qualified Data.ByteString as BS
import Data.Text (Text)
import qualified Data.Text.IO as T
import System.Exit
@@ -16,10 +18,16 @@ import System.IO (BufferMode(LineBuffering),hSetBuffering)
import System.IO (Handle,hClose,hPutStr,hIsEOF)
import System.IO.Error (catchIOError,isDoesNotExistError)
import System.Process
+import System.Posix.Directory (changeWorkingDirectory)
+import System.Posix.Files (setFileCreationMask)
+import System.Posix.IO (closeFd,dupTo,openFd,stdError,stdInput,stdOutput)
+import System.Posix.IO (defaultFileFlags,OpenMode(WriteOnly))
+import System.Posix.Process (createSession,forkProcess,getProcessStatus)
import System.Posix.Process (getProcessGroupIDOf)
import System.Posix.Signals (Signal,signalProcessGroup,killProcess)
import System.Posix.Types (ProcessGroupID)
+
data Callbacks = Callbacks
{ onOutLine :: Pid -> Text -> IO ()
, onErrLine :: Pid -> Text -> IO ()
@@ -73,6 +81,20 @@ run path args cwd env input hTimeout Callbacks{..} =
}
+writeDaemon :: FilePath -> [String] -> ByteString -> IO ()
+writeDaemon path args input = do
+ pid <- forkProcess $ do
+ _ <- setFileCreationMask 0o0027
+ _ <- createSession
+ changeWorkingDirectory "/"
+ closeFd stdInput
+ bracket (openFd "/dev/null" WriteOnly Nothing defaultFileFlags) closeFd
+ $ \hnull -> mapM_ (dupTo hnull) [stdOutput, stdError]
+ (Just hin, _, _, _) <-
+ createProcess (proc path args) { std_in = CreatePipe }
+ BS.hPut hin input
+ hClose hin
+ void (getProcessStatus True False pid)
killProcessGroup :: ProcessGroupID -> IO ()
killProcessGroup = signalProcessGroup' killProcess
diff --git a/src/main.hs b/src/main.hs
index 133f51c..851dd7f 100644
--- a/src/main.hs
+++ b/src/main.hs
@@ -134,7 +134,7 @@ app client = do
]
} >>= \case
Right MethodReturn{} ->
- awaitCaptureFinish >>= mapM_ (saveImage cGuiPath)
+ awaitCaptureFinish >>= mapM_ (copyToClipboard "image/png")
Left err ->
putLog $ "capture failed: " <> blessMethodError err