i3 рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рдЯрд╛рдЗрд▓ рд╡рд┐рдВрдбреЛ рдореИрдиреЗрдЬрд░ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЕрдкрдиреЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рдПрдХ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдЕрдкреНрд░рд┐рдп рдмрд╛рдд рд╕рд╛рдордиреЗ рдЖрдИ: рдореЗрд░реЗ рдореВрд▓ рдкреИрдирд▓ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрд░реА рд╕рднреА рдХрд▓реНрдкрдирд╛рдУрдВ рдХреЛ рд╕рд╛рдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рдХрд┐ рд╕реАрдорд╛рдУрдВ рдХрд╛ рд░рдВрдЧ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рдпрд╛ рдмрджрд▓рдирд╛ рд╣реИред рдФрд░ рд▓рд┐рдирдХреНрд╕реЙрдЗрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрд╕реЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ (рдФрд░ рдХреЛрдИ рдирд╣реАрдВ рд╣реИрдВ)? рдпрд╣ рд╕рд╣реА рд╣реИ, рдореМрдЬреВрджрд╛ рдХреЛ рдкреИрдЪ рдХрд░реЗрдВ, рдпрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦреЗрдВред рдореБрдЭреЗ xcb рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдорд╛рдирдХ рдкреИрдирд▓ рд▓рд┐рдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреВрд╕рд░реЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ред C ++ рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрдУ рд╕реЗ рдкреВрдЫреЗрдВ
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рдкреИрдирд▓ рдХреНрдпрд╛ рд╣реИ? рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ:
тАЬрдЯрд╛рд╕реНрдХрдмрд╛рд░ (рдЕрдВрдЧреНрд░реЗрдЬреА рдЯрд╛рд╕реНрдХрдмрд╛рд░) - рдПрдХ рдЖрд╡реЗрджрди рдЬреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЯреВрд▓рдмрд╛рд░ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдВрдбреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред "
рд▓реЗрдХрд┐рди рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЯрд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдореЗрдВ, рдЪреАрдЬреЗрдВ рдЗрддрдиреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдореЗрдВ рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдУрд╡рд░рд▓реИрдк рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдкреНрд░рдмрдВрдзрдХ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдВрдбреЛ рдХреЛ рдЙрд╕рдХреЗ рд╕реНрдерд╛рди (рдЯрд╛рдЗрд▓) рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдЦрд┐рдбрд╝рдХреА рдлреИрд▓реА рд╣реБрдИ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ? рд╕рднреА рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рджреГрд╖реНрдЯрд┐ рдореЗрдВ рд╣реИрдВред рддреЛ рдРрд╕реЗ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдореЗрдВ рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкреНрд░рд╢реНрди рдЕрдкрдиреЗ рдЖрдк рд╣реА рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдк рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд┐рдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдХреНрдпрд╛ рдХрд░реЗрдВ? рдФрд░ рдпрд╣рд╛рдБ рдХрдИ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЖрддреА рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ! рд╣рд░ рдорд┐рдирдЯ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдлреЛрдХрд╕, рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ - рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рджреВрд╕рд░реЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЗрд╕рдХреЗ рдЖрдЧреЗ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдмрдВрдзрдХ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд░рдЦреЗрдВред рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдирдВрдд рд░реВрдк рд╕реЗ рдХрдИ рдбреЗрд╕реНрдХрдЯреЙрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдордп рдореЗрдВ 10 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ, рд╣рдорд╛рд░рд╛ рдкреИрдирд▓ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдбреЗрд╕реНрдХрдЯреЙрдкред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЯрд╛рд╕реНрдХрдмрд╛рд░" рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ "рдкреИрдирд▓" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░реЗрдВ
рдЪреВрдВрдХрд┐ рджреЛрд╕реНрддреА рдореБрд╕реНрдХреБрд░рд╛рд╣рдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреНрдпреВрдЯреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░рдВрдкрд░рд╛ рд╕реЗ рдирд╣реАрдВ рд╣рдЯреЗрдВрдЧреЗ рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЕрдкрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЬреЗрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ QWidget рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рдеред
class Q3Panel : public QWidget { Q_OBJECT public: Q3Panel(QWidget *parent = 0); ~Q3Panel(); };
рдпрджрд┐ рдЖрдк рдЕрдм рдЗрд╕ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рджрд░реНрдж рд╕реЗ рдкрд░рд┐рдЪрд┐рдд # D4D0C8 рд░рдВрдЧ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЗрд╕реЗ рдПрдХ рдкреИрдирд▓ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЬрд╛рджреВ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдПрдХ рдЭрдВрдбреЗ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
setAttribute(Qt::WA_X11NetWmWindowTypeDock, true);
рдмрд╕ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд╡рд┐рдЬреЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдиреЗ рд╣рдорд╛рд░реА рд╡рд┐рдВрдбреЛ _NET_WM_WINDOW_TYPE X11 рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ _NET_WM_WINDOW_TYPE_DOCK рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдЕрдм рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЦрд┐рдбрд╝рдХреА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдбреЙрдХ рд╣реИ! рдЖрдЗрдП рджреЗрдЦреЗрдВ:

рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдореЗрд░реЗ рд╕рдкрдиреЛрдВ рдХрд╛ рдкреИрдирд▓, рднрд╛рд░реА! рдмрд╣реБрдд рдмрдбрд╝рд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╣рдореЗрдВ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ред
void Q3Panel::setup(int height) { QRect screen = QApplication::desktop()->screenGeometry(); resize(screen.width(), height); int x, y; x = screen.left(); y = position() == top ? screen.top() : screen.bottom(); move(x, y); }
рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдЪрд░ рд╕реНрдХреНрд░реАрди рдореЗрдВ, рд╣рдореЗрдВ рддрдерд╛рдХрдерд┐рдд
рд░реВрдЯ рд╡рд┐рдВрдбреЛ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЖрдХрд╛рд░ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╣рдорд╛рд░реЗ рдкреИрдирд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рдКрдБрдЪрд╛рдИ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЪрд░ x рдореЗрдВ рд╣рдо рдЕрдкрдиреА рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдПрдВ рд╕рдордиреНрд╡рдп рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ y рдореЗрдВ - рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗред рдлрд┐рд░ рд╣рдо рдЕрдкрдиреЗ рдкреИрдирд▓ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (x, y) рдХреЗ рд╕рд╛рде рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╕реНрдерд┐рддрд┐ (), рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рдЫрд┐рдкреА рд╣реБрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
public: Position position() { return _position; }; void setPosition(Position position) { _position = position; }; private: Position _position;
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреИрдирд▓ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
I3 рдХреЗ рд╕рд╛рде рдЪреИрдЯрд┐рдВрдЧ
рддреЛ рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ред рд╣рдорд╛рд░реЗ рд╡рд┐рдВрдбреЛ рдореИрдиреЗрдЬрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ i3
рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ
рдЖрдИрдкреАрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, Qt рдХреЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд░реНрдЧ рд╣реИ - QLocalSocketред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдгред рд╕рдВрджреЗрд╢ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
< > < > < > <>
рдЕрдм, рдкрд╣рд▓реЗ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗред рдЬрд╛рджреБрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ "i3-ipc" рд╣реИред рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ 32-рдмрд┐рдЯ рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджреЗрд╢ рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ рдЙрд╕реА 32-рдмрд┐рдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджреЗрд╢, рдФрд░ рдлрд┐рд░ рд╕рдВрджреЗрд╢ рд╕реНрд╡рдпрдВред рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
- COMMAND (0) - рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рд╣реИ
- GET_WORKSPACES (1) - рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- SUBSCRIBE (2) - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ
- GET_OUTPUTS (3) - рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- GET_TREE (4) - рд╕рднреА рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рд╕рднреА рд╡рд┐рдВрдбреЛ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- GET_MARKS (5) - рдХрдВрдЯреЗрдирд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- GET_BAR_CONFIG (6) - i3 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдкреИрдирд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЗрд╕ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдирд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: COMMAND, GET_WORKSPACES рдФрд░ SUBSCRIBEред рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХред рдЕрд░реЗ рд╣рд╛рдБ, рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред I3 рдХреЛ рдкреНрд░рд╛рдкреНрдд рдФрд░ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рд╛рд░реВрдк json рд╣реИред
рдЯрд┐рдкреНрдкрдгреА : рдореИрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ - рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВред рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: "рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рд╕рдВрдЦреНрдпрд╛ X", рдЬрд╣рд╛рдВ рдПрдХреНрд╕ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдХрдорд╛рдВрдб рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ - "рд╕рдлрд▓рддрд╛", рдЬреЛ рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрддреНрддрд░ рдЙрджрд╛рд╣рд░рдг:
{ "success": true }
GET_WORKSPACES : рд╕рдВрджреЗрд╢ рдирд┐рдХрд╛рдп рд░рд┐рдХреНрдд рд╣реИ, рдЙрддреНрддрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- num (рдкреВрд░реНрдгрд╛рдВрдХ) - рддрд╛рд░реНрдХрд┐рдХ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрдЦреНрдпрд╛
- name (string) - рдбреЗрд╕реНрдХрдЯреЙрдк рдХрд╛ рдирд╛рдо UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ
- рджреГрд╢реНрдпрдорд╛рди (рдмреВрд▓рд┐рдпрди) - рдХреНрдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХрдИ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕рд╛рде рдХрдИ рдбреЗрд╕реНрдХрдЯреЙрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
- рдлреЛрдХрд╕реНрдб (рдмреВрд▓рд┐рдпрди) - рдХреНрдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдлреЛрдХрд╕ рдореЗрдВ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдбреЗрд╕реНрдХрдЯреЙрдк рдлреЛрдХрд╕ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ (рдмреВрд▓рд┐рдпрди) - рдХреНрдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛)
- rect (рдирдХреНрд╢рд╛) - x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд╡рд╛рд▓реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдЬреНрдпрд╛рдорд┐рддрд┐
- рдЖрдЙрдЯрдкреБрдЯ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) - рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдЬрд┐рд╕ рдкрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ
рдЙрддреНрддрд░ рдЙрджрд╛рд╣рд░рдг:
[ { "num": 0, "name": "1", "visible": true, "focused": true, "urgent": false, "rect": { "x": 0, "y": 0, "width": 1280, "height": 800 }, "output": "LVDS1" }, { "num": 1, "name": "2", "visible": false, "focused": false, "urgent": false, "rect": { "x": 0, "y": 0, "width": 1280, "height": 800 }, "output": "LVDS1" } ]
SUBSCRIBE : i3 рдЖрдкрдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреБрд▓ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИрдВ:
- рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ (0) - рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛рдПрдБред рд╢рд░реАрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЧреБрдг рд╣реЛрддрд╛ рд╣реИ - "рдкрд░рд┐рд╡рд░реНрддрди", рдЬреЛ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
- рдлреЛрдХрд╕ - рдЬрдм рдлрд╝реЛрдХрд╕ рджреВрд╕рд░реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ
- init - рдирдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдмрдирд╛рддреЗ рд╕рдордп
- рдЦрд╛рд▓реА - рдЦрд╛рд▓реА рдбреЗрд╕реНрдХрдЯреЙрдк рд╣рдЯрд╛рдиреЗ рдкрд░
- рдЖрдЙрдЯрдкреБрдЯ (1) - рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реА рдШрдЯрдирд╛рдПрдВред
рдИрд╡реЗрдВрдЯ рд╕рдВрджреЗрд╢ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ 1 рдкрд░ рд╕реЗрдЯ рд╣реИред рдЗрд╕рд▓рд┐рдП, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╢рд░реАрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЧреБрдг "рдкрд░рд┐рд╡рд░реНрддрд┐рдд" рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рд╣реИ, рдЬреЛ "рдлреЛрдХрд╕", "init", "рдЦрд╛рд▓реА" рдФрд░ "рддрддреНрдХрд╛рд▓" рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЙрддреНрддрд░ рдЙрджрд╛рд╣рд░рдг:
{ "change": "focus" }
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░, рдЖрдк рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо 2 рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рдПрдХ рдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЬрд╛рдПрдЧреА, рджреВрд╕рд░реЗ рдХреА рдорджрдж рд╕реЗ рд╣рдо рдХрдорд╛рдВрдб рднреЗрдЬреЗрдВрдЧреЗ рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рд╕рдВрдпреБрдХреНрдд
- рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рд╕реВрдЪреА рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛
- рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ
- рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ
- рдШрдЯрдирд╛ рдХреЗ рдЖрдиреЗ рдкрд░, рд╣рдо рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рд╕реВрдЪреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
- рдЧреЛрдЯреЛ рек
рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐
рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдлрд╛рдЗрд▓ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдирд╛рдо тАЬI3_SOCKET_PATHтАЭ
рд░реВрдЯ рд╡рд┐рдВрдбреЛ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдкрдврд╝рдХрд░ рдпрд╛ i3 --get-socketpath рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛:
QString I3Ipc::getSocketPath() { QProcess i3process; i3process.start("i3 --get-socketpath", QIODevice::ReadOnly); if (!i3process.waitForFinished()) { qDebug() << i3process.errorString(); exit(EXIT_FAILURE); } return QString(i3process.readAllStandardOutput()).remove(QChar('\n')); }
рдЕрдм, рд╕реЙрдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
void I3Ipc::reconnect() { mainSocket->abort(); eventSocket->abort(); QString socketPath = getSocketPath(); mainSocket->connectToServer(socketPath); eventSocket->connectToServer(socketPath); if (!mainSocket->waitForConnected() || !eventSocket->waitForConnected()) { qDebug() << "Connection timeout!"; exit(EXIT_FAILURE); } subscribe(); }
рдФрд░ рдбреЗрдЯрд╛ рднреЗрдЬреЗрдВ:
QByteArray I3Ipc::pack(int type, QString payload) { QByteArray b; QDataStream s(&b, QIODevice::WriteOnly); s.setByteOrder(QDataStream::LittleEndian); s.writeRawData(I3_IPC_MAGIC, qstrlen(I3_IPC_MAGIC)); s << (quint32) payload.size(); s << (quint32) type; s.writeRawData(payload.toAscii().data(), payload.size()); return b; } void I3Ipc::send(int type, QString payload) { send(type, payload, mainSocket); } void I3Ipc::send(int type, QString payload, QLocalSocket* socket) { socket->write(pack(type, payload)); }
рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднрд╛рдЧ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдб рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдбреЗрдЯрд╛ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реЙрдХреЗрдЯ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред I3_IPC_MAGIC - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ <i3 / ipc.h> рд╕реЗ рдирд┐рд░рдВрддрд░ред
Concerning setByteOrder (): BigEndian QDataStream рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реИ, рдФрд░ i3 рджреЗрд╢реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдмреИрд╕рд╛рдЦреА рдпрд╛ char рдФрд░ memcpy () рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ QDataStream рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рднреЗрдЬреЗрдВ, рдЕрдм рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрддреНрддрд░ рдХреИрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ:
void I3Ipc::read() { QLocalSocket *socket = (QLocalSocket*)sender(); if (socket->bytesAvailable() < (int) (qstrlen(I3_IPC_MAGIC) + sizeof(quint32) * 2)) return; QDataStream s(socket); s.setByteOrder(QDataStream::LittleEndian); quint32 msgType, payloadSize; s.skipRawData(qstrlen(I3_IPC_MAGIC)); s >> payloadSize; s >> msgType; while (socket->bytesAvailable() < payloadSize) { if (!socket->waitForReadyRead()) { qDebug() << "Reading timeout!"; exit(EXIT_FAILURE); } } char buf[payloadSize]; s.readRawData(buf, payloadSize); QByteArray jsonPayload(buf, payloadSize); if (msgType >> 31) { if (msgType == I3_IPC_EVENT_WORKSPACE) { emit workspaceEvent(); } } else { if (msgType == I3_IPC_REPLY_TYPE_WORKSPACES) { emit workspaceReply(jsonPayload); } } }
рдпрд╣рд╛рдВ, рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ: рд╣рдо 14 рдмрд╛рдЗрдЯреНрд╕ рдЬрдорд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (6 рдПрдХ рдореИрдЬрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рджреЛ 4-рдмрд╛рдЗрдЯ рдирдВрдмрд░ рд╣реИрдВ), рд╣рдо 6 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрджреЗрд╢ рдХрд╛ рдЖрдХрд╛рд░ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЪрд░ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ рдФрд░, рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЙрдкрдпреБрдХреНрдд рд╕рдВрдХреЗрдд рднреЗрдЬрддрд╛ рд╣реИред
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдИрд╡реЗрдВрдЯ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ json рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рдЕрдк-рдЯреВ-рдбреЗрдЯ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред рдЗрд╕реЗ "рд╕рд╛рдорд╛рдиреНрдп" рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо QJson рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХрдИ рд╡рд┐рддрд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреЛрдИ рднреА рдЗрд╕реЗ рдЦреБрдж рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ, рд╣рдо рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
LIBS += -lqjson
.Pro рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдФрд░
#include <qjson/parser.h>
рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВред QJson рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рдж рдЖрд╕рд╛рди рд╣реИред
void Q3Panel::workspaceReplySlot(const QByteArray jsonPayload) { bool ok; QList<QVariant> workspacesList = jsonParser->parse(jsonPayload, &ok).toList(); if (!ok) { qDebug() << "Parser error: " << jsonParser->errorString(); return; } workspaces->clear(); for (int i = 0; i < workspacesList.size(); ++i) { QMap<QString, QVariant> w = workspacesList.at(i).toMap(); workspaces->insert(w.value("num").toUInt(), workspaceInfo(w.value("name").toString(), w.value("focused").toBool(), w.value("urgent").toBool())); } emit updateWorkspacesWidget(workspaces); }
рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рдПрдХ рд╣реИрд╢ рдЯреЗрдмрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреА рдХреБрдВрдЬреА рдХреНрд╡рд┐рдВрдЯ 16 рдбреЗрд╕реНрдХрдЯреЙрдк рдирдВрдмрд░ рд╣реИ, рдФрд░ рдореВрд▓реНрдп рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
struct workspaceInfo { QString name; bool focused; bool urgent; workspaceInfo(QString _n, bool _f = 0, bool _u = 0) { name = _n; focused = _f; urgent = _u; } };
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рд╕реНрдЯреЛрд░ рднреА рдХрд░реЗрдВред рдПрдХ рдЯреНрд░рд┐рдлрд╝рд▓ рдмрдЪрд╛ рд╣реИ: рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛ рдореИрдиреЗрдЬрд░ рдХреЛ рдПрдХ рдХрдорд╛рдВрдб рднреЗрдЬреЗрдВред рдЖрдк рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ QHBoxLayout рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдПрдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА рдбреЗрд╕реНрдХрдЯреЙрдк рдирдВрдмрд░ рд╣реИ рдФрд░ рдорд╛рди рд╡рд░реНрдХрд╕реНрдкреЗрд╕рдмрдЯрди рдмрдЯрди рдХрд╛ рд▓рд┐рдВрдХ рд╣реИред WorkspaceButton рдХреЛ QToolButton рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдФрд░ рд╢реИрд▓реА рдХреА рдЕрдкрдиреА рдиреАрддрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдбреЗрд╕реНрдХрдЯреЙрдк рдХреА рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж, рд╡рд┐рдЬреЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рднреА рдмрдЯрди рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ:
void WorkspacesWidget::updateWorkspacesWidgetSlot(const QHash<qint16, workspaceInfo> *workspaces) { clearLayout(); QHash<qint16, workspaceInfo>::const_iterator wi = workspaces->constBegin(); while (wi != workspaces->constEnd()) { if (buttons->contains(wi.key())) { buttons->value(wi.key())->setFocused(wi.value().focused); } else { addButton(wi.key(), wi.value().focused, wi.value().name); } ++wi; } QHash<qint16, WorkspaceButton*>::const_iterator bi = buttons->constBegin(); QList<qint16> toDelete; while (bi != buttons->constEnd()) { if (!workspaces->contains(bi.key())) { delete bi.value(); toDelete << bi.key(); } else { mainLayout->addWidget(bi.value()); } ++bi; } for (int i = 0; i < toDelete.size(); ++i) { buttons->remove(toDelete.at(i)); } } void WorkspacesWidget::clearLayout() { while (mainLayout->takeAt(0)); } void WorkspacesWidget::addButton(quint16 num, bool focused, QString name) { WorkspaceButton* newButton = new WorkspaceButton(name, focused); connect(newButton, SIGNAL(clicked()), this, SLOT(buttonClickedSlot())); buttons->insert(num, newButton); }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо QHBoxLayout рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрдЯрди рд╣реИ, рддреЛ рдХреЗрдВрджреНрд░рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдпрджрд┐ рдХреЛрдИ рдмрдЯрди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВред рдлрд┐рд░ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдмрдЯрди рддрддреНрд╡реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред рдФрд░, рдпрджрд┐ рдореМрдЬреВрдж рд╣реИ, рддреЛ QHBoxLayout рдкрд░ рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдЯрд╛рдПрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рддрд░реАрдХрд╛ рдХрд┐рддрдирд╛ рдЗрд╖реНрдЯрддрдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд╣рд░ рдмрд╛рд░ рд╕рднреА рдмрдЯрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред
рд╡рд╣ рд╕рдм рд╣реИ! рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рд╣рдорд╛рд░рд╛ рдкреИрдирд▓:

рдпрд╣ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдбреЗрд╕реНрдХрдЯреЙрдк, рд╕реНрд╡рд┐рдЪ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдирдХ рдкреИрдирд▓ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЯреНрд░реЗ, рдореЗрдиреВ рдФрд░ рдШрдбрд╝реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдЬрдм рддрдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред
рд╕реНрд░реЛрдд рдХреЛрдб рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА