Blender V4.5
wm_cursors.cc File Reference
#include <cstring>
#include "GHOST_C-api.h"
#include "BLI_utildefines.h"
#include "DNA_listBase.h"
#include "DNA_userdef_types.h"
#include "DNA_workspace_types.h"
#include "BKE_global.hh"
#include "BKE_main.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "wm_cursors.hh"
#include "wm_window.hh"

Go to the source code of this file.

Classes

struct  BCursor

Macros

#define CURSOR_SIZE_NUM   (CURSOR_SIZE_32 + 1)
#define BEGIN_CURSOR_BLOCK
#define END_CURSOR_BLOCK

Enumerations

enum  CursorSize { CURSOR_SIZE_16 = 0 , CURSOR_SIZE_24 , CURSOR_SIZE_32 }

Functions

static GHOST_TStandardCursor convert_to_ghost_standard_cursor (WMCursorType curs)
static CursorSize window_size_calc ()
static void window_set_custom_cursor (wmWindow *win, BCursor *cursor)
void WM_cursor_set (wmWindow *win, int curs)
bool WM_cursor_set_from_tool (wmWindow *win, const ScrArea *area, const ARegion *region)
void WM_cursor_modal_set (wmWindow *win, int val)
void WM_cursor_modal_restore (wmWindow *win)
void WM_cursor_wait (bool val)
void WM_cursor_grab_enable (wmWindow *win, const eWM_CursorWrapAxis wrap, const rcti *wrap_region, const bool hide)
void WM_cursor_grab_disable (wmWindow *win, const int mouse_ungrab_xy[2])
static void wm_cursor_warp_relative (wmWindow *win, int x, int y)
bool wm_cursor_arrow_move (wmWindow *win, const wmEvent *event)
static bool wm_cursor_time_large (wmWindow *win, uint32_t nr)
static void wm_cursor_time_small (wmWindow *win, uint32_t nr)
void WM_cursor_time (wmWindow *win, int nr)
void wm_init_cursor_data ()

Variables

static const uchar cursor_size_px [CURSOR_SIZE_NUM]
static BCursorBlenderCursor [WM_CURSOR_NUM] = {nullptr}

Detailed Description

Cursor pixmap and cursor utility functions to change the cursor.

Definition in file wm_cursors.cc.

Macro Definition Documentation

◆ BEGIN_CURSOR_BLOCK

#define BEGIN_CURSOR_BLOCK
Value:
{ \
((void)0)

Custom Cursor Description

Each bit represents a pixel, so 1 byte = 8 pixels, the bytes go Left to Right. Top to bottom the bits in a byte go right to left (ie; 0x01, 0x80 represents a line of 16 pix with the first and last pix set.)

  • A 0 in the bitmap = white, a 1 black
  • a 0 in the mask = transparent pix.

This type of cursor is 16x16 pixels only.


There is a nice Python GUI utility that can be used for drawing cursors in this format in the Blender source distribution, in ./tools/utils/make_cursor_gui.py .

Start it with the command python3 make_cursor_gui.py It will copy its output to the console when you press 'Do it'. Because defining a cursor mixes declarations and executable code each cursor needs its own scoping block or it would be split up over several hundred lines of code. To enforce/document this better I define 2 pretty brain-dead macros so it's obvious what the extra "[]" are for.

Definition at line 553 of file wm_cursors.cc.

Referenced by wm_init_cursor_data().

◆ CURSOR_SIZE_NUM

#define CURSOR_SIZE_NUM   (CURSOR_SIZE_32 + 1)

Definition at line 37 of file wm_cursors.cc.

◆ END_CURSOR_BLOCK

#define END_CURSOR_BLOCK
Value:
} \
((void)0)

Definition at line 556 of file wm_cursors.cc.

Referenced by wm_init_cursor_data().

Enumeration Type Documentation

◆ CursorSize

enum CursorSize
Enumerator
CURSOR_SIZE_16 

Size: 16x16.

CURSOR_SIZE_24 

Size: 24x24.

CURSOR_SIZE_32 

Size: 32x32.

Definition at line 29 of file wm_cursors.cc.

Function Documentation

◆ convert_to_ghost_standard_cursor()

GHOST_TStandardCursor convert_to_ghost_standard_cursor ( WMCursorType curs)
static

Definition at line 57 of file wm_cursors.cc.

