📄 parse_display_cmdline.c
字号:
options->hdmi_active_format_valid = FALSE; options->hdmi_active_format = DH_af_same_as_picture; options->hdmi_bar_top = 0; options->hdmi_bar_bottom = 4096; options->hdmi_bar_left = 0; options->hdmi_bar_right = 4096; options->hdmi_scan = EMhwlibScanInfo_NoData; options->hdmi_spd_vendor = NULL; options->hdmi_spd_product = NULL; options->hdmi_spd_class = DH_source_dev_unknown; options->tmds_threshold = 0; options->tmds_gpio = 0; options->filter_gpio_start = 0; options->filter_gpio_num = 0; options->filter_gpio_val = 0; options->genlock_input = 0; options->genlock_min = 0; options->genlock_max = 0; options->input = 0; options->input_videosource = NULL; options->input_mode = EMhwlibTVStandard_Custom; options->input_timingsignal = EMhwlibDigitalTimingSignal_656; options->input_vvld = FALSE; options->input_bussize = 8; options->input_invv = FALSE; options->input_invh = FALSE; options->input_usev2 = FALSE; options->input_interlaced = TRUE; options->time_interval.Mode = EMhwlibDisplayIntervalMode_None; for (i = 0; i < 2; i++) { options->osd_pictures[i].enable = FALSE; options->osd_pictures[i].filename = NULL; options->osd_pictures[i].alpha_merge = FALSE; options->osd_pictures[i].alpha_filename = NULL; options->osd_pictures[i].dramblock = 0; options->osd_pictures[i].alpha = 128; options->osd_pictures[i].scaler = 0; options->osd_pictures[i].zoom = FALSE; options->osd_pictures[i].color_space = EMhwlibColorSpace_None; options->osd_pictures[i].orientation = FRTop_FCLeft; options->osd_pictures[i].nonlinearmode.Width = 0; options->osd_pictures[i].nonlinearmode.Level = 0; options->osd_pictures[i].blackstrip.Horizontal = 4096; options->osd_pictures[i].blackstrip.Vertical = 4096; options->osd_pictures[i].cutstrip.Horizontal = 0; options->osd_pictures[i].cutstrip.Vertical = 0; set_default_out_window(&(options->osd_pictures[i].source_window)); set_default_out_window(&(options->osd_pictures[i].output_window)); } options->force_DACCompDisable = FALSE; options->DACCompDisable = FALSE; options->force_DACDisable = FALSE; options->DACDisable.DAC1SVideoY = FALSE; options->DACDisable.DAC2SVideoC = FALSE; options->DACDisable.DAC3CVBS = FALSE; options->DACDisable.DAC4Y = FALSE; options->DACDisable.DAC5Cb = FALSE; options->DACDisable.DAC6Cr = FALSE; options->force_LumaChromaDelay = FALSE; options->LumaChromaDelay = EMhwlibLumaChromaDelay_NoDelay; options->force_TripleCVBS = FALSE; options->TripleCVBS = FALSE; options->force_LineCrop = FALSE; options->LineCrop.CropLeftPos = 0; options->LineCrop.CropRightPos = 4095; options->LineCrop.ColorSpace = options->color_space; options->LineCrop.CropControl = FALSE; options->gamma_table = 0; options->disable_pixel_timer = FALSE; options->hdmi_convert = FALSE; options->hdmi_color_space = EMhwlibColorSpace_None; options->hdmi_sampling_mode = EMhwlibSamplingMode_444; options->hdmi_component_depth = 8; options->downscalingmode.Discard = FALSE; options->downscalingmode.FilterBoundary[0] = 384; options->downscalingmode.FilterBoundary[1] = 256; options->downscalingmode.FilterBoundary[2] = 128; options->filtermode.Boundary_0_1 = 0x1400; options->filtermode.Boundary_1_2 = 0x1c00; options->filtermode.Boundary_2_3 = 0x2c00; return RM_OK;}void show_display_options(void){ fprintf(stderr, "DISPLAY OPTIONS (default values inside brackets)\n" "\t-no_disp: do not configure the outports\n" "Select the video timing mode with either -f, -r or -vmf\n" "\t-f standard: Sets output format, default is NTSC_M"); PrintTVStandardNames(); fprintf(stderr, "\n" "\t\tedid (to use preferred standard from EDID info)\n" "\t-edmode <width> <height> <vfreq> <interlaced>: use closest matching EDID short descriptor\n" "\t-r <resolution>: shortcut for -edmode, to set common video resolutions: [pref]=EDID preferred, \n" "\t\t480i[59], 480i60, 480p[59], 480p60, 576i[50], 576p[50], 720p50, 720p[59], 720p60, \n" "\t\t1080i50, 1080i[59], 1080i60, 1080p23, 1080p24, 1080p50, 1080p[59], 1080p60, vga, <VIC>\n" "\t-edforce: Force the mode selected by -edmode/-r, independent of display support\n" "\t-vmf <filename.vmf>: specify a filename with a video mode line, used instead of -f options\n" "\t\tWARNING: Incorrect values in the .vmf file can cause damage to the monitor or TV!\n" "\t\tSigma Designs is not responsible for any such damage.\n" "\t-vgaf standard: sets output format for VGA/DVI output separately \n" "\t\tfrom analog out\n" "\t-bcsh <brightness> <contrast> <saturation> <hue>: Set on all outputs, default: [0 128 128 0]\n" "\t-bcssh <brightness> <contrast> <saturation Cb> <saturation Cr> <hue>: Set on all outputs, default: [0 128 128 128 0]\n" "\t\tb: -128..127, c,s: 0..255, h: -64..64\n" "\t-cs colorspace: Sets the output colorspace. [YCC601]\n" "\t-mcs colorspace: Sets the mixer colorspace. [none]\n" "\t-ocs colorspace: Sets the OSD source colorspace [none]\n" "\tColorspaces:\n" "\t\tlimited range (black at 16, white at 235): RGBl, YCC601, YCC709, extended gamut: xvYCC601, xvYCC709\n" "\t\tfull range (black at 0, white at 255): RGB, YCC601f, YCC709f, extended gamut: xvYCC601f, xvYCC709f\n" "\t-sm mode : Sets display scaling mode [letterBox] panScan ARIB\n" "\t-asp x y: Sets display aspect ratio (x y in [0-255] range) [4 3]\n" "\t\t(0 0 means that the source aspect ratio is used for the display\n" "\t\taspect ratio (used with WSS).\n" "\t-afd <active format>: designate the portion of the screen containing actual picture information:\n" "\t\t[none], full, 16x9top, 14x9top, 64x27, 4x3, 16x9, 14x9, 4x3_14x9, 16x9_14x9, 16x9_4x3\n" "\t\tThe last 3 are optional clipping formats, e.g. the last is a 16x9 format that could be cropped to 4x3\n" "\t-zoom x y w h: Selects the input window to display [0 0 width height]\n" "\t-window x y w h: Selects the output window to display [0 0 width height] \n" "\t\tall zoom values: 0..4095: absolute pixel, 4096..8192: 0%%..100%% relative size\n" "\t-o output: Selects the output (shortcuts in brackets)\n" "\t\t[svideo] composite(cvbs) dvi_8 dvi_16 dvi_24(hdmi,dvi) dig_8 dig_16 dig_24 lvds\n" "\t\tvga scart component_rgb_scart component_rgb_sog component_rgb_smpte\n" "\t\tcomponent_yuv_betacam component_yuv_m2 component_yuv_smpte(cav)\n" "\t-dc <depth>: Select the color component bit depth for deep color: [8], 10, 12\n" "\t-dvi_hdmi [siI164] siI170 siI9030 siI9034 siI9134 anx9030 lvds none - Selects supported DVI/HDMI chip\n" "\t-hdmi_cec <chip> [<int gpio> <cec_d gpio>] - Set up CEC communication on the HDMI interface (gpios for MCX board: 15 49)\n" "\t\tchip: [auto] 86xx SiI9181 SiI9185\n" "\t-hdmi state - Force HDMI (AVI info frames and audio) or DVI mode (no AVI/audio), state is optional: [1] 0\n" "\t-hdcp - Enable HDCP (only valid on siI170 and siI9030 DVI chip)\n" "\t-edid - Display EDID information of the TV/Monitor\n" "\t-ed n: use video format from EDID short descriptor number 'n'\n" "\t\t(instead of detailed descriptor with '-f edid')\n" "\t-edid_exclude <mode>: exclude certain video mode from being used with EDID\n" "\t-edid_force <mode>: force certain video modes to be used with EDID, if available in the display\n" "\t\t<mode> can be either of: 24hz 25hz 30hz 50hz 60hz 100hz 120hz 200hz 240hz 4x3 16x9 \n" "\t\tsd ed hd 480i 480p 576i 576p 720p 1080i 1080p (sd = 480i, 576i, ed = 480p, 576p, hd = 720p, 1080i, 1080p)\n" "\t\tmultiple specifications of -edid_exclude and -edid_force are possible.\n" "\t-edid_limits <min_pix> <max_pix> <min_hfreq> <max_hfreq> <min_vfreq> <max_vfreq>: limit EDID mode\n" "\t\tdetection to the range specified. all values in Hz. use 0 to disable a range limit.\n" "\t\tIf all exclusions and limits leave no mode available, 640x480p will be used.\n" "\t-edwrite <filename>: write data from file (binary, multiple of 128 bytes) to display's EDID EEPROM\n" "\t-edread <filename>: read data from display's EDID and write to a binary file\n" "\t-force_edid <filename>: use EDID data from the specified file instead of the display's EDID\n" "\t-hdmi_de: Generate DE signal by HDMI chip instead of using the one from 86xx digital out\n" "\t-hdmi_act <active format>: designate the portion of the screen containing actual picture information:\n" "\t\t[none], full, 16x9top, 14x9top, 64x27, 4x3, 16x9, 14x9, 4x3_14x9, 16x9_14x9, 16x9_4x3\n" "\t\tThe last 3 are optional clipping formats, e.g. the last is a 16x9 format that could be cropped to 4x3\n" "\t-hdmi_bars <top> <bottom> <left> <right>: designate filler bars on the screen, 0..4096:\n" "\t\ttop:end of horizontal bar at top [0], bottom: start of horizontal bar at bottom [4096]\n" "\t\tleft:end of vertical bar at left [0], right: start of vertical bar at right [4096]\n" "\t-hdmi_scan [under|over]: tag picture as underscanned (computer) or overscanned (video)\n" "\t-hdmi_spd Vendor Product [<class>]: Send HDMI SPD info frame, identifying source product\n" "\t\tclass: STB, DVD, DVHS, HDD, DVC, DSC, VCD, Game, PC, BluRay, SACD\n" "\t-tmds_mode <gpio> <threshold>: Set GPIO pin 'gpio' to 1 when HDMI pixel clock is above 'threshold' MHz\n" "\t-hdmi2c n [speed]: use I2C module 'n' for DVI/HDMI init (0=software, [1]=hardware, 2=built-in hdmi)\n" "\t\tspeed: optional, I2C bus speed in kHz, default: 100\n" "\t-hdmi_ddc_tx: use same I2C bus for DDC and Tx-Chip access (on some standalone boards)\n" "\t-dvi_reset <GPIO>: use a GPIO pin to reset DVI chip [0](disabled) (use 4 or 11 on some standalone boards)\n" "\t-agc_version level: Sets the macrovision version [0] 1\n" "\t-agc level: Sets the macrovision level [0] 1 2 3\n" "\t-aps level: Sets the aps level [0] 1 2 3\n" "\t-cgmsa level: Sets the cgms level [0] 1 2 3\n" "\t-rcd: Sets the rcd bit [0] 1 \n" "\t-asb: Sets the asb bit [0] 1 \n" "\t-vscaler scaler_index: Selects the scaler to use to display the video\n" "\tPossible values: 'mv', 'vcr', 'gfx')" "\t-route main vcr cb: Selects the display route to use. Default: selected by application\n" "\t-va video_alpha_level (0..255) [128]\n"#ifndef WITH_MONO "\t-b osd_bitmap_filename: Displays an OSD bitmap at the same time\n" "\t-ba alpha_bitmap_filename: 8bpp-alpha bitmap to be merged with osd\n" "\t-vgab osd_bitmap_filename: Displays an OSD bitmap on the seconday\n" "\t\toutput (VGA)\n" "\t-oa osd_alpha_level (0..255) [128]\n" "\t-ozoom x y w h: Selects the osd input window to display [0 0 width height] \n" "\t-owindow x y w h: Selects the osd output window to display [0 0 width height] \n" "\t-odump <directory>: dumps bitmap.bin, dvi.bin and userpref.bin in\n" "\t\the specified directory.\n" "\t-oscaler scaler_name: Selects the scaler to use to display the osd image.\n"#endif "\tPossible values: 'osd', 'gfx', 'mv'"#ifdef RMFEATURE_HAS_VCR_SCALER " ,'vcr'"#endif#ifdef RMFEATURE_HAS_SPU_SCALER " ,'spu'"#endif#ifdef RMFEATURE_HAS_VIDEO_PLANE " ,'vp'"#endif "\n " "\t-lock_scaler <scaler>: lock the scaling mode to the given scaler. [none] vcr gfx crt osd spu mv\n" "\t-vgadram: put secondary output bitmap into second DRAM bank\n" "\t-hwc: Displays Sigma logo using the hardware cursor\n" "\t-swap order: swaps the output's color component order [rgb] rbg grb\n" "\t\tgbr brg bgr\n" "\t-fs type: Selects the field selection algorithm\n" "\t\t[type] : to select the input field ID that matches the output field ID\n" "\t\ttime: to select the input field the most time accurate\n" "\t\tone: to select only one field per frame\n" "\t-strips h v : Sets display horizontal and vertical black strip mode\n" "\t\t(h v in [0-4096] range) [4096 4096]\n" "\t-cutstrips h v : Sets display horizontal and vertical cut strip mode\n" "\t\t(h v in [0-4096] range) [4096 4096]\n" "\t-nonlin w l: select non-linear scaling width (0..3) and level (0..3) [0 0]\n" "\t\tNote: also specify '-strips 4096 0' or -nonlin will have no visible effect!\n" "\t-stripcolor <color>: Select the color of the filler strips [black]\n" "\t\tRGB color: #RRGGBB (hex), YCbCr601 color: <Y>/<Cb>/<Cr>, or some color names.\n" "\t-D mode: selects the deinterlacing mode\n" "\t\t0: Bob - no deinterlacing\n" "\t\t1: modulated Weave (obsolete)\n" "\t\t2: motion adaptative\n" "\t\t3: Weave\n" "\t-32pd: enables the 3:2 pulldown. Is only active in case of motion adaptative deinterlacing [disable]\n" "\t-motion_config config: configures the motion deinterlacer format:V16V8V4V0\n" "\t-d2_proportion config: configures the existing vs new field proportion in deinterlacing type 2:0xEFNF\n" "\t-disp_init: force reinitialisation of the display\n" "\t-cdb <boundary>: sets the color degradation boundary (0..512) [0]\n" "\t-dp <protocol>: sets the protocol on the digital output (601, 656, vip) [601]\n" "\t-dig_dr [0|1] : Forces whether to use the DoubleRate feature or not. Default: on for HDMI 480i/576i modes\n" "\t-dclk: don't invert the digital video clock (inverted by default)\n" "\t-ddr: use double data rate mode on the digital out (data on both edges of the clock)\n" "\t-ddr_delay: set a DDR data delay (0..7) [2] -- Obsolete, use -dig_delay instead!\n" "\t-dig_no_delay: disable the 400 pSec data delay in non-DDR mode -- Obsolete, use -dig_delay instead!\n" "\t-dig_delay <n>: set a data delay of n picoseconds in both, DDR and non-DDR modes [2300/400]\n" "\t-dig_clip: range clip of digital output values: 0=no clipping, [1]=1..254, 16=16..235\n" "\t-dig_rbg: swap green/Y and blue/Cb component on digital output\n" "\t-inv_cap_clk: invert the capture clock, when external H- and V-Sync is used for the digital sync.\n" "\t-vsync_delay: delay the VSync on the digital output port by one pixel clock\n" "\t-trailing_edge: enable the field ID logic on the HSync trailing edge of the digital output\n" "\t-chroma_sync <EIA|SMPTE>: sync on Pb/Pr of component output: EIA = no sync present (default), SMPTE = sync embedded\n" "\t-scart_en <0|1> <pio> <inv>: disable/standby (0) or enable (1) the SCART\n" "\t\tdisplay. pio is optional, defaults to 13. inv is optional, whether to\n" "\t\tinvert the pio polarity or not.\n" "\t-scart_ws <0|1|a> <pio> <inv>: signal 4:3 (0) or 16:9 (1) or automatic (a) aspect ratio to\n" "\t\tthe SCART connector. pio is optional, defaults to 14. inv is optional,\n" "\t\twhether to invert the pio polarity or not\n"#ifdef RMFEATURE_HAS_HDSD_CONVERTER "\t-sdf [<standard>]: Enable HD->SD conversion and set the specified SD format, or auto-detect PAL/NTSC from HDTV frame rate if no parameter\n" "\t-sdf50 <standard>: video mode to be used for auto detection, 50 Hz [PAL_BG] (needs -sdf option)\n" "\t-sdf60 <standard>: video mode to be used for auto detection, 59.94 and 60 Hz [NTSC_M] (needs -sdf option)\n" "\t-sdbuf: Forces the buffered HD->SD conversion mode (needs -sdf option)\n" "\t-sdotf: Forces the 'on-the-fly' HD->SD conversion mode (needs -sdf option)\n" "\t-sdcav: Sets the SD standard on the component output, when HD->SD conversion is enabled (needs -sdf option)\n" "\t-hdcav: Allows 1080p to be used on the component output, when HD->SD conversion is enabled (default: up to 1080i)\n" "\t-sdasp x y: Sets display aspect ratio for the SD output when HD->SD conversion is enabled\n" "\t\t(x y in [0-255] range) [4 3]\n"#endif "\t-genlock <v|g> [<min> <max>]: Enable genlocking, sync source is either VideoIn (v) or GraphicIn (g).\n" "\t\tmin, max: target phase range, 0..255 (256 = 360 degrees)\n" "\t-input <v|g|v2|g2> <bus size> [<656|601|601v> <input standard> [invv] [invh]]: \n" "\t\tSet up dummy mode on video or graphic input, for genlock.\n" "\t-time_interval <start-end>: defines the time interval to play\n" "\t-dac_comp <enable>: enable or disable DAC compensation on the component output, disable: 0, enable: 1 [1]\n" "\t-gamma <n>: Select gamma table <n>: [0]=no gama correction, 1=neutral, 2=experimental, 3=inverse\n" "\t-lumakey <min> <max>: set the luma key range [0xff 0x00]\n" "\t-dis_pix_timer: disable timer-based pixel clock correction (enabled by default, on SMP8634 only)\n" "\t-hdmi_convert <colorspace> <422:444> <bits per component>: convert the 86xx video to a different format on the HDMI output\n" "\t-filter_gpio <gpio> <num> <value>: Sets the <value> on <num> GPIO pins, starting at GPIO <gpio> (LSB first)\n" "\t-luma_lpf <filter_no>: Forces a low pass luma filter applied to the luma. Possible values are 0 1 2 3 and auto.\n" "\t-mv_filter <filter_no>: Forces the type of filter applied to luma and chroma. Possible values are 0 1 2 3 and auto.\n" ); /* If you add or modify options here, please update the documentation at: http://bugs.soft.sdesigns.com/twiki/bin/view/Main/UsageDisplay */}static RMstatus parse_hdmi_mask(RMascii *arg, RMuint64 *mask_res, RMuint64 *mask_vfreq, RMuint64 *mask_asp){ if (RMCompareAscii(arg, "24hz")) *mask_vfreq |= CEA861_MASK_24HZ; else if (RMCompareAscii(arg, "25hz")) *mask_vfreq |= CEA861_MASK_25HZ; else if (RMCompareAscii(arg, "30hz")) *mask_vfreq |= CEA861_MASK_30HZ; else if (RMCompareAscii(arg, "50hz")) *mask_vfreq |= CEA861_MASK_50HZ; else if (RMCompareAscii(arg, "60hz")) *mask_vfreq |= CEA861_MASK_60HZ; else if (RMCompareAscii(arg, "100hz")) *mask_vfreq |= CEA861_MASK_100HZ; else if (RMCompareAscii(arg, "120hz")) *mask_vfreq |= CEA861_MASK_120HZ; else if (RMCompareAscii(arg, "200hz")) *mask_vfreq |= CEA861_MASK_200HZ; else if (RMCompareAscii(arg, "240hz")) *mask_vfreq |= CEA861_MASK_240HZ; else if (RMCompareAscii(arg, "4x3")) *mask_asp |= CEA861_MASK_4x3; else if (RMCompareAscii(arg, "16x9")) *mask_asp |= CEA861_MASK_16x9; else if (RMCompareAscii(arg, "vga")) *mask_res |= CEA861_MASK_VGA; else if (RMCompareAscii(arg, "sd")) *mask_res |= CEA861_MASK_SD; else if (RMCompareAscii(arg, "ed")) *mask_res |= CEA861_MASK_ED; else if (RMCompareAscii(arg, "hd")) *mask_res |= CEA861_MASK_HD; else if (RMCompareAscii(arg, "480i")) *mask_res |= CEA861_MASK_480I; else if (RMCompareAscii(arg, "480p")) *mask_res |= CEA861_MASK_480P; else if (RMCompareAscii(arg, "576i")) *mask_res |= CEA861_MASK_576I; else if (RMCompareAscii(arg, "576p")) *mask_res |= CEA861_MASK_576P; else if (RMCompareAscii(arg, "720p")) *mask_res |= CEA861_MASK_720P; else if (RMCompareAscii(arg, "1080i")) *mask_res |= CEA861_MASK_1080I; else if (RMCompareAscii(arg, "1080p")) *mask_res |= CEA861_MASK_1080P; else return RM_ERROR; return RM_OK;}static RMstatus parse_color_space(RMascii *arg, enum EMhwlibColorSpace *pColorSpace){ RMstatus err = RM_OK; if (RMCompareAsciiCaseInsensitively(arg, "none")) { *pColorSpace = EMhwlibColorSpace_None; // backwards compatibility } else if (RMCompareAscii(arg, "yuv_601")) { *pColorSpace = EMhwlibColorSpace_YUV_601; } else if (RMCompareAscii(arg, "yuv_709")) { *pColorSpace = EMhwlibColorSpace_YUV_709; } else if (RMCompareAscii(arg, "xv_601")) { *pColorSpace = EMhwlibColorSpace_xvYCC_601; } else if (RMCompareAscii(arg, "xv_709")) { *pColorSpace = EMhwlibColorSpace_xvYCC_709; } else if (RMCompareAscii(arg, "rgb_0_255")) { *pColorSpace = EMhwlibColorSpace_RGB_0_255; } else if (RMCompareAscii(arg, "rgb_16_235")) { *pColorSpace = EMhwlibColorSpace_RGB_16_235; // new notation } else if (RMCompareAsciiCaseInsensitively(arg, "YCC601")) { *pColorSpace = EMhwlibColorSpace_YUV_601; } else if (RMCompareAsciiCaseInsensitively(arg, "YCC601f")) { *pColorSpace = EMhwlibColorSpace_YUV_601_0_255; } else if (RMCompareAsciiCaseInsensitively(arg, "YCC709")) { *pColorSpace = EMhwlibColorSpace_YUV_709; } else if (RMCompareAsciiCaseInsensitively(arg, "YCC709f")) { *pColorSpace = EMhwlibColorSpace_YUV_709_0_255; } else if (RMCompareAsciiCaseInsensitively(arg, "xvYCC601")) { *pColorSpace = EMhwlibColorSpace_xvYCC_601; } else if (RMCompareAsciiCaseInsensitively(arg, "xvYCC601f")) { *pColorSpace = EMhwlibColorSpace_xvYCC_601_0_255; } else if (RMCompareAsciiCaseInsensitively(arg, "xvYCC709")) { *pColorSpace = EMhwlibColorSpace_xvYCC_709; } else if (RMCompareAsciiCaseInsensitively(arg, "xvYCC709f")) { *pColorSpace = EMhwlibColorSpace_xvYCC_709_0_255; } else if (RMCompareAsciiCaseInsensitively(arg, "RGB")) { *pColorSpace = EMhwlibColorSpace_RGB_0_255; } else if (RMCompareAsciiCaseInsensitively(arg, "RGBl")) { *pColorSpace = EMhwlibColorSpace_RGB_16_235; } else { err = RM_ERROR; } return err;}// returns TRUE if 'ch' is not the first char of another option, or potential filenamestatic RMbool opt_arg(RMascii ch) { return (ch != '-') && (ch != '.') && (ch != '/') && (ch != '\\') && (ch != '_');}RMstatus parse_display_cmdline(int argc, char **argv, int *index, struct display_cmdline *options){ RMstatus err = RM_PENDING; int i = *index; RMuint32 j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -