mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 12:56:51 +03:00
239 lines
6.7 KiB
C
239 lines
6.7 KiB
C
|
/* XView viewer routines.
|
||
|
Copyright (C) 1995 Jakub Jelinek.
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||
|
|
||
|
#include <config.h>
|
||
|
|
||
|
#include <X11/Xlib.h>
|
||
|
#include <xview/xview.h>
|
||
|
#include <xview/frame.h>
|
||
|
#include <xview/panel.h>
|
||
|
#include <xview/svrimage.h>
|
||
|
#include <xview/canvas.h>
|
||
|
#include <xview/scrollbar.h>
|
||
|
#include <xview/cms.h>
|
||
|
#include <xview/xv_xrect.h>
|
||
|
#include <xview/textsw.h>
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include "fs.h"
|
||
|
#include "dlg.h"
|
||
|
#define WANT_WIDGETS
|
||
|
#include "view.h"
|
||
|
#include "../src/util.h"
|
||
|
#include "../src/mad.h"
|
||
|
#include "xvmain.h"
|
||
|
|
||
|
extern Frame mcframe;
|
||
|
Frame viewframe;
|
||
|
Panel viewpanel;
|
||
|
Textsw viewcanvas;
|
||
|
Cms viewcms;
|
||
|
|
||
|
extern void view_destroy(WView *);
|
||
|
|
||
|
static void x_quit_cmd (Panel_button_item);
|
||
|
|
||
|
/*static struct {
|
||
|
unsigned short *bits;
|
||
|
void (*callback) (void);
|
||
|
} buttons [] = {
|
||
|
index_bits, x_index_cmd,
|
||
|
back_bits, x_back_cmd,
|
||
|
previous_bits, x_previous_cmd,
|
||
|
next_bits, x_next_cmd,
|
||
|
search_bits, x_search_cmd };*/
|
||
|
|
||
|
static void fetch_content (Textsw textsw, WView *view)
|
||
|
{
|
||
|
char *p;
|
||
|
int n;
|
||
|
|
||
|
if (view->growing_buffer) {
|
||
|
p = xmalloc (2048, "view growing");
|
||
|
if (view->stdfile != (FILE *)-1)
|
||
|
n = fread (p, 1, 2048, view->stdfile);
|
||
|
else
|
||
|
n = mc_read (view->file, p, 2048);
|
||
|
textsw_insert (textsw, p, n);
|
||
|
free (p);
|
||
|
} else {
|
||
|
textsw_insert (textsw, view->data, view->bytes_read);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void textsw_notify (Textsw textsw, Attr_attribute *attrs)
|
||
|
{
|
||
|
WView *view = (WView *) xv_get (textsw, XV_KEY_DATA, KEY_DATA_VIEW);
|
||
|
Rect *from, *to;
|
||
|
|
||
|
for (; *attrs; attrs = attr_next (attrs)) {
|
||
|
switch (*attrs) {
|
||
|
case TEXTSW_ACTION_SCROLLED:
|
||
|
from = (Rect *) attrs [1];
|
||
|
to = (Rect *) attrs [2];
|
||
|
if (view->growing_buffer) {
|
||
|
if (view->stdfile != (FILE *) -1) {
|
||
|
xv_get (textsw, TEXTSW_FIRST_LINE);
|
||
|
} else {
|
||
|
xv_get (textsw, TEXTSW_FIRST_LINE);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void create_frame (WView *view)
|
||
|
{
|
||
|
Panel_button_item button;
|
||
|
/* int i;*/
|
||
|
|
||
|
viewcms = (Cms) xv_create (XV_NULL, CMS,
|
||
|
CMS_CONTROL_CMS, TRUE,
|
||
|
CMS_SIZE, CMS_CONTROL_COLORS + 5,
|
||
|
CMS_NAMED_COLORS, "black", "red4", "green4", "black", NULL,
|
||
|
NULL);
|
||
|
|
||
|
viewframe = xv_create (mcframe, FRAME,
|
||
|
FRAME_LABEL, "View",
|
||
|
WIN_CMS, viewcms,
|
||
|
FRAME_INHERIT_COLORS, TRUE,
|
||
|
FRAME_SHOW_FOOTER, TRUE,
|
||
|
XV_KEY_DATA, KEY_DATA_VIEW, view,
|
||
|
NULL);
|
||
|
|
||
|
viewpanel = xv_create (viewframe, PANEL,
|
||
|
XV_KEY_DATA, KEY_DATA_VIEW, view,
|
||
|
NULL);
|
||
|
/*
|
||
|
xv_create (viewpanel, PANEL_BUTTON,
|
||
|
PANEL_LABEL_STRING, "Help",
|
||
|
PANEL_ITEM_MENU, xv_create (XV_NULL, MENU,
|
||
|
MENU_ITEM,
|
||
|
MENU_STRING, "Help on Help",
|
||
|
MENU_NOTIFY_PROC, x_view_on_view,
|
||
|
NULL,
|
||
|
MENU_ITEM,
|
||
|
MENU_STRING, "Index",
|
||
|
MENU_NOTIFY_PROC, x_index_cmd,
|
||
|
NULL,
|
||
|
MENU_ITEM,
|
||
|
MENU_STRING, "Back",
|
||
|
MENU_NOTIFY_PROC, x_back_cmd,
|
||
|
NULL,
|
||
|
MENU_ITEM,
|
||
|
MENU_STRING, "Previous",
|
||
|
MENU_NOTIFY_PROC, x_previous_cmd,
|
||
|
NULL,
|
||
|
MENU_ITEM,
|
||
|
MENU_STRING, "Next",
|
||
|
MENU_NOTIFY_PROC, x_next_cmd,
|
||
|
NULL,
|
||
|
MENU_ITEM,
|
||
|
MENU_STRING, "Search",
|
||
|
MENU_NOTIFY_PROC, x_search_cmd,
|
||
|
NULL,
|
||
|
NULL),
|
||
|
NULL);
|
||
|
button = (Panel_button_item) xv_create (viewpanel, PANEL_BUTTON,
|
||
|
PANEL_LABEL_STRING, "Quit",
|
||
|
PANEL_NOTIFY_PROC, x_quit_cmd,
|
||
|
NULL);
|
||
|
for (i = 0; i < sizeof (buttons) / sizeof (buttons [0]); i++) {
|
||
|
button = (Panel_button_item) xv_create (viewpanel, PANEL_BUTTON,
|
||
|
PANEL_LABEL_IMAGE, xv_create (XV_NULL, SERVER_IMAGE,
|
||
|
SERVER_IMAGE_DEPTH, 1,
|
||
|
XV_WIDTH, 48,
|
||
|
XV_HEIGHT, 48,
|
||
|
SERVER_IMAGE_BITS, buttons [i].bits,
|
||
|
NULL),
|
||
|
PANEL_NOTIFY_PROC, buttons [i].callback,
|
||
|
NULL);
|
||
|
if (!i)
|
||
|
xv_set (button,
|
||
|
PANEL_NEXT_ROW, -1,
|
||
|
NULL);
|
||
|
}
|
||
|
*/
|
||
|
button = (Panel_button_item) xv_create (viewpanel, PANEL_BUTTON,
|
||
|
PANEL_LABEL_STRING, "Quit",
|
||
|
XV_KEY_DATA, KEY_DATA_VIEW, view,
|
||
|
PANEL_CLIENT_DATA, viewframe,
|
||
|
PANEL_NOTIFY_PROC, x_quit_cmd,
|
||
|
NULL);
|
||
|
|
||
|
window_fit (viewpanel);
|
||
|
|
||
|
xv_set (viewpanel,
|
||
|
XV_WIDTH, WIN_EXTEND_TO_EDGE,
|
||
|
NULL);
|
||
|
|
||
|
xv_set (viewframe,
|
||
|
XV_KEY_DATA, KEY_DATA_PANEL, viewpanel,
|
||
|
NULL);
|
||
|
|
||
|
viewcanvas = xv_create (viewframe, TEXTSW,
|
||
|
WIN_BELOW, viewpanel,
|
||
|
XV_KEY_DATA, KEY_DATA_VIEW, view,
|
||
|
TEXTSW_BROWSING, TRUE,
|
||
|
TEXTSW_DISABLE_CD, TRUE,
|
||
|
TEXTSW_DISABLE_LOAD, TRUE,
|
||
|
TEXTSW_NOTIFY_PROC, textsw_notify,
|
||
|
TEXTSW_NOTIFY_LEVEL, TEXTSW_NOTIFY_ALL,
|
||
|
TEXTSW_IGNORE_LIMIT, TEXTSW_INFINITY,
|
||
|
TEXTSW_INSERT_MAKES_VISIBLE, TEXTSW_IF_AUTO_SCROLL,
|
||
|
TEXTSW_LOWER_CONTEXT, -1,
|
||
|
TEXTSW_UPPER_CONTEXT, -1,
|
||
|
NULL);
|
||
|
|
||
|
xv_create (viewcanvas, SCROLLBAR,
|
||
|
SCROLLBAR_DIRECTION, SCROLLBAR_VERTICAL,
|
||
|
SCROLLBAR_SPLITTABLE, TRUE,
|
||
|
NULL);
|
||
|
|
||
|
fetch_content (viewcanvas, view);
|
||
|
/* xv_create (viewcanvas, SCROLLBAR,
|
||
|
SCROLLBAR_DIRECTION, SCROLLBAR_HORIZONTAL,
|
||
|
SCROLLBAR_SPLITTABLE, TRUE,
|
||
|
NULL);*/
|
||
|
|
||
|
window_fit (viewframe);
|
||
|
|
||
|
xv_set (viewframe,
|
||
|
XV_KEY_DATA, KEY_DATA_CANVAS, viewcanvas,
|
||
|
NULL);
|
||
|
|
||
|
xv_set (viewframe,
|
||
|
XV_SHOW, TRUE,
|
||
|
NULL);
|
||
|
|
||
|
}
|
||
|
|
||
|
void x_view (WView *view)
|
||
|
{
|
||
|
create_frame (view);
|
||
|
}
|
||
|
|
||
|
static void x_quit_cmd (Panel_button_item button)
|
||
|
{
|
||
|
view_destroy ((WView *)xv_get(button, XV_KEY_DATA, KEY_DATA_VIEW));
|
||
|
xv_destroy_safe ((Frame)xv_get(button, PANEL_CLIENT_DATA));
|
||
|
xv_dispatch_a_bit();
|
||
|
}
|