1 /*
2 Widgets for the Midnight Commander
3
4 Copyright (C) 2020-2025
5 The Free Software Foundation, Inc.
6
7 Authors:
8 Andrew Borodin <aborodin@vmail.ru>, 2020-2022
9
10 This file is part of the Midnight Commander.
11
12 The Midnight Commander is free software: you can redistribute it
13 and/or modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation, either version 3 of the License,
15 or (at your option) any later version.
16
17 The Midnight Commander is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
26 /** \file background.c
27 * \brief Source: WBackground widget (background area of dialog)
28 */
29
30 #include <config.h>
31
32 #include <stdlib.h>
33
34 #include "lib/global.h"
35 #include "lib/tty/tty.h"
36 #include "lib/tty/color.h"
37 #include "lib/widget.h"
38
39 /*** global variables ****************************************************************************/
40
41 /*** file scope macro definitions ****************************************************************/
42
43 /*** file scope type declarations ****************************************************************/
44
45 /*** forward declarations (file scope functions) *************************************************/
46
47 /*** file scope variables ************************************************************************/
48
49 /* --------------------------------------------------------------------------------------------- */
50 /*** file scope functions ************************************************************************/
51 /* --------------------------------------------------------------------------------------------- */
52
53 static const int *
54 background_get_colors (const Widget *w)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
55 {
56 return &(CONST_BACKGROUND (w)->color);
57 }
58
59 /* --------------------------------------------------------------------------------------------- */
60
61 static void
62 background_adjust (WBackground *b)
/* ![[previous]](../icons/left.png)
![[next]](../icons/right.png)
![[first]](../icons/first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
63 {
64 Widget *w = WIDGET (b);
65
66 w->rect = WIDGET (w->owner)->rect;
67 w->pos_flags |= WPOS_KEEP_ALL;
68 }
69
70 /* --------------------------------------------------------------------------------------------- */
71
72 static void
73 background_draw (const WBackground *b)
/* ![[previous]](../icons/left.png)
![[next]](../icons/right.png)
![[first]](../icons/first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
74 {
75 const Widget *w = CONST_WIDGET (b);
76
77 tty_setcolor (b->color);
78 tty_fill_region (w->rect.y, w->rect.x, w->rect.lines, w->rect.cols, b->pattern);
79 }
80
81 /* --------------------------------------------------------------------------------------------- */
82 /*** public functions ****************************************************************************/
83 /* --------------------------------------------------------------------------------------------- */
84
85 cb_ret_t
86 background_callback (Widget *w, Widget *sender, widget_msg_t msg, int parm, void *data)
/* ![[previous]](../icons/left.png)
![[next]](../icons/right.png)
![[first]](../icons/first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
87 {
88 WBackground *b = BACKGROUND (w);
89
90 switch (msg)
91 {
92 case MSG_INIT:
93 background_adjust (b);
94 return MSG_HANDLED;
95
96 case MSG_DRAW:
97 background_draw (b);
98 return MSG_HANDLED;
99
100 default:
101 return widget_default_callback (w, sender, msg, parm, data);
102 }
103 }
104
105 /* --------------------------------------------------------------------------------------------- */
106
107 WBackground *
108 background_new (int y, int x, int lines, int cols, int color, unsigned char pattern,
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
109 widget_cb_fn callback)
110 {
111 WRect r = { y, x, lines, cols };
112 WBackground *b;
113 Widget *w;
114
115 b = g_new (WBackground, 1);
116 w = WIDGET (b);
117 widget_init (w, &r, callback != NULL ? callback : background_callback, NULL);
118 w->get_colors = background_get_colors;
119
120 b->color = color;
121 b->pattern = pattern;
122
123 return b;
124 }
125
126 /* --------------------------------------------------------------------------------------------- */