References GHOST_kStandardCursorBlade, GHOST_kStandardCursorBothHandles, GHOST_kStandardCursorCopy, GHOST_kStandardCursorCrosshair, GHOST_kStandardCursorCrosshairA, GHOST_kStandardCursorCrosshairB, GHOST_kStandardCursorCrosshairC, GHOST_kStandardCursorCustom, GHOST_kStandardCursorDefault, GHOST_kStandardCursorDownArrow, GHOST_kStandardCursorEraser, GHOST_kStandardCursorEWScroll, GHOST_kStandardCursorEyedropper, GHOST_kStandardCursorHandClosed, GHOST_kStandardCursorHandOpen, GHOST_kStandardCursorHandPoint, GHOST_kStandardCursorHorizontalSplit, GHOST_kStandardCursorKnife, GHOST_kStandardCursorLeftArrow, GHOST_kStandardCursorLeftHandle, GHOST_kStandardCursorLeftRight, GHOST_kStandardCursorMove, GHOST_kStandardCursorNSEWScroll, GHOST_kStandardCursorNSScroll, GHOST_kStandardCursorPencil, GHOST_kStandardCursorRightArrow, GHOST_kStandardCursorRightHandle, GHOST_kStandardCursorStop, GHOST_kStandardCursorText, GHOST_kStandardCursorUpArrow, GHOST_kStandardCursorUpDown, GHOST_kStandardCursorVerticalSplit, GHOST_kStandardCursorWait, GHOST_kStandardCursorZoomIn, GHOST_kStandardCursorZoomOut, WM_CURSOR_BLADE, WM_CURSOR_BOTH_HANDLES, WM_CURSOR_COPY, WM_CURSOR_CROSS, WM_CURSOR_CROSSC, WM_CURSOR_DEFAULT, WM_CURSOR_DOT, WM_CURSOR_E_ARROW, WM_CURSOR_EDIT, WM_CURSOR_ERASER, WM_CURSOR_EW_SCROLL, WM_CURSOR_EYEDROPPER, WM_CURSOR_H_SPLIT, WM_CURSOR_HAND, WM_CURSOR_HAND_CLOSED, WM_CURSOR_HAND_POINT, WM_CURSOR_KNIFE, WM_CURSOR_LEFT_HANDLE, WM_CURSOR_MOVE, WM_CURSOR_N_ARROW, WM_CURSOR_NS_SCROLL, WM_CURSOR_NSEW_SCROLL, WM_CURSOR_PAINT, WM_CURSOR_PAINT_BRUSH, WM_CURSOR_RIGHT_HANDLE, WM_CURSOR_S_ARROW, WM_CURSOR_STOP, WM_CURSOR_TEXT_EDIT, WM_CURSOR_V_SPLIT, WM_CURSOR_W_ARROW, WM_CURSOR_WAIT, WM_CURSOR_X_MOVE, WM_CURSOR_Y_MOVE, WM_CURSOR_ZOOM_IN, and WM_CURSOR_ZOOM_OUT.

Referenced by WM_cursor_set().

◆ window_set_custom_cursor()

void window_set_custom_cursor ( wmWindow * win,
BCursor * cursor )
static

◆ window_size_calc()

◆ wm_cursor_arrow_move()

◆ WM_cursor_grab_disable()

◆ WM_cursor_grab_enable()

void WM_cursor_grab_enable ( wmWindow * win,
eWM_CursorWrapAxis wrap,
const rcti * wrap_region,
bool hide )

Enable cursor grabbing, optionally hiding the cursor and wrapping cursor-motion within a sub-region of the window.

Parameters
wrapan enum (WM_CURSOR_WRAP_NONE, WM_CURSOR_WRAP_XY... etc).
wrap_regionWindow-relative region for cursor wrapping (when wrap is WM_CURSOR_WRAP_XY). When NULL, the window bounds are used for wrapping.
Note
The current grab state can be accessed by #wmWindowManager.grabcursor although.

Definition at line 277 of file wm_cursors.cc.

References wmWindow::eventstate, G, G_DEBUG, GHOST_kAxisX, GHOST_kAxisY, GHOST_kGrabHide, GHOST_kGrabNormal, GHOST_kGrabWrap, GHOST_SetCursorGrab(), wmWindow::ghostwin, wmWindow::grabcursor, wmTabletData::is_motion_absolute, wmEvent::tablet, wm_cursor_position_to_ghost_screen_coords(), WM_CURSOR_WRAP_NONE, WM_CURSOR_WRAP_X, WM_CURSOR_WRAP_Y, wrap(), rcti::xmax, rcti::xmin, rcti::ymax, and rcti::ymin.

