emacs/src/haikuterm.h

376 lines
11 KiB
C

/* Haiku window system support
Copyright (C) 2021-2024 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs 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 3 of the License, or (at
your option) any later version.
GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#ifndef _HAIKU_TERM_H_
#define _HAIKU_TERM_H_
#include <pthread.h>
#ifdef USE_BE_CAIRO
#include <cairo.h>
#endif
#include "haikugui.h"
#include "frame.h"
#include "character.h"
#include "dispextern.h"
#include "font.h"
#include "systime.h"
#define HAVE_CHAR_CACHE_MAX 65535
/* This is really defined in haiku_support.h. */
struct haiku_font_change_event;
extern int popup_activated_p;
struct haikufont_info
{
struct font font;
haiku be_font;
struct font_metrics **metrics;
short metrics_nrows;
unsigned short **glyphs;
};
struct haiku_bitmap_record
{
haiku img;
char *file;
int refcount;
int height, width, depth;
uint32_t stipple_foreground;
uint32_t stipple_background;
void *stipple_bits;
};
struct haiku_display_info
{
/* Chain of all haiku_display_info structures. */
struct haiku_display_info *next;
struct terminal *terminal;
Lisp_Object name_list_element;
Lisp_Object color_map;
int n_fonts;
int smallest_char_width;
int smallest_font_height;
struct frame *focused_frame;
struct frame *focus_event_frame;
struct frame *last_mouse_glyph_frame;
struct haiku_bitmap_record *bitmaps;
ptrdiff_t bitmaps_size;
ptrdiff_t bitmaps_last;
int grabbed;
int n_planes;
int color_p;
Lisp_Object rdb;
Lisp_Object default_name;
Emacs_Cursor vertical_scroll_bar_cursor;
Emacs_Cursor horizontal_scroll_bar_cursor;
Mouse_HLInfo mouse_highlight;
struct frame *highlight_frame;
struct frame *last_mouse_frame;
struct frame *last_mouse_motion_frame;
int last_mouse_motion_x;
int last_mouse_motion_y;
struct haiku_rect last_mouse_glyph;
haiku display;
double resx, resy;
Time last_mouse_movement_time;
Window root_window;
Emacs_Cursor text_cursor;
Emacs_Cursor nontext_cursor;
Emacs_Cursor modeline_cursor;
Emacs_Cursor hand_cursor;
Emacs_Cursor hourglass_cursor;
Emacs_Cursor horizontal_drag_cursor;
Emacs_Cursor vertical_drag_cursor;
Emacs_Cursor left_edge_cursor;
Emacs_Cursor top_left_corner_cursor;
Emacs_Cursor top_edge_cursor;
Emacs_Cursor top_right_corner_cursor;
Emacs_Cursor right_edge_cursor;
Emacs_Cursor bottom_right_corner_cursor;
Emacs_Cursor bottom_edge_cursor;
Emacs_Cursor bottom_left_corner_cursor;
Emacs_Cursor no_cursor;
};
struct haiku_output
{
struct haiku_display_info *display_info;
Emacs_Cursor text_cursor;
Emacs_Cursor nontext_cursor;
Emacs_Cursor modeline_cursor;
Emacs_Cursor hand_cursor;
Emacs_Cursor hourglass_cursor;
Emacs_Cursor horizontal_drag_cursor;
Emacs_Cursor vertical_drag_cursor;
Emacs_Cursor left_edge_cursor;
Emacs_Cursor top_left_corner_cursor;
Emacs_Cursor top_edge_cursor;
Emacs_Cursor top_right_corner_cursor;
Emacs_Cursor right_edge_cursor;
Emacs_Cursor bottom_right_corner_cursor;
Emacs_Cursor bottom_edge_cursor;
Emacs_Cursor bottom_left_corner_cursor;
Emacs_Cursor no_cursor;
Emacs_Cursor current_cursor;
Emacs_Color cursor_color;
Window parent_desc;
haiku window;
haiku view;
haiku menubar;
int fontset;
int baseline_offset;
/* Whether or not the hourglass cursor is currently being
displayed. */
bool_bf hourglass_p : 1;
/* Whether or not the menu bar is open. */
bool_bf menu_bar_open_p : 1;
/* Whether or not there is data in a back buffer that hasn't been
displayed yet. */
bool_bf dirty_p : 1;
/* Whether or not the frame is complete, i.e. safe to flush on
input. */
bool_bf complete_p : 1;
struct font *font;
/* The pending position we're waiting for. */
int pending_top, pending_left;
/* Whether or not adjust_frame_size and haiku_set_offset have yet
been called by haiku_create_frame. */
bool configury_done;
/* The default cursor foreground color. */
uint32_t cursor_fg;
/* If non-NULL, the last menu bar click event received. */
struct haiku_menu_bar_click_event *saved_menu_event;
/* The type of any event that's being waited for. */
int wait_for_event_type;
/* The "dark" color of the current relief. */
uint32_t black_relief_pixel;
/* The "light" color of the current relief. */
uint32_t white_relief_pixel;
/* The background for which the relief colors above were computed.
They are changed only when a different background is involved.
-1 means no color has been computed. */
long relief_background;
/* The absolute position of this frame. This differs from left_pos
and top_pos in that the decorator and parent frames are not taken
into account. */
int frame_x, frame_y;
/* The current fullscreen mode of this frame. This should be `enum
haiku_fullscreen_mode', but that isn't available here. */
int fullscreen_mode;
};
struct x_output
{
/* Unused, makes term.c happy. */
};
extern struct haiku_display_info *x_display_list;
extern struct font_driver const haikufont_driver;
extern Lisp_Object tip_frame;
extern Lisp_Object tip_dx;
extern Lisp_Object tip_dy;
extern struct frame *haiku_dnd_frame;
extern bool haiku_dnd_follow_tooltip;
extern frame_parm_handler haiku_frame_parm_handlers[];
struct scroll_bar
{
/* These fields are shared by all vectors. */
union vectorlike_header header;
/* The window we're a scroll bar for. */
Lisp_Object window;
/* The next and previous in the chain of scroll bars in this frame. */
Lisp_Object next, prev;
/* Fields after 'prev' are not traced by the GC. */
/* The position and size of the scroll bar in pixels, relative to the
frame. */
int top, left, width, height;
/* The actual scrollbar. */
void *scroll_bar;
/* Non-nil if the scroll bar handle is currently being dragged by
the user. */
int dragging;
/* The update position if we are waiting for a scrollbar update, or
-1. */
int update;
/* The last known position of this scrollbar. */
int position;
/* The total number of units inside this scrollbar. */
int total;
/* True if the scroll bar is horizontal. */
bool horizontal;
/* The amount of units taken up by the thumb, which represents the
portion of the buffer currently on screen. */
int page_size;
};
#define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
#define FRAME_DIRTY_P(f) (FRAME_OUTPUT_DATA (f)->dirty_p)
#define FRAME_COMPLETE_P(f) (FRAME_OUTPUT_DATA (f)->complete_p)
#define MAKE_FRAME_DIRTY(f) (FRAME_DIRTY_P (f) = 1)
#define FRAME_OUTPUT_DATA(f) ((f)->output_data.haiku)
#define FRAME_HAIKU_WINDOW(f) (FRAME_OUTPUT_DATA (f)->window)
#define FRAME_HAIKU_VIEW(f) (FRAME_OUTPUT_DATA (f)->view)
#define FRAME_HAIKU_DRAWABLE(f) ((MAKE_FRAME_DIRTY (f)), FRAME_HAIKU_VIEW (f))
#define FRAME_HAIKU_MENU_BAR(f) (FRAME_OUTPUT_DATA (f)->menubar)
#define FRAME_DISPLAY_INFO(f) (FRAME_OUTPUT_DATA (f)->display_info)
#define FRAME_FONT(f) (FRAME_OUTPUT_DATA (f)->font)
#define FRAME_FONTSET(f) (FRAME_OUTPUT_DATA (f)->fontset)
#define FRAME_NATIVE_WINDOW(f) (FRAME_OUTPUT_DATA (f)->window)
#define FRAME_BASELINE_OFFSET(f) (FRAME_OUTPUT_DATA (f)->baseline_offset)
#define FRAME_CURSOR_COLOR(f) (FRAME_OUTPUT_DATA (f)->cursor_color)
#ifdef USE_BE_CAIRO
#define FRAME_CR_CONTEXT(f) \
(FRAME_HAIKU_VIEW (f) \
? EmacsView_cairo_context (FRAME_HAIKU_DRAWABLE (f)) \
: NULL)
#endif
extern void syms_of_haikuterm (void);
extern void syms_of_haikufns (void);
extern void syms_of_haikumenu (void);
extern void syms_of_haikufont (void);
extern void syms_of_haikuselect (void);
extern void init_haiku_select (void);
extern void haiku_iconify_frame (struct frame *);
extern void haiku_visualize_frame (struct frame *);
extern void haiku_unvisualize_frame (struct frame *);
extern void haiku_set_offset (struct frame *, int, int, int);
extern void haiku_set_frame_visible_invisible (struct frame *, bool);
extern void haiku_free_frame_resources (struct frame *);
extern void haiku_scroll_bar_remove (struct scroll_bar *);
extern void haiku_clear_under_internal_border (struct frame *);
extern void haiku_set_name (struct frame *, Lisp_Object, bool);
extern Lisp_Object haiku_message_to_lisp (void *);
extern struct haiku_display_info *haiku_term_init (void);
extern void mark_haiku_display (void);
extern int haiku_get_color (const char *, Emacs_Color *);
extern void haiku_set_background_color (struct frame *, Lisp_Object, Lisp_Object);
extern void haiku_set_cursor_color (struct frame *, Lisp_Object, Lisp_Object);
extern void haiku_set_cursor_type (struct frame *, Lisp_Object, Lisp_Object);
extern void haiku_set_internal_border_width (struct frame *, Lisp_Object, Lisp_Object);
extern void haiku_change_tab_bar_height (struct frame *, int);
extern void haiku_change_tool_bar_height (struct frame *, int);
extern void haiku_free_custom_cursors (struct frame *);
extern void haiku_query_color (uint32_t, Emacs_Color *);
extern unsigned long haiku_get_pixel (haiku, int, int);
extern void haiku_put_pixel (haiku, int, int, unsigned long);
extern Lisp_Object haiku_menu_show (struct frame *, int, int, int,
Lisp_Object, const char **);
extern Lisp_Object haiku_popup_dialog (struct frame *, Lisp_Object, Lisp_Object);
extern void haiku_activate_menubar (struct frame *);
extern void haiku_wait_for_event (struct frame *, int);
extern void haiku_note_drag_motion (void);
extern void haiku_note_drag_wheel (struct input_event *);
extern void initialize_frame_menubar (struct frame *);
extern void run_menu_bar_help_event (struct frame *, int);
extern void put_xrm_resource (Lisp_Object, Lisp_Object);
#ifdef HAVE_NATIVE_IMAGE_API
extern bool haiku_can_use_native_image_api (Lisp_Object);
extern int haiku_load_image (struct frame *, struct image *,
Lisp_Object, Lisp_Object);
extern void syms_of_haikuimage (void);
#endif
extern void haiku_draw_background_rect (struct glyph_string *, struct face *,
int, int, int, int);
#ifdef USE_BE_CAIRO
extern cairo_t *haiku_begin_cr_clip (struct frame *, struct glyph_string *);
extern void haiku_end_cr_clip (cairo_t *);
#endif
extern void haiku_merge_cursor_foreground (struct glyph_string *, unsigned long *,
unsigned long *);
extern void haiku_handle_selection_clear (struct input_event *);
extern void haiku_start_watching_selections (void);
extern void haiku_handle_font_change_event (struct haiku_font_change_event *,
struct input_event *);
#endif /* _HAIKU_TERM_H_ */