HUG poor man terminal
Sept 28, 2023 14:01:45 GMT 1
Post by alexfish on Sept 28, 2023 14:01:45 GMT 1
a poor mans terminal
can also cat images like sixel . .svg .png .jpg
Have Fun(can change the bits to suit)
+
BR
Alex
can also cat images like sixel . .svg .png .jpg
Have Fun(can change the bits to suit)
+
BR
Alex
'part of Bacon Gcoder ..cnc controll(View).raspberry PI4 in development
'alexfish@basic-converter.proboards.com
'
'
INCLUDE "hug.bac"
HUGOPTIONS("NOSCALING")
lib$ = HUGLIB$("gtk")
Gdk$ = HUGLIB$("gdk")
pang$ = HUGLIB$("pango")
' Import the GTK functions for file filters
IMPORT "gtk_widget_modify_fg(long,int,long)" FROM lib$ TYPE void
IMPORT "gtk_widget_modify_bg(long,int,long)" FROM lib$ TYPE void
IMPORT "gtk_file_chooser_add_filter(long,long)" FROM lib$ TYPE long
IMPORT "gtk_file_filter_add_pattern(long,char*)" FROM lib$ TYPE long
IMPORT "gtk_file_filter_new" FROM lib$ TYPE long
IMPORT "gtk_file_filter_set_name(long,char*)" FROM lib$ TYPE void
IMPORT "gdk_pixbuf_get_width(int)" FROM Gdk$ TYPE int
IMPORT "gdk_pixbuf_get_height(int)" FROM Gdk$ TYPE int
IMPORT "gdk_pixbuf_flip(long,int)" FROM Gdk$ TYPE long
/*
GdkPixbuf*
gdk_pixbuf_flip (
const GdkPixbuf* src,
gboolean horizontal
)
*/
IMPORT "gtk_viewport_new (void)" FROM lib$ TYPE long
IMPORT "gtk_scrolled_window_add_with_viewport(long,long)" FROM lib$ TYPE void
IMPORT "pango_layout_set_text(long,char*,int)" FROM pang$ TYPE void
SUB OUT2(STRING hug_text$, STRING hug_fcolor$, STRING hug_bcolor$, int hug_x, int hug_y)
LOCAL pix, ebox, context, layout, gdkcol, hug_i, rect, gldraw, glcontext
' Get the associated canvas
pix = hug_gui_properties.canvas
ebox = hug_widget_ebox(STR$(pix))
IF HUG_CANVAS_TYPE = 1 THEN
IF NOT(hug_gui_properties.freeze) THEN
IF hug_gui_properties.gl$ = "GLAREA" THEN
gtk_gl_area_make_current(hug_gui_properties.canvas)
ELSE
glcontext = gtk_widget_get_gl_context(hug_gui_properties.canvas)
gldraw = gtk_widget_get_gl_window(hug_gui_properties.canvas)
gdk_gl_drawable_gl_begin(gldraw, glcontext)
END IF
END IF
glMatrixMode(GL_PROJECTION)
glLoadIdentity
glOrtho(0, hug_widget_xsize(STR$(ebox)), hug_widget_ysize(STR$(ebox)), 0, 0, 1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity
FOR hug_i = 1 TO LEN(hug_text$)
' Background color
IF LEN(hug_bcolor$) = 7 THEN
glColor3ub(DEC(MID$(hug_bcolor$, 2, 2)), DEC(MID$(hug_bcolor$, 4, 2)), DEC(MID$(hug_bcolor$, 6, 2)) )
ELSE
glColor3ub(255, 255, 255)
END IF
glBegin(GL_POLYGON)
glVertex2i(hug_x+(hug_i-1)*8, hug_y)
glVertex2i(hug_x+hug_i*8, hug_y)
glVertex2i(hug_x+hug_i*8, hug_y+16)
glVertex2i(hug_x+(hug_i-1)*8, hug_y+16)
glEnd
' The actual text
IF LEN(hug_fcolor$) = 7 THEN
glColor3ub(DEC(MID$(hug_fcolor$, 2, 2)), DEC(MID$(hug_fcolor$, 4, 2)), DEC(MID$(hug_fcolor$, 6, 2)) )
ELSE
glColor3ub(0, 0, 0)
END IF
glRasterPos2i(hug_x+(hug_i-1)*8, hug_y+16)
hug_char = ASC(MID$(hug_text$, hug_i, 1))-32
IF hug_char >= 0 AND hug_char < 96 THEN glBitmap(8, 16, 0.0, 0.0, 8.0, 0.0, ADDRESS(hug_glfont[hug_char]))
NEXT
IF NOT(hug_gui_properties.freeze) THEN
IF hug_gui_properties.gl$ = "GLAREA" THEN
gtk_gl_area_swap_buffers(hug_gui_properties.canvas)
ELSE
gdk_gl_drawable_swap_buffers(gldraw)
gdk_gl_drawable_gl_end(gldraw)
END IF
END IF
ELIF HUG_CANVAS_TYPE = 2 THEN
RECORD PR
LOCAL x1, y_1, x2, y2 TYPE double
END RECORD
LOCAL *prop TYPE PR_type
prop = MEMORY(SIZEOF(PR_type))
context = goo_canvas_get_root_item(pix)
WIDGET = goo_canvas_text_new(context, hug_text$, hug_x, hug_y, -1, GTK_ANCHOR_CENTER, "use-markup", 1, "fill-color", hug_fcolor$, "line-width", 1.0, NULL)
goo_canvas_item_get_bounds(WIDGET, prop)
goo_canvas_item_translate(WIDGET, (prop->x2-prop->x1)/2, (prop->y2-prop->y_1)/2)
rect = goo_canvas_rect_new(context, hug_x, hug_y, prop->x2-prop->x1, prop->y2-prop->y_1, "stroke-color", hug_bcolor$, "fill-color", hug_bcolor$, NULL)
goo_canvas_item_raise(WIDGET, rect)
FREE prop
ELSE
gdk_color_parse(hug_fcolor$, hug_widget_color(STR$(pix)) )
context = hug_widget_context(STR$(pix))
gdk_gc_set_rgb_fg_color(context, hug_widget_color(STR$(pix)) )
layout = gtk_widget_create_pango_layout(hug_widget_image(STR$(ebox)), NULL)
'pango_layout_set_markup(layout, hug_text$, -1)
pango_layout_set_text(layout, hug_text$, -1)
gdkcol = gdk_color_copy(hug_widget_color(STR$(pix)) )
IF LEN(hug_bcolor$) NE 0 THEN
gdk_color_parse(hug_bcolor$, gdkcol)
gdk_draw_layout_with_colors(pix, context, hug_x, hug_y, layout, hug_widget_color(STR$(pix)), gdkcol)
ELSE
gdk_draw_layout_with_colors(pix, context, hug_x, hug_y, layout, hug_widget_color(STR$(pix)), 0)
END IF
' Refresh image
gtk_widget_queue_draw(hug_widget_image(STR$(ebox)) )
' Free memory
gdk_color_free(gdkcol)
g_object_unref(layout)
END IF
END SUB
SUB execute()
LOCAL cmd$,res$
LOCAL buf,width,height
cmd$ = GRAB$(ent)
IF INSTR(cmd$,"cat") AND (INSTR(cmd$,".png")) OR INSTR(cmd$,".jpg") OR INSTR(cmd$,".svg") THEN
cmd$ = CHOP$(REPLACE$(cmd$,"cat",""))
IF FILEEXISTS(cmd$) THEN
PRINT "Pic " , cmd$
buf = gdk_pixbuf_new_from_file(cmd$, 0)
IF buf THEN
SQUARE("#FFFFFF",0,0,2000,5000,1)
width = gdk_pixbuf_get_width(buf)
height = gdk_pixbuf_get_height(buf)
g_object_unref(buf)
PICTURE(cmd$, 0,0,width,height)
SYNC
END IF
END IF
ELSE
cmd$ = EXEC$(cmd$)
IF LEN(cmd$) THEN
SQUARE("#000000",0,0,2000,5000,1)
SYNC
SPLIT cmd$ BY NL$ TO line$ SIZE dim
FOR t = 0 TO dim - 1
res$ = line$[t]
res=REPLACE$(res$,"'",CHR$(34))
OUT2(res$,"#FFFFFF","#000000",5,t*20)
SYNC
NEXT
END IF
END IF
END SUB
SUB clear
SQUARE("#000000",0,0,2000,5000,1)
TEXT(ent,"")
FOCUS(ent)
SYNC
END SUB
win = WINDOW("hugterm",806,639)
'Scrolable Canvas ===============================================
scrolled = gtk_scrolled_window_new(0, 0)
gtk_scrolled_window_set_policy(scrolled, GTK_POLICY_AUTOMATIC, \
GTK_POLICY_AUTOMATIC)
gtk_scrolled_window_set_shadow_type(scrolled, GTK_SHADOW_ETCHED_IN)
IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(scrolled)
hug_widget_xsize(STR$(scrolled)) = 800
hug_widget_ysize(STR$(scrolled)) = 600
ATTACH(win,scrolled,0,0)
'==================================================================
can = CANVAS(2000,5000)
gtk_scrolled_window_add_with_viewport(scrolled, can)
'----------------------------------------------------
'Fill base
SQUARE("#000000",0,0,2000,5000,1)
ent=ENTRY("",600,30)
ATTACH(win,ent,3,606)
CALLBACK(ent,execute)
but = BUTTON("CLEAR",100,30)
ATTACH(win,but,606,606)
CALLBACK(but , clear)
FOCUS(ent)
DISPLAY