From 1a3e64db390deb23981d177bdbcc4c1a476865d3 Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Mon, 23 Mar 2020 07:58:54 -0700 Subject: [PATCH] wslua: Update the GUI docs. Add content from https://wiki.wireshark.org/LuaAPI/GUI and update as needed. Separate some of our Asciidoctor output with newlines. Change-Id: I2b8b9449c94bd69095fbd4b65ea415cd4d525c30 Reviewed-on: https://code.wireshark.org/review/36613 Reviewed-by: Gerald Combs Petri-Dish: Gerald Combs Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- docbook/make-wsluarm.pl | 1 + docbook/wsdg_graphics/wslua-new-dialog.png | Bin 0 -> 21786 bytes docbook/wsdg_graphics/wslua-progdlg.png | Bin 0 -> 12695 bytes docbook/wsdg_graphics/wslua-textwindow.png | Bin 0 -> 26843 bytes epan/wslua/wslua_gui.c | 318 ++++++++++++++++----- 5 files changed, 255 insertions(+), 64 deletions(-) create mode 100644 docbook/wsdg_graphics/wslua-new-dialog.png create mode 100644 docbook/wsdg_graphics/wslua-progdlg.png create mode 100644 docbook/wsdg_graphics/wslua-textwindow.png diff --git a/docbook/make-wsluarm.pl b/docbook/make-wsluarm.pl index 785787aecb..635a5272c5 100755 --- a/docbook/make-wsluarm.pl +++ b/docbook/make-wsluarm.pl @@ -250,6 +250,7 @@ sub print_desc { for my $line ( @{ $desc_ref } ) { printf D "%s", $line; } + printf D "\n"; } my %module = (); diff --git a/docbook/wsdg_graphics/wslua-new-dialog.png b/docbook/wsdg_graphics/wslua-new-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..9de7e4a9f821056fb3f4df8fd7f47bb4bb761391 GIT binary patch literal 21786 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 dlH2%XCJaB>Lwyx2QlIzeX{|7ODLv8>7 literal 0 HcmV?d00001 diff --git a/docbook/wsdg_graphics/wslua-progdlg.png b/docbook/wsdg_graphics/wslua-progdlg.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d95101d180aec938835e8479369c044275b7dd GIT binary patch literal 12695 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 literal 0 HcmV?d00001 diff --git a/epan/wslua/wslua_gui.c b/epan/wslua/wslua_gui.c index 04033c5c01..600935052f 100644 --- a/epan/wslua/wslua_gui.c +++ b/epan/wslua/wslua_gui.c @@ -31,9 +31,9 @@ static int menu_cb_error_handler(lua_State* L) { return 0; } -WSLUA_FUNCTION wslua_gui_enabled(lua_State* L) { /* Checks whether the GUI facility is enabled. */ +WSLUA_FUNCTION wslua_gui_enabled(lua_State* L) { /* Checks if we're running inside a GUI (i.e. Wireshark) or not. */ lua_pushboolean(L,GPOINTER_TO_INT(ops && ops->add_button)); - WSLUA_RETURN(1); /* A boolean: true if it is enabled, false if it isn't. */ + WSLUA_RETURN(1); /* Boolean `true` if a GUI is available, `false` if it isn't. */ } static void lua_menu_callback(gpointer data) { @@ -61,24 +61,24 @@ static void lua_menu_callback(gpointer data) { return; } -WSLUA_FUNCTION wslua_register_menu(lua_State* L) { /* Register a menu item in one of the main menus. */ -#define WSLUA_ARG_register_menu_NAME 1 /* The name of the menu item. The submenus are to be separated by '`/`'s. (string) */ -#define WSLUA_ARG_register_menu_ACTION 2 /* The function to be called when the menu item is invoked. (function taking no arguments and returning nothing) */ -#define WSLUA_OPTARG_register_menu_GROUP 3 /* The menu group into which the menu item is to be inserted. If omitted, defaults to MENU_STAT_GENERIC. One of: - * MENU_STAT_UNSORTED (Statistics), - * MENU_STAT_GENERIC (Statistics, first section), - * MENU_STAT_CONVERSATION (Statistics/Conversation List), - * MENU_STAT_ENDPOINT (Statistics/Endpoint List), - * MENU_STAT_RESPONSE (Statistics/Service Response Time), - * MENU_STAT_TELEPHONY (Telephony), - * MENU_STAT_TELEPHONY_ANSI (Telephony/ANSI), - * MENU_STAT_TELEPHONY_GSM (Telephony/GSM), - * MENU_STAT_TELEPHONY_LTE (Telephony/LTE), - * MENU_STAT_TELEPHONY_MTP3 (Telephony/MTP3), - * MENU_STAT_TELEPHONY_SCTP (Telephony/SCTP), - * MENU_ANALYZE (Analyze), - * MENU_ANALYZE_CONVERSATION (Analyze/Conversation Filter), - * MENU_TOOLS_UNSORTED (Tools). (number) */ +WSLUA_FUNCTION wslua_register_menu(lua_State* L) { /* Register a menu item in one of the main menus. Requires a GUI. */ +#define WSLUA_ARG_register_menu_NAME 1 /* The name of the menu item. Use slashes to separate submenus. (e.g. menu:Lua Scripts[My Fancy Statistics]). (string) */ +#define WSLUA_ARG_register_menu_ACTION 2 /* The function to be called when the menu item is invoked. The function must take no arguments and return nothing. */ +#define WSLUA_OPTARG_register_menu_GROUP 3 /* Where to place the item in the menu hierarchy. If omitted, defaults to MENU_STAT_GENERIC. One of: + * MENU_STAT_UNSORTED: menu:Statistics[] + * MENU_STAT_GENERIC: menu:Statistics[], first section + * MENU_STAT_CONVERSATION: menu:Statistics[Conversation List] + * MENU_STAT_ENDPOINT: menu:Statistics[Endpoint List] + * MENU_STAT_RESPONSE: menu:Statistics[Service Response Time] + * MENU_STAT_TELEPHONY: menu:Telephony[] + * MENU_STAT_TELEPHONY_ANSI: menu:Telephony[ANSI] + * MENU_STAT_TELEPHONY_GSM: menu:Telephony[GSM] + * MENU_STAT_TELEPHONY_LTE: menu:Telephony[LTE] + * MENU_STAT_TELEPHONY_MTP3: menu:Telephony[MTP3] + * MENU_STAT_TELEPHONY_SCTP: menu:Telephony[SCTP] + * MENU_ANALYZE: menu:Analyze[] + * MENU_ANALYZE_CONVERSATION: menu:Analyze[Conversation Filter] + * MENU_TOOLS_UNSORTED: menu:Tools[] */ const gchar* name = luaL_checkstring(L,WSLUA_ARG_register_menu_NAME); struct _lua_menu_data* md; @@ -206,10 +206,38 @@ static void text_win_close_cb(void* data) { } -WSLUA_FUNCTION wslua_new_dialog(lua_State* L) { /* Pops up a new dialog */ -#define WSLUA_ARG_new_dialog_TITLE 1 /* Title of the dialog's window. */ -#define WSLUA_ARG_new_dialog_ACTION 2 /* Action to be performed when OK'd. */ -/* WSLUA_MOREARGS new_dialog A series of strings to be used as labels of the dialog's fields. */ +WSLUA_FUNCTION wslua_new_dialog(lua_State* L) { /* + Displays a dialog, prompting for input. The dialog includes an btn:[OK] button and btn:[Cancel] button. Requires a GUI. + + .An input dialog in action + image::wsdg_graphics/wslua-new-dialog.png[{small-screenshot-attrs}] + + ===== Example + + [source,lua] + ---- + if not gui_enabled() then return end + + -- Prompt for IP and port and then print them to stdout + local label_ip = "IP address" + local label_port = "Port" + local function print_ip(ip, port) + print(label_ip, ip) + print(label_port, port) + end + new_dialog("Enter IP address", print_ip, label_ip, label_port) + + -- Prompt for 4 numbers and then print their product to stdout + new_dialog( + "Enter 4 numbers", + function (a, b, c, d) print(a * b * c * d) end, + "a", "b", "c", "d" + ) + ---- + */ +#define WSLUA_ARG_new_dialog_TITLE 1 /* The title of the dialog. */ +#define WSLUA_ARG_new_dialog_ACTION 2 /* Action to be performed when the user presses btn:[OK]. */ +/* WSLUA_MOREARGS new_dialog Strings to be used a labels of the dialog's fields. Each string creates a new labeled field. The first field is required. */ const gchar* title; int top = lua_gettop(L); @@ -273,13 +301,81 @@ WSLUA_FUNCTION wslua_new_dialog(lua_State* L) { /* Pops up a new dialog */ WSLUA_RETURN(0); } +WSLUA_CLASS_DEFINE(ProgDlg,FAIL_ON_NULL("ProgDlg")); +/* + Creates and manages a modal progress bar. + This is intended to be used with + http://lua-users.org/wiki/CoroutinesTutorial[coroutines], + where a main UI thread controls the progress bar dialog while a background coroutine (worker thread) yields to the main thread between steps. + The main thread checks the status of the btn:[Cancel] button and if it's not set, returns control to the coroutine. + .A progress bar in action + image::wsdg_graphics/wslua-progdlg.png[{medium-screenshot-attrs}] -WSLUA_CLASS_DEFINE(ProgDlg,FAIL_ON_NULL("ProgDlg")); /* Manages a progress bar dialog. */ + The legacy (GTK+) user interface displayed this as a separate dialog, hence the “Dlg” suffix. + The Qt user interface shows a progress bar inside the main status bar. +*/ -WSLUA_CONSTRUCTOR ProgDlg_new(lua_State* L) { /* Creates a new `ProgDlg` progress dialog. */ -#define WSLUA_OPTARG_ProgDlg_new_TITLE 2 /* Title of the new window, defaults to "Progress". */ -#define WSLUA_OPTARG_ProgDlg_new_TASK 3 /* Current task, defaults to "". */ +WSLUA_CONSTRUCTOR ProgDlg_new(lua_State* L) { /* + Creates and displays a new `ProgDlg` progress bar with a btn:[Cancel] button and optional title. + It is highly recommended that you wrap code that uses a `ProgDlg` instance because it does not automatically close itself upon encountering an error. + Requires a GUI. + + ===== Example + + [source,lua] + ---- + if not gui_enabled() then return end + + local p = ProgDlg.new("Constructing", "tacos") + + -- We have to wrap the ProgDlg code in a pcall in case some unexpected + -- error occurs. + local ok, errmsg = pcall(function() + local co = coroutine.create( + function() + local limit = 100000 + for i=1,limit do + print("co", i) + coroutine.yield(i/limit, "step "..i.." of "..limit) + end + end + ) + + -- Whenever coroutine yields, check the status of the cancel button to determine + -- when to break. Wait up to 20 sec for coroutine to finish. + local start_time = os.time() + while coroutine.status(co) ~= 'dead' do + local elapsed = os.time() - start_time + + -- Quit if cancel button pressed or 20 seconds elapsed + if p:stopped() or elapsed > 20 then + break + end + + local res, val, val2 = coroutine.resume(co) + if not res or res == false then + if val then + debug(val) + end + print('coroutine error') + break + end + + -- show progress in progress dialog + p:update(val, val2) + end + end) + + p:close() + + if not ok and errmsg then + report_failure(errmsg) + end + ---- +*/ +#define WSLUA_OPTARG_ProgDlg_new_TITLE 1 /* Title of the progress bar. Defaults to "Progress". */ +#define WSLUA_OPTARG_ProgDlg_new_TASK 2 /* Optional task name, which will be appended to the title. Defaults to the empty string (""). */ ProgDlg pd = (ProgDlg)g_malloc(sizeof(struct _wslua_progdlg)); pd->title = g_strdup(luaL_optstring(L,WSLUA_OPTARG_ProgDlg_new_TITLE,"Progress")); pd->task = g_strdup(luaL_optstring(L,WSLUA_OPTARG_ProgDlg_new_TASK,"")); @@ -298,9 +394,9 @@ WSLUA_CONSTRUCTOR ProgDlg_new(lua_State* L) { /* Creates a new `ProgDlg` progres WSLUA_RETURN(1); /* The newly created `ProgDlg` object. */ } -WSLUA_METHOD ProgDlg_update(lua_State* L) { /* Appends text. */ -#define WSLUA_ARG_ProgDlg_update_PROGRESS 2 /* Part done ( e.g. 0.75 ). */ -#define WSLUA_OPTARG_ProgDlg_update_TASK 3 /* Current task, defaults to "". */ +WSLUA_METHOD ProgDlg_update(lua_State* L) { /* Sets the progress dialog's progress bar position based on percentage done. */ +#define WSLUA_ARG_ProgDlg_update_PROGRESS 2 /* Progress value, e.g. 0.75. Value must be between 0.0 and 1.0 inclusive. */ +#define WSLUA_OPTARG_ProgDlg_update_TASK 3 /* Task name. Currently ignored. Defaults to empty string (""). */ ProgDlg pd = checkProgDlg(L,1); double pr = lua_tonumber(L,WSLUA_ARG_ProgDlg_update_PROGRESS); const gchar* task = luaL_optstring(L,WSLUA_OPTARG_ProgDlg_update_TASK,""); @@ -328,17 +424,17 @@ WSLUA_METHOD ProgDlg_update(lua_State* L) { /* Appends text. */ return 0; } -WSLUA_METHOD ProgDlg_stopped(lua_State* L) { /* Checks whether the user has pressed the stop button. */ +WSLUA_METHOD ProgDlg_stopped(lua_State* L) { /* Checks whether the user has pressed the btn:[Cancel] button. */ ProgDlg pd = checkProgDlg(L,1); lua_pushboolean(L,pd->stopped); - WSLUA_RETURN(1); /* true if the user has asked to stop the progress. */ + WSLUA_RETURN(1); /* Boolean `true` if the user has asked to stop the operation, `false` otherwise. */ } -WSLUA_METHOD ProgDlg_close(lua_State* L) { /* Closes the progress dialog. */ +WSLUA_METHOD ProgDlg_close(lua_State* L) { /* Hides the progress bar. */ ProgDlg pd = checkProgDlg(L,1); if (!ops->destroy_progress_window) { @@ -404,14 +500,51 @@ int ProgDlg_register(lua_State* L) { -WSLUA_CLASS_DEFINE(TextWindow,FAIL_ON_NULL_OR_EXPIRED("TextWindow")); /* Manages a text window. */ +WSLUA_CLASS_DEFINE(TextWindow,FAIL_ON_NULL_OR_EXPIRED("TextWindow")); /* + + Creates and manages a text window. + The text can be read-only or editable, and buttons can be added below the text. + + .A text window in action + image::wsdg_graphics/wslua-textwindow.png[{medium-screenshot-attrs}] +*/ /* XXX: button and close callback data is being leaked */ /* XXX: lua callback function and TextWindow are not garbage collected because they stay in LUA_REGISTRYINDEX forever */ -WSLUA_CONSTRUCTOR TextWindow_new(lua_State* L) { /* Creates a new `TextWindow` text window. */ -#define WSLUA_OPTARG_TextWindow_new_TITLE 1 /* Title of the new window. */ +WSLUA_CONSTRUCTOR TextWindow_new(lua_State* L) { /* + Creates a new `TextWindow` text window and displays it. + Requires a GUI. + + ===== Example + + [source,lua] + ---- + if not gui_enabled() then return end + + -- create new text window and initialize its text + local win = TextWindow.new("Log") + win:set("Hello world!") + + -- add buttons to clear text window and to enable editing + win:add_button("Clear", function() win:clear() end) + win:add_button("Enable edit", function() win:set_editable(true) end) + + -- add button to change text to uppercase + win:add_button("Uppercase", function() + local text = win:get_text() + if text ~= "" then + win:set(string.upper(text)) + end + end) + + -- print "closing" to stdout when the user closes the text windw + win:set_atclose(function() print("closing") end) + ---- + +*/ +#define WSLUA_OPTARG_TextWindow_new_TITLE 1 /* Title of the new window. Optional. Defaults to "Untitled Window". */ const gchar* title; TextWindow tw = NULL; @@ -422,7 +555,7 @@ WSLUA_CONSTRUCTOR TextWindow_new(lua_State* L) { /* Creates a new `TextWindow` t return 0; } - title = luaL_optstring(L,WSLUA_OPTARG_TextWindow_new_TITLE,"Untitled Window"); + title = luaL_optstring(L,WSLUA_OPTARG_TextWindow_new_TITLE, "Untitled Window"); tw = (struct _wslua_tw *)g_malloc(sizeof(struct _wslua_tw)); tw->expired = FALSE; tw->ws_tw = ops->new_text_window(title); @@ -475,8 +608,8 @@ WSLUA_METHOD TextWindow_set_atclose(lua_State* L) { /* Set the function that wil WSLUA_RETURN(1); /* The `TextWindow` object. */ } -WSLUA_METHOD TextWindow_set(lua_State* L) { /* Sets the text. */ -#define WSLUA_ARG_TextWindow_set_TEXT 2 /* The text to be used. */ +WSLUA_METHOD TextWindow_set(lua_State* L) { /* Sets the text to be displayed. */ +#define WSLUA_ARG_TextWindow_set_TEXT 2 /* The text to be displayed. */ TextWindow tw = checkTextWindow(L,1); const gchar* text = luaL_checkstring(L,WSLUA_ARG_TextWindow_set_TEXT); @@ -492,8 +625,8 @@ WSLUA_METHOD TextWindow_set(lua_State* L) { /* Sets the text. */ WSLUA_RETURN(1); /* The `TextWindow` object. */ } -WSLUA_METHOD TextWindow_append(lua_State* L) { /* Appends text */ -#define WSLUA_ARG_TextWindow_append_TEXT 2 /* The text to be appended */ +WSLUA_METHOD TextWindow_append(lua_State* L) { /* Appends text to the current window contents. */ +#define WSLUA_ARG_TextWindow_append_TEXT 2 /* The text to be appended. */ TextWindow tw = checkTextWindow(L,1); const gchar* text = luaL_checkstring(L,WSLUA_ARG_TextWindow_append_TEXT); @@ -508,8 +641,8 @@ WSLUA_METHOD TextWindow_append(lua_State* L) { /* Appends text */ WSLUA_RETURN(1); /* The `TextWindow` object. */ } -WSLUA_METHOD TextWindow_prepend(lua_State* L) { /* Prepends text */ -#define WSLUA_ARG_TextWindow_prepend_TEXT 2 /* The text to be appended */ +WSLUA_METHOD TextWindow_prepend(lua_State* L) { /* Prepends text to the current window contents. */ +#define WSLUA_ARG_TextWindow_prepend_TEXT 2 /* The text to be prepended. */ TextWindow tw = checkTextWindow(L,1); const gchar* text = luaL_checkstring(L,WSLUA_ARG_TextWindow_prepend_TEXT); @@ -524,7 +657,7 @@ WSLUA_METHOD TextWindow_prepend(lua_State* L) { /* Prepends text */ WSLUA_RETURN(1); /* The `TextWindow` object. */ } -WSLUA_METHOD TextWindow_clear(lua_State* L) { /* Erases all text in the window. */ +WSLUA_METHOD TextWindow_clear(lua_State* L) { /* Erases all of the text in the window. */ TextWindow tw = checkTextWindow(L,1); if (!ops->clear_text) { @@ -535,10 +668,10 @@ WSLUA_METHOD TextWindow_clear(lua_State* L) { /* Erases all text in the window. ops->clear_text(tw->ws_tw); /* XXX: this is a bad way to do this - should copy the object on to the stack first */ - WSLUA_RETURN(1); /* The TextWindow object. */ + WSLUA_RETURN(1); /* The `TextWindow` object. */ } -WSLUA_METHOD TextWindow_get_text(lua_State* L) { /* Get the text of the window */ +WSLUA_METHOD TextWindow_get_text(lua_State* L) { /* Get the text of the window. */ TextWindow tw = checkTextWindow(L,1); const gchar* text; @@ -553,7 +686,7 @@ WSLUA_METHOD TextWindow_get_text(lua_State* L) { /* Get the text of the window * WSLUA_RETURN(1); /* The `TextWindow`'s text. */ } -WSLUA_METHOD TextWindow_close(lua_State* L) { /* Close the window */ +WSLUA_METHOD TextWindow_close(lua_State* L) { /* Close the window. */ TextWindow tw = checkTextWindow(L,1); if (!ops->destroy_text_window) { @@ -588,7 +721,7 @@ static int TextWindow__gc(lua_State* L) { } WSLUA_METHOD TextWindow_set_editable(lua_State* L) { /* Make this text window editable. */ -#define WSLUA_OPTARG_TextWindow_set_editable_EDITABLE 2 /* A boolean flag, defaults to true. */ +#define WSLUA_OPTARG_TextWindow_set_editable_EDITABLE 2 /* `true` to make the text editable, `false` otherwise. Defaults to `true`. */ TextWindow tw = checkTextWindow(L,1); gboolean editable = wslua_optbool(L,WSLUA_OPTARG_TextWindow_set_editable_EDITABLE,TRUE); @@ -637,9 +770,9 @@ static gboolean wslua_button_callback(funnel_text_window_t* ws_tw, void* data) { } WSLUA_METHOD TextWindow_add_button(lua_State* L) { - /* Adds a button to the text window. */ -#define WSLUA_ARG_TextWindow_add_button_LABEL 2 /* The label of the button */ -#define WSLUA_ARG_TextWindow_add_button_FUNCTION 3 /* The Lua function to be called when clicked */ + /* Adds a button with an action handler to the text window. */ +#define WSLUA_ARG_TextWindow_add_button_LABEL 2 /* The button label. */ +#define WSLUA_ARG_TextWindow_add_button_FUNCTION 3 /* The Lua function to be called when the button is pressed. */ TextWindow tw = checkTextWindow(L,1); const gchar* label = luaL_checkstring(L,WSLUA_ARG_TextWindow_add_button_LABEL); @@ -709,7 +842,7 @@ int TextWindow_register(lua_State* L) { WSLUA_FUNCTION wslua_retap_packets(lua_State* L) { /* - Rescan all packets and just run taps - don't reconstruct the display. + Rescans all packets and runs each <> without reconstructing the display. */ if ( ops->retap_packets ) { ops->retap_packets(ops->ops_id); @@ -721,7 +854,7 @@ WSLUA_FUNCTION wslua_retap_packets(lua_State* L) { } -WSLUA_FUNCTION wslua_copy_to_clipboard(lua_State* L) { /* Copy a string into the clipboard. */ +WSLUA_FUNCTION wslua_copy_to_clipboard(lua_State* L) { /* Copy a string into the clipboard. Requires a GUI. */ #define WSLUA_ARG_copy_to_clipboard_TEXT 1 /* The string to be copied into the clipboard. */ const char* copied_str = luaL_checkstring(L,WSLUA_ARG_copy_to_clipboard_TEXT); GString* gstr; @@ -739,9 +872,9 @@ WSLUA_FUNCTION wslua_copy_to_clipboard(lua_State* L) { /* Copy a string into the return 0; } -WSLUA_FUNCTION wslua_open_capture_file(lua_State* L) { /* Open and display a capture file. */ +WSLUA_FUNCTION wslua_open_capture_file(lua_State* L) { /* Open and display a capture file. Requires a GUI. */ #define WSLUA_ARG_open_capture_file_FILENAME 1 /* The name of the file to be opened. */ -#define WSLUA_ARG_open_capture_file_FILTER 2 /* A filter to be applied as the file gets opened. */ +#define WSLUA_ARG_open_capture_file_FILTER 2 /* The https://wiki.wireshark.org/DisplayFilters[display filter] to be applied once the file is opened. */ const char* fname = luaL_checkstring(L,WSLUA_ARG_open_capture_file_FILENAME); const char* filter = luaL_optstring(L,WSLUA_ARG_open_capture_file_FILTER,NULL); @@ -796,9 +929,44 @@ WSLUA_FUNCTION wslua_set_filter(lua_State* L) { /* Set the main filter text. */ return 0; } -WSLUA_FUNCTION wslua_set_color_filter_slot(lua_State* L) { /* Set packet-coloring rule for the current session. */ -#define WSLUA_ARG_set_color_filter_slot_ROW 1 /* The index of the desired color in the temporary coloring rules list. */ -#define WSLUA_ARG_set_color_filter_slot_TEXT 2 /* Display filter for selecting packets to be colorized. */ +WSLUA_FUNCTION wslua_set_color_filter_slot(lua_State* L) { /* + Sets a https://wiki.wireshark.org/ColoringRules[packet coloring rule] (by index) for the current session. + Wireshark reserves 10 slots for these coloring rules. + Requires a GUI. +*/ +#define WSLUA_ARG_set_color_filter_slot_ROW 1 /* + The index (0-9) of the desired color in the temporary coloring rules list. + The default foreground is black and the default backgrounds are listed below. + + // XXX We need get the colors working, e.g. by adding them to a stylesheet. + .Default background colors + [cols="3",options="header"] + |=== + |Index |RGB (hex) |Color + |0 |ffc0c0 |{set:cellbgcolor:#ffc0c0} pink 1 + |1 |ffc0ff |{set:cellbgcolor:#ffc0ff} pink 2 + |2 |e0c0e0 |{set:cellbgcolor:#e0c0e0} purple 1 + |3 |c0c0ff |{set:cellbgcolor:#c0c0ff} purple 2 + |4 |c0e0e0 |{set:cellbgcolor:#c0e0e0} green 1 + |5 |c0ffff |{set:cellbgcolor:#c0ffff} green 2 + |6 |c0ffc0 |{set:cellbgcolor:#c0ffc0} green 3 + |7 |ffffc0 |{set:cellbgcolor:#ffffc0} yellow 1 + |8 |e0e0c0 |{set:cellbgcolor:#e0e0c0} yellow 2 + |9 |e0e0e0 |{set:cellbgcolor:#e0e0e0} gray + |=== + + The color list can be set from the command line using two unofficial preferences: `gui.colorized_frame.bg` and `gui.colorized_frame.fg`, which require 10 hex RGB codes (6 hex digits each), e.g. + ---- + wireshark -o gui.colorized_frame.bg:${RGB0},${RGB1},${RGB2},${RGB3},${RGB4},${RGB5},${RGB6},${RGB7},${RGB8},${RGB9} + ---- + + For example, this command yields the same results as the table above (and with all foregrounds set to black): + ---- + wireshark -o gui.colorized_frame.bg:ffc0c0,ffc0ff,e0c0e0,c0c0ff,c0e0e0,c0ffff,c0ffc0,ffffc0,e0e0c0,e0e0e0 -o gui.colorized_frame.fg:000000,000000,000000,000000,000000,000000,000000,000000 + ---- + */ +#define WSLUA_ARG_set_color_filter_slot_TEXT 2 /* The https://wiki.wireshark.org/DisplayFilters[display filter] for selecting packets to be colorized +. */ guint8 row = (guint8)luaL_checkinteger(L,WSLUA_ARG_set_color_filter_slot_ROW); const gchar* filter_str = luaL_checkstring(L,WSLUA_ARG_set_color_filter_slot_TEXT); @@ -812,7 +980,16 @@ WSLUA_FUNCTION wslua_set_color_filter_slot(lua_State* L) { /* Set packet-colorin return 0; } -WSLUA_FUNCTION wslua_apply_filter(lua_State* L) { /* Apply the filter in the main filter box. */ +WSLUA_FUNCTION wslua_apply_filter(lua_State* L) { /* + Apply the filter in the main filter box. + Requires a GUI. + + [WARNING] + ==== + Avoid calling this from within a dissector function or else an infinite loop can occur if it causes the dissector to be called again. + This function is best used in a button callback (from a dialog or text window) or menu callback. + ==== + */ if (!ops->apply_filter) { WSLUA_ERROR(apply_filter, "GUI not available"); return 0; @@ -824,7 +1001,7 @@ WSLUA_FUNCTION wslua_apply_filter(lua_State* L) { /* Apply the filter in the mai } -WSLUA_FUNCTION wslua_reload(lua_State* L) { /* Reload the current capture file. Obsolete, use reload_packets() */ +WSLUA_FUNCTION wslua_reload(lua_State* L) { /* Reload the current capture file. Deprecated. Use reload_packets() instead. */ if (!ops->reload_packets) { WSLUA_ERROR(reload, "GUI not available"); @@ -837,7 +1014,16 @@ WSLUA_FUNCTION wslua_reload(lua_State* L) { /* Reload the current capture file. } -WSLUA_FUNCTION wslua_reload_packets(lua_State* L) { /* Reload the current capture file. */ +WSLUA_FUNCTION wslua_reload_packets(lua_State* L) { /* + Reload the current capture file. + Requires a GUI. + + [WARNING] + ==== + Avoid calling this from within a dissector function or else an infinite loop can occur if it causes the dissector to be called again. + This function is best used in a button callback (from a dialog or text window) or menu callback. + ==== + */ if (!ops->reload_packets) { WSLUA_ERROR(reload, "GUI not available"); @@ -863,7 +1049,7 @@ WSLUA_FUNCTION wslua_reload_lua_plugins(lua_State* L) { /* Reload all Lua plugin } -WSLUA_FUNCTION wslua_browser_open_url(lua_State* L) { /* Open an url in a browser. */ +WSLUA_FUNCTION wslua_browser_open_url(lua_State* L) { /* Opens an URL in a web browser. Requires a GUI. */ #define WSLUA_ARG_browser_open_url_URL 1 /* The url. */ const char* url = luaL_checkstring(L,WSLUA_ARG_browser_open_url_URL); @@ -877,7 +1063,11 @@ WSLUA_FUNCTION wslua_browser_open_url(lua_State* L) { /* Open an url in a browse return 0; } -WSLUA_FUNCTION wslua_browser_open_data_file(lua_State* L) { /* Open a file in a browser. */ +WSLUA_FUNCTION wslua_browser_open_data_file(lua_State* L) { /* + Open a file located in the data directory (specified in the Wireshark preferences) in the web browser. + If the file does not exist, the function silently ignores the request. + Requires a GUI. + */ #define WSLUA_ARG_browser_open_data_file_FILENAME 1 /* The file name. */ const char* file = luaL_checkstring(L,WSLUA_ARG_browser_open_data_file_FILENAME);