Adding Horizontal lines before and after listings frame

I have a listing, and I would like to add a hline before and after the listing. Using the frames style parameter do not work as intended for two reasons: 1. I want to keep a left bar as a separator from numbering and the source code; and 2. There is no space between the frame top/bottom line and the left one.

The sample code is

\documentclass{article}
\usepackage{listings}
\usepackage{lipsum}

\lstdefinestyle{CEE}{language=C, frame=l,  numbers=left,  numbersep=1em,  xleftmargin=2em}

\begin{document}

\lipsum[1]

\begin{lstlisting}[style=CEE, caption={Hello world}]
#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello world\n");
return 0;
}
\end{lstlisting}

\lipsum[2]
\end{document}


That gives us:

But I wish a \hline that should fill the entire \textwidth, not only the frame width, as in (GIMP Edited)

Pay attention that spacing and line width are not correct since is just a gimp edit. The idea is the same spacing found in table environment. As:

I used the package tcolorbox to obtain the lines. You can modify the options of the environment tmpbox to suit your needs. There is one problem though; I don't think it is possible to define a new environment that puts together the tmpbox and the lstlisting. So you have to call tmpbox each time explicitly.

\documentclass[11pt, a4paper]{article}
\usepackage{geometry}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tcolorbox}
\tcbuselibrary{skins,breakable}

\newenvironment{tmpbox}{%
\tcolorbox[%
empty,
parbox=false,
noparskip,
enhanced,
breakable,
frame hidden,
boxrule=0pt,
colback=white,
left=-.5ex, % right=-4pt,
before skip=.1ex plus 2pt,
after skip=1ex plus 2pt,
overlay unbroken and last={%
\draw ($(frame.north west)+(0, -6ex)$)
-- +(1\textwidth, 0);
\draw ($(frame.south west)+(0, 2ex)$)
-- +(1\textwidth, 0);
}]
}{\endtcolorbox}

\usepackage{listings}
\lstdefinestyle{CEE}{%
frame=l, language=C, numbers=left, numbersep=1em, xleftmargin=2em
}

\usepackage{lipsum}

\begin{document}
\begin{center}\large\bfseries
\end{center}

% See \verb|https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings|.

\lipsum[1]

\begin{tmpbox}
\begin{lstlisting}[style=CEE, caption={Hello world with hlines}]
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello world\n");
return 0;
}
\end{lstlisting}
\end{tmpbox}

\lipsum[3]

\begin{lstlisting}[style=CEE, caption={Hello world}]
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello world\n");
return 0;
}
\end{lstlisting}

\lipsum[4]
\end{document}

• does tcolorbox needs tikz? or is just for tikz-calc ?
– Lin
Sep 10 '20 at 15:12
• TikZ is needed since we use the instruction overlay unbroken and last. Sep 11 '20 at 12:10