rofi
1.5.1
|
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <glib.h>
#include <cairo.h>
#include <cairo-xcb.h>
#include <librsvg/rsvg.h>
#include <xcb/xcb.h>
#include <xcb/xcb_aux.h>
#include <xcb/randr.h>
#include <xcb/xinerama.h>
#include <xcb/xcb_ewmh.h>
#include <xcb/xproto.h>
#include <xcb/xkb.h>
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-x11.h>
#include "rofi-types.h"
#include <libsn/sn.h>
#include "display.h"
#include "xcb-internal.h"
#include "xcb.h"
#include "settings.h"
#include "helper.h"
#include "timings.h"
#include <rofi.h>
Go to the source code of this file.
Macros | |
#define | G_LOG_DOMAIN "X11Helper" |
#define | SN_API_NOT_YET_FROZEN |
#define | sn_launcher_context_set_application_id sn_launcher_set_application_id |
#define | RANDR_PREF_MAJOR_VERSION 1 |
#define | RANDR_PREF_MINOR_VERSION 5 |
#define | INTERSECT(x, y, x1, y1, w1, h1) ( ( ( ( x ) >= ( x1 ) ) && ( ( x ) < ( x1 + w1 ) ) ) && ( ( ( y ) >= ( y1 ) ) && ( ( y ) < ( y1 + h1 ) ) ) ) |
Functions | |
cairo_surface_t * | x11_helper_get_screenshot_surface (void) |
static xcb_pixmap_t | get_root_pixmap (xcb_connection_t *c, xcb_screen_t *screen, xcb_atom_t atom) |
cairo_surface_t * | x11_helper_get_bg_surface (void) |
char * | window_get_text_prop (xcb_window_t w, xcb_atom_t atom) |
void | window_set_atom_prop (xcb_window_t w, xcb_atom_t prop, xcb_atom_t *atoms, int count) |
static void | x11_monitor_free (workarea *m) |
static void | x11_monitors_free (void) |
static workarea * | x11_get_monitor_from_output (xcb_randr_output_t out) |
static int | x11_is_extension_present (const char *extension) |
static void | x11_build_monitor_layout_xinerama () |
static void | x11_build_monitor_layout () |
void | display_dump_monitor_layout (void) |
void | display_startup_notification (RofiHelperExecuteContext *context, GSpawnChildSetupFunc *child_setup, gpointer *user_data) |
static int | monitor_get_dimension (int monitor_id, workarea *mon) |
static void | monitor_dimensions (int x, int y, workarea *mon) |
static int | pointer_get (xcb_window_t root, int *x, int *y) |
static int | monitor_active_from_winid (xcb_drawable_t id, workarea *mon) |
static int | monitor_active_from_id_focused (int mon_id, workarea *mon) |
static int | monitor_active_from_id (int mon_id, workarea *mon) |
int | monitor_active (workarea *mon) |
static void | rofi_view_paste (RofiViewState *state, xcb_selection_notify_event_t *xse) |
static gboolean | x11_button_to_nk_bindings_button (guint32 x11_button, NkBindingsMouseButton *button) |
static gboolean | x11_button_to_nk_bindings_scroll (guint32 x11_button, NkBindingsScrollAxis *axis, gint32 *steps) |
static void | main_loop_x11_event_handler_view (xcb_generic_event_t *event) |
static gboolean | main_loop_x11_event_handler (xcb_generic_event_t *ev, G_GNUC_UNUSED gpointer user_data) |
static int | take_pointer (xcb_window_t w, int iters) |
static int | take_keyboard (xcb_window_t w, int iters) |
static void | release_keyboard (void) |
static void | release_pointer (void) |
static void | error_trap_push (G_GNUC_UNUSED SnDisplay *display, G_GNUC_UNUSED xcb_connection_t *xdisplay) |
static void | error_trap_pop (G_GNUC_UNUSED SnDisplay *display, xcb_connection_t *xdisplay) |
static void | x11_create_frequently_used_atoms (void) |
static void | x11_helper_discover_window_manager (void) |
gboolean | display_setup (GMainLoop *main_loop, NkBindings *bindings) |
static void | x11_create_visual_and_colormap (void) |
static gboolean | lazy_grab_pointer (G_GNUC_UNUSED gpointer data) |
static gboolean | lazy_grab_keyboard (G_GNUC_UNUSED gpointer data) |
gboolean | display_late_setup (void) |
xcb_window_t | xcb_stuff_get_root_window (void) |
void | display_early_cleanup (void) |
void | display_cleanup (void) |
void | x11_disable_decoration (xcb_window_t window) |
Variables | |
WindowManagerQuirk | current_window_manager = WM_EWHM |
struct _xcb_stuff | xcb_int |
xcb_stuff * | xcb = &xcb_int |
xcb_depth_t * | depth = NULL |
xcb_visualtype_t * | visual = NULL |
xcb_colormap_t | map = XCB_COLORMAP_NONE |
static xcb_visualtype_t * | root_visual = NULL |
xcb_atom_t | netatoms [NUM_NETATOMS] |
const char * | netatom_names [] = { EWMH_ATOMS ( ATOM_CHAR ) } |
static int | error_trap_depth = 0 |
unsigned int | lazy_grab_retry_count_kb = 0 |
unsigned int | lazy_grab_retry_count_pt = 0 |
#define INTERSECT | ( | x, | |
y, | |||
x1, | |||
y1, | |||
w1, | |||
h1 | |||
) | ( ( ( ( x ) >= ( x1 ) ) && ( ( x ) < ( x1 + w1 ) ) ) && ( ( ( y ) >= ( y1 ) ) && ( ( y ) < ( y1 + h1 ) ) ) ) |
Checks if the if x and y is inside rectangle.
Definition at line 71 of file xcb.c.
Referenced by monitor_dimensions().
#define RANDR_PREF_MAJOR_VERSION 1 |
Minimal randr prefered for running rofi (1.5)
Definition at line 67 of file xcb.c.
Referenced by x11_build_monitor_layout().
#define RANDR_PREF_MINOR_VERSION 5 |
Definition at line 68 of file xcb.c.
Referenced by x11_build_monitor_layout().
#define sn_launcher_context_set_application_id sn_launcher_set_application_id |
Definition at line 54 of file xcb.c.
Referenced by display_startup_notification().
void display_cleanup | ( | void | ) |
Cleanup any remaining display related stuff
Definition at line 1322 of file xcb.c.
References _xcb_stuff::bindings_seat, _xcb_stuff::connection, _xcb_stuff::ewmh, _xcb_stuff::screen, _xcb_stuff::screen_nbr, _xcb_stuff::sncontext, _xcb_stuff::sndisplay, _xcb_stuff::source, x11_monitors_free(), and xcb.
Referenced by cleanup().
void display_dump_monitor_layout | ( | void | ) |
Dumps the display layout for -help output
Definition at line 425 of file xcb.c.
References color_bold, color_reset, _xcb_stuff::monitors, _workarea::next, and xcb.
Referenced by help().
void display_early_cleanup | ( | void | ) |
Do some early cleanup, like unmapping the surface
Definition at line 1315 of file xcb.c.
References _xcb_stuff::connection, release_keyboard(), release_pointer(), and xcb.
Referenced by rofi_view_hide(), and teardown().
gboolean display_late_setup | ( | void | ) |
Do some late setup of the display backend
Create window (without showing)
Definition at line 1277 of file xcb.c.
References find_arg(), lazy_grab_keyboard(), lazy_grab_pointer(), take_keyboard(), take_pointer(), x11_create_visual_and_colormap(), and xcb_stuff_get_root_window().
Referenced by main().
gboolean display_setup | ( | GMainLoop * | main_loop, |
NkBindings * | bindings | ||
) |
main_loop | The GMainLoop |
bindings | The bindings object |
Setup the display backend
Definition at line 1082 of file xcb.c.
References bindings, _xcb_stuff::bindings_seat, _xcb_stuff::connection, _xcb_stuff::device_id, error_trap_pop(), error_trap_push(), _xcb_stuff::ewmh, find_arg_str(), _xcb_stuff::first_event, _xcb_stuff::main_loop, main_loop, main_loop_x11_event_handler(), _xcb_stuff::screen, _xcb_stuff::screen_nbr, _xcb_stuff::sncontext, _xcb_stuff::sndisplay, _xcb_stuff::source, TICK_N, x11_build_monitor_layout(), x11_create_frequently_used_atoms(), x11_helper_discover_window_manager(), xcb, and _xcb_stuff::xkb.
Referenced by main().
void display_startup_notification | ( | RofiHelperExecuteContext * | context, |
GSpawnChildSetupFunc * | child_setup, | ||
gpointer * | user_data | ||
) |
context | The startup notification context for the application to launch |
child_setup | A pointer to return the child setup function |
user_data | A pointer to return the child setup function user_data |
Provides the needed child setup function
Definition at line 452 of file xcb.c.
References RofiHelperExecuteContext::app_id, RofiHelperExecuteContext::binary, RofiHelperExecuteContext::command, RofiHelperExecuteContext::description, _xcb_stuff::ewmh, RofiHelperExecuteContext::icon, _xcb_stuff::last_timestamp, RofiHelperExecuteContext::name, _xcb_stuff::screen_nbr, sn_launcher_context_set_application_id, _xcb_stuff::sncontext, _xcb_stuff::sndisplay, RofiHelperExecuteContext::wmclass, and xcb.
Referenced by helper_execute().
|
static |
Definition at line 1034 of file xcb.c.
References error_trap_depth.
Referenced by display_setup().
|
static |
Definition at line 1029 of file xcb.c.
References error_trap_depth.
Referenced by display_setup().
|
static |
Definition at line 111 of file xcb.c.
References _xcb_stuff::screen.
Referenced by x11_helper_get_bg_surface().
|
static |
Definition at line 1262 of file xcb.c.
References lazy_grab_retry_count_kb, _xcb_stuff::main_loop, take_keyboard(), xcb, and xcb_stuff_get_root_window().
Referenced by display_late_setup().
|
static |
Definition at line 1249 of file xcb.c.
References lazy_grab_retry_count_pt, take_pointer(), and xcb_stuff_get_root_window().
Referenced by display_late_setup().
|
static |
Definition at line 915 of file xcb.c.
References _xcb_stuff::bindings_seat, _xcb_stuff::connection, _xcb_stuff::device_id, _xcb_stuff::first_event, _xcb_stuff::main_loop, main_loop_x11_event_handler_view(), rofi_view_get_active(), rofi_view_maybe_update(), _xcb_stuff::sndisplay, xcb, and _xcb_stuff::xkb.
Referenced by display_setup().
|
static |
Process X11 events in the main-loop (gui-thread) of the application.
Definition at line 815 of file xcb.c.
References _xcb_stuff::bindings_seat, Settings::click_to_exit, config, _xcb_stuff::last_timestamp, _xcb_stuff::mouse_seen, rofi_view_frame_callback(), rofi_view_get_active(), rofi_view_handle_mouse_motion(), rofi_view_handle_text(), rofi_view_maybe_update(), rofi_view_paste(), rofi_view_temp_click_to_exit(), rofi_view_temp_configure_notify(), x11_button_to_nk_bindings_button(), x11_button_to_nk_bindings_scroll(), and xcb.
Referenced by main_loop_x11_event_handler().
int monitor_active | ( | workarea * | mon | ) |
mon | workarea to be filled in. |
Fills in mon with the information about the monitor rofi should show on.
Definition at line 680 of file xcb.c.
References config, mon, Settings::monitor, monitor_active_from_id(), monitor_active_from_winid(), monitor_dimensions(), monitor_get_dimension(), _xcb_stuff::monitors, _workarea::next, and xcb.
Referenced by __create_window(), and config_sanity_check().
|
static |
Definition at line 619 of file xcb.c.
References _xcb_stuff::ewmh, mon, monitor_active_from_id_focused(), monitor_dimensions(), pointer_get(), _xcb_stuff::screen, _xcb_stuff::screen_nbr, _workarea::x, xcb, and _workarea::y.
Referenced by monitor_active().
|
static |
Definition at line 569 of file xcb.c.
References _xcb_stuff::connection, _xcb_stuff::ewmh, _workarea::h, mon, monitor_dimensions(), _xcb_stuff::screen_nbr, _workarea::w, _workarea::x, xcb, and _workarea::y.
Referenced by monitor_active_from_id().
|
static |
Definition at line 545 of file xcb.c.
References _xcb_stuff::connection, _workarea::h, mon, _xcb_stuff::screen, _workarea::w, _workarea::x, xcb, and _workarea::y.
Referenced by monitor_active().
|
static |
Definition at line 507 of file xcb.c.
References _workarea::h, INTERSECT, mon, _xcb_stuff::monitors, _workarea::next, _xcb_stuff::screen, _workarea::w, and xcb.
Referenced by monitor_active(), monitor_active_from_id(), and monitor_active_from_id_focused().
|
static |
Definition at line 491 of file xcb.c.
References _workarea::h, mon, _workarea::monitor_id, _xcb_stuff::monitors, _workarea::next, _xcb_stuff::screen, _workarea::w, and xcb.
Referenced by monitor_active().
|
static |
root | The X11 window used to find the pointer position. Usually the root window. |
x | The x position of the mouse [out] |
y | The y position of the mouse [out] |
find mouse pointer location
Definition at line 530 of file xcb.c.
References _xcb_stuff::connection, and xcb.
Referenced by monitor_active_from_id().
|
static |
Definition at line 1018 of file xcb.c.
References _xcb_stuff::connection, and xcb.
Referenced by display_early_cleanup().
|
static |
Definition at line 1022 of file xcb.c.
References _xcb_stuff::connection, and xcb.
Referenced by display_early_cleanup().
|
static |
state | Internal state of the menu. |
xse | X selection event. |
Handle paste event.
Definition at line 735 of file xcb.c.
References _xcb_stuff::ewmh, rofi_view_handle_text(), window_get_text_prop(), and xcb.
Referenced by main_loop_x11_event_handler_view().
|
static |
Definition at line 991 of file xcb.c.
References _xcb_stuff::connection, and xcb.
Referenced by display_late_setup(), and lazy_grab_keyboard().
|
static |
Definition at line 965 of file xcb.c.
References _xcb_stuff::connection, and xcb.
Referenced by display_late_setup(), and lazy_grab_pointer().
char* window_get_text_prop | ( | xcb_window_t | w, |
xcb_atom_t | atom | ||
) |
w | The xcb_window_t to read property from. |
atom | The property identifier |
Get text property defined by atom from window. Support utf8.
Definition at line 151 of file xcb.c.
References _xcb_stuff::connection, netatoms, rofi_latin_to_utf8_strdup(), and xcb.
Referenced by rofi_view_paste().
void window_set_atom_prop | ( | xcb_window_t | w, |
xcb_atom_t | prop, | ||
xcb_atom_t * | atoms, | ||
int | count | ||
) |
w | The xcb_window_t to set property on |
prop | Atom of the property to change |
atoms | List of atoms to change the property too |
count | The length of the atoms list. |
Set property on window.
Definition at line 176 of file xcb.c.
References _xcb_stuff::connection, count, and xcb.
Referenced by __create_window().
|
static |
Definition at line 336 of file xcb.c.
References _xcb_stuff::connection, _xcb_stuff::monitors, _workarea::next, _workarea::primary, RANDR_PREF_MAJOR_VERSION, RANDR_PREF_MINOR_VERSION, _xcb_stuff::screen, x11_build_monitor_layout_xinerama(), x11_get_monitor_from_output(), x11_is_extension_present(), and xcb.
Referenced by display_setup().
|
static |
Definition at line 300 of file xcb.c.
References _xcb_stuff::connection, _workarea::h, _workarea::monitor_id, _xcb_stuff::monitors, _workarea::next, _workarea::w, _workarea::x, xcb, and _workarea::y.
Referenced by x11_build_monitor_layout().
|
static |
Definition at line 759 of file xcb.c.
Referenced by main_loop_x11_event_handler_view().
|
static |
Definition at line 789 of file xcb.c.
Referenced by main_loop_x11_event_handler_view().
|
static |
Fill in the list of frequently used X11 Atoms.
Definition at line 1048 of file xcb.c.
References _xcb_stuff::connection, netatom_names, netatoms, NUM_NETATOMS, and xcb.
Referenced by display_setup().
|
static |
Definition at line 1205 of file xcb.c.
References _xcb_stuff::connection, depth, map, root_visual, _xcb_stuff::screen, visual, and xcb.
Referenced by display_late_setup().
void x11_disable_decoration | ( | xcb_window_t | window | ) |
window | The X11 window to modify |
Set the right hints to disable the window decoration. (Set MOTIF_WM_HINTS, decoration field)
Definition at line 1350 of file xcb.c.
References _xcb_stuff::connection, flags, netatoms, and xcb.
Referenced by __create_window().
|
static |
Create monitor based on output id
Definition at line 206 of file xcb.c.
References _xcb_stuff::connection, _workarea::h, _workarea::mh, _workarea::mw, _workarea::name, _workarea::w, _workarea::x, xcb, and _workarea::y.
Referenced by x11_build_monitor_layout().
|
static |
Definition at line 1061 of file xcb.c.
References current_window_manager, _xcb_stuff::ewmh, WM_DO_NOT_CHANGE_CURRENT_DESKTOP, WM_PANGO_WORKSPACE_NAMES, xcb, and xcb_stuff_get_root_window().
Referenced by display_setup().
cairo_surface_t* x11_helper_get_bg_surface | ( | void | ) |
Gets a surface containing the background image of the desktop.
Definition at line 139 of file xcb.c.
References _xcb_stuff::connection, get_root_pixmap(), netatoms, root_visual, _xcb_stuff::screen, and xcb.
Referenced by rofi_view_setup_fake_transparency().
cairo_surface_t* x11_helper_get_screenshot_surface | ( | void | ) |
Holds for each supported modifier the possible modifier mask. Check x11_mod_masks[MODIFIER]&mask != 0 to see if MODIFIER is activated.
Definition at line 104 of file xcb.c.
References _xcb_stuff::connection, root_visual, _xcb_stuff::screen, xcb, and xcb_stuff_get_root_window().
Referenced by rofi_view_setup_fake_transparency().
|
static |
Definition at line 287 of file xcb.c.
References _xcb_stuff::connection, and xcb.
Referenced by x11_build_monitor_layout().
|
static |
Free monitor structure.
Definition at line 188 of file xcb.c.
References _workarea::name.
Referenced by x11_monitors_free().
|
static |
Definition at line 194 of file xcb.c.
References _xcb_stuff::monitors, _workarea::next, x11_monitor_free(), and xcb.
Referenced by display_cleanup().
xcb_window_t xcb_stuff_get_root_window | ( | void | ) |
Get the root window.
Definition at line 1310 of file xcb.c.
References _xcb_stuff::screen, and xcb.
Referenced by __create_window(), display_late_setup(), lazy_grab_keyboard(), lazy_grab_pointer(), x11_helper_discover_window_manager(), and x11_helper_get_screenshot_surface().
WindowManagerQuirk current_window_manager = WM_EWHM |
Indicates the current window manager. This is used for work-arounds.
Definition at line 72 of file xcb.c.
Referenced by x11_helper_discover_window_manager().
xcb_depth_t* depth = NULL |
Depth of root window.
Definition at line 90 of file xcb.c.
Referenced by __create_window(), rofi_theme_print_property_index(), rofi_theme_resolve_link_property(), rofi_view_temp_configure_notify(), rofi_view_window_update_size(), and x11_create_visual_and_colormap().
|
static |
X server error depth. to handle nested errors.
Definition at line 1028 of file xcb.c.
Referenced by error_trap_pop(), and error_trap_push().
unsigned int lazy_grab_retry_count_kb = 0 |
Retry count of grabbing keyboard.
Definition at line 1246 of file xcb.c.
Referenced by lazy_grab_keyboard().
unsigned int lazy_grab_retry_count_pt = 0 |
Retry count of grabbing pointer.
Definition at line 1248 of file xcb.c.
Referenced by lazy_grab_pointer().
xcb_colormap_t map = XCB_COLORMAP_NONE |
Color map to use for creating window
Definition at line 92 of file xcb.c.
Referenced by __create_window(), rofi_view_cleanup(), and x11_create_visual_and_colormap().
const char* netatom_names[] = { EWMH_ATOMS ( ATOM_CHAR ) } |
atoms as string
Definition at line 98 of file xcb.c.
Referenced by x11_create_frequently_used_atoms().
xcb_atom_t netatoms[NUM_NETATOMS] |
atoms
Definition at line 97 of file xcb.c.
Referenced by rofi_view_trigger_global_action(), window_get_text_prop(), x11_create_frequently_used_atoms(), x11_disable_decoration(), and x11_helper_get_bg_surface().
|
static |
Visual of the root window.
Definition at line 96 of file xcb.c.
Referenced by x11_create_visual_and_colormap(), x11_helper_get_bg_surface(), and x11_helper_get_screenshot_surface().
xcb_visualtype_t* visual = NULL |
Visual to use for creating window
Definition at line 91 of file xcb.c.
Referenced by __create_window(), rofi_view_temp_configure_notify(), rofi_view_window_update_size(), and x11_create_visual_and_colormap().
Global pointer to xcb_stuff instance.
Definition at line 85 of file xcb.c.
Referenced by __create_window(), config_parse_xresource_options(), display_cleanup(), display_dump_monitor_layout(), display_early_cleanup(), display_setup(), display_startup_notification(), lazy_grab_keyboard(), main(), main_loop_x11_event_handler(), main_loop_x11_event_handler_view(), monitor_active(), monitor_active_from_id(), monitor_active_from_id_focused(), monitor_active_from_winid(), monitor_dimensions(), monitor_get_dimension(), pointer_get(), release_keyboard(), release_pointer(), rofi_view_cleanup(), rofi_view_create(), rofi_view_error_dialog(), rofi_view_hide(), rofi_view_paste(), rofi_view_repaint(), rofi_view_set_selected_line(), rofi_view_temp_configure_notify(), rofi_view_trigger_global_action(), rofi_view_window_update_size(), take_keyboard(), take_pointer(), window_get_text_prop(), window_set_atom_prop(), x11_build_monitor_layout(), x11_build_monitor_layout_xinerama(), x11_create_frequently_used_atoms(), x11_create_visual_and_colormap(), x11_disable_decoration(), x11_get_monitor_from_output(), x11_helper_discover_window_manager(), x11_helper_get_bg_surface(), x11_helper_get_screenshot_surface(), x11_is_extension_present(), x11_monitors_free(), and xcb_stuff_get_root_window().
struct _xcb_stuff xcb_int |