Referenced by button_activate_state(), initWalkInfo(), wm_gizmomap_modal_set(), wm_macro_modal(), and wm_operator_invoke().

◆ WM_cursor_modal_restore()

◆ WM_cursor_modal_set()

void WM_cursor_modal_set ( wmWindow * win,
int val )

Definition at line 242 of file wm_cursors.cc.

References wmWindow::cursor, wmWindow::lastcursor, wmWindow::modalcursor, and WM_cursor_set().

Referenced by annotation_draw_cursor_set(), area_swap_invoke(), blender::ui::bonedropper_invoke(), button_activate_init(), curve_draw_invoke(), blender::ed::curves::curves_draw_invoke(), datadropper_invoke(), depthdropper_invoke(), driverdropper_invoke(), blender::ui::eyedropper_colorband_invoke(), eyedropper_invoke(), graph_slider_invoke(), blender::ed::sculpt_paint::grease_pencil_fill_event_modal_map(), blender::ed::sculpt_paint::grease_pencil_fill_invoke(), blender::ed::sculpt_paint::greasepencil::grease_pencil_interpolate_invoke(), blender::ed::greasepencil::grease_pencil_primitive_cursor_update(), blender::ed::greasepencil::grease_pencil_primitive_invoke(), image_view_pan_init(), image_view_zoom_init(), blender::ed::transform::initMouseInputMode(), knifetool_invoke(), blender::ed::space_node::node_resize_init(), pose_slide_invoke_common(), poselib_blend_invoke(), sample_color_invoke(), blender::ed::asset::screenshot_preview_invoke(), blender::ed::sculpt_paint::filter::sculpt_mesh_filter_modal(), blender::ed::sculpt_paint::dyntopo::sculpt_sample_detail_size_invoke(), ui_numedit_set_active(), ui_textedit_begin(), view_pan_init(), view_pan_invoke(), view_zoom_init(), view_zoomdrag_invoke(), WM_cursor_wait(), wm_drags_check_ops(), WM_gesture_lasso_invoke(), WM_gesture_lines_invoke(), WM_gesture_polyline_invoke(), WM_gesture_straightline_invoke(), and WM_operator_name_call_ptr_with_depends_on_cursor().

◆ WM_cursor_set()

◆ WM_cursor_set_from_tool()

◆ WM_cursor_time()

void WM_cursor_time ( wmWindow * win,
int nr )

After this you can call restore too.

Definition at line 501 of file wm_cursors.cc.

References wmWindow::cursor, wmWindow::lastcursor, U, wm_cursor_time_large(), and wm_cursor_time_small().

Referenced by screen_opengl_render_anim_step().

◆ wm_cursor_time_large()

bool wm_cursor_time_large ( wmWindow * win,
uint32_t nr )
static

Definition at line 392 of file wm_cursors.cc.

References GHOST_kSuccess, GHOST_SetCustomCursorShape(), wmWindow::ghostwin, i, mask(), x, and y.

Referenced by WM_cursor_time().

◆ wm_cursor_time_small()

void wm_cursor_time_small ( wmWindow * win,
uint32_t nr )
static

Definition at line 458 of file wm_cursors.cc.

References GHOST_SetCustomCursorShape(), wmWindow::ghostwin, i, mask(), x, and y.

Referenced by WM_cursor_time().

◆ WM_cursor_wait()

◆ wm_cursor_warp_relative()

void wm_cursor_warp_relative ( wmWindow * win,
int x,
int y )
static

Definition at line 355 of file wm_cursors.cc.

References wm_cursor_position_get(), WM_cursor_warp(), x, and y.

Referenced by wm_cursor_arrow_move().

◆ wm_init_cursor_data()

Variable Documentation

◆ BlenderCursor

BCursor* BlenderCursor[WM_CURSOR_NUM] = {nullptr}
static

Definition at line 54 of file wm_cursors.cc.

Referenced by WM_cursor_set(), and wm_init_cursor_data().

◆ cursor_size_px

const uchar cursor_size_px[CURSOR_SIZE_NUM]
static
Initial value:
= {
16,
32,
32,
}

Definition at line 39 of file wm_cursors.cc.

Referenced by window_set_custom_cursor().