mirror of
https://github.com/lakinduakash/linux-wifi-hotspot.git
synced 2024-11-24 21:20:12 +00:00
Add a inserted window to show connected devices
This commit is contained in:
parent
821e04a81e
commit
fbe9fd7e4d
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.22.2 -->
|
<!-- Generated with glade 3.22.1 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.20"/>
|
<requires lib="gtk+" version="3.20"/>
|
||||||
<object class="GtkApplicationWindow" id="window">
|
<object class="GtkApplicationWindow" id="window">
|
||||||
@ -503,16 +503,133 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkBox">
|
<object class="GtkExpander">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<child>
|
<child>
|
||||||
<placeholder/>
|
<object class="GtkScrolledWindow">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="shadow_type">in</property>
|
||||||
|
<property name="min_content_height">100</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkViewport">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkGrid">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="column_homogeneous">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Number</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Hostname</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">IP</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">2</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">MAC</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">3</property>
|
||||||
|
<property name="top_attach">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkGrid" id="grid_devices">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="row_homogeneous">True</property>
|
||||||
|
<property name="column_homogeneous">True</property>
|
||||||
|
<property name="baseline_row">1</property>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button_refresh">
|
||||||
|
<property name="label" translatable="yes">Refresh</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child type="label">
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Connected devices</property>
|
||||||
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">True</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">4</property>
|
<property name="position">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
|
@ -420,3 +420,56 @@ char** get_wifi_interface_list(int *length){
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Node get_connected_devices(char *PID)
|
||||||
|
{
|
||||||
|
char cmd[BUFSIZE];
|
||||||
|
snprintf(cmd, BUFSIZE, "%s --list-clients %s", CREATE_AP, PID);
|
||||||
|
FILE *fp;
|
||||||
|
Node l = (struct Device *)malloc(sizeof(struct Device));
|
||||||
|
Position head = l;
|
||||||
|
fp = popen(cmd, "r");
|
||||||
|
char line[BUFSIZE];
|
||||||
|
|
||||||
|
int _n = 0; //Device number
|
||||||
|
while (fgets(line, BUFSIZE, fp) != NULL)
|
||||||
|
{
|
||||||
|
if (strstr(line, "MAC") != NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_n++;
|
||||||
|
int size = strlen(line);
|
||||||
|
int marker[3] = {0};
|
||||||
|
int n = 0; // For marker
|
||||||
|
line[size - 1] = '\0'; // Remove "\n"
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (*(line + i) != ' ' && *(line + i + 1) == ' ')
|
||||||
|
{
|
||||||
|
// End
|
||||||
|
*(line + i + 1) = '\0';
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (*(line + i) == ' ' && *(line + i + 1) != ' ')
|
||||||
|
{
|
||||||
|
// Head
|
||||||
|
*(line + i) = '\0';
|
||||||
|
marker[++n] = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l = add_device_node(l, _n, line, marker);
|
||||||
|
}
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
PtrToNode add_device_node(PtrToNode l, int number, char line[BUFSIZE], int marker[3])
|
||||||
|
{
|
||||||
|
Node next = (PtrToNode)malloc(sizeof(struct Device));
|
||||||
|
strcpy(next->MAC, line);
|
||||||
|
strcpy(next->IP, line + marker[1]);
|
||||||
|
strcpy(next->HOSTNAME, line + marker[2]);
|
||||||
|
next->Number = number;
|
||||||
|
next->Next = NULL;
|
||||||
|
l->Next = next;
|
||||||
|
return next;
|
||||||
|
}
|
@ -35,6 +35,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "read_config.h"
|
#include "read_config.h"
|
||||||
|
|
||||||
|
typedef struct Device *PtrToNode;
|
||||||
|
struct Device
|
||||||
|
{
|
||||||
|
char HOSTNAME[2048];
|
||||||
|
char IP[2048];
|
||||||
|
char MAC[2048];
|
||||||
|
unsigned int Number;
|
||||||
|
PtrToNode Next;
|
||||||
|
}; // Head node is null
|
||||||
|
typedef PtrToNode Position;
|
||||||
|
typedef PtrToNode Node;
|
||||||
|
|
||||||
static int parse_output(const char *);
|
static int parse_output(const char *);
|
||||||
|
|
||||||
const char *build_wh_start_command(char *, char *, char *, char *);
|
const char *build_wh_start_command(char *, char *, char *, char *);
|
||||||
@ -59,4 +71,7 @@ void write_accepted_macs(char* filename, char* accepted_macs);
|
|||||||
|
|
||||||
char * read_mac_filter_file(char * filename);
|
char * read_mac_filter_file(char * filename);
|
||||||
|
|
||||||
|
Node get_connected_devices(char *PID);
|
||||||
|
PtrToNode add_device_node(Node l, int number, char *line, int marker[3]);
|
||||||
|
|
||||||
#endif //WIHOTSPOT_H_PROP_H
|
#endif //WIHOTSPOT_H_PROP_H
|
||||||
|
54
src/ui/ui.c
54
src/ui/ui.c
@ -57,6 +57,14 @@ GObject *window;
|
|||||||
GtkButton *button_create_hp;
|
GtkButton *button_create_hp;
|
||||||
GtkButton *button_stop_hp;
|
GtkButton *button_stop_hp;
|
||||||
GtkButton *button_about;
|
GtkButton *button_about;
|
||||||
|
GtkButton *button_refresh;
|
||||||
|
|
||||||
|
GtkGrid *grid_devices;
|
||||||
|
GtkWidget *h;
|
||||||
|
GtkWidget *i;
|
||||||
|
GtkWidget *m;
|
||||||
|
GtkWidget *n;
|
||||||
|
PtrToNode l;
|
||||||
|
|
||||||
GtkEntry *entry_ssd;
|
GtkEntry *entry_ssd;
|
||||||
GtkEntry *entry_pass;
|
GtkEntry *entry_pass;
|
||||||
@ -153,6 +161,48 @@ static void on_about_open_click(GtkWidget *widget, gpointer data){
|
|||||||
show_info(widget,data);
|
show_info(widget,data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_connected_devices_label()
|
||||||
|
{
|
||||||
|
Position tmp;
|
||||||
|
l = get_connected_devices(running_info[0]); // running_info[0] PID
|
||||||
|
|
||||||
|
// Remove all the children widgets
|
||||||
|
GList *children, *iter;
|
||||||
|
|
||||||
|
children = gtk_container_get_children(GTK_CONTAINER(grid_devices));
|
||||||
|
for (iter = children; iter != NULL; iter = g_list_next(iter))
|
||||||
|
{
|
||||||
|
gtk_widget_destroy(GTK_WIDGET(iter->data));
|
||||||
|
}
|
||||||
|
g_list_free(children);
|
||||||
|
|
||||||
|
while (l->Next != NULL)
|
||||||
|
{
|
||||||
|
tmp = l; // Save the last one
|
||||||
|
l = l->Next;
|
||||||
|
char number[1];
|
||||||
|
sprintf(number, "%d", l->Number);
|
||||||
|
n = gtk_label_new(number);
|
||||||
|
h = gtk_label_new(l->HOSTNAME);
|
||||||
|
i = gtk_label_new(l->IP);
|
||||||
|
m = gtk_label_new(l->MAC);
|
||||||
|
|
||||||
|
gtk_grid_attach(grid_devices, n, 0, l->Number, 1, 1);
|
||||||
|
gtk_grid_attach(grid_devices, h, 1, l->Number, 1, 1);
|
||||||
|
gtk_grid_attach(grid_devices, i, 2, l->Number, 1, 1);
|
||||||
|
gtk_grid_attach(grid_devices, m, 3, l->Number, 1, 1);
|
||||||
|
gtk_widget_show_all((GtkWidget *)grid_devices);
|
||||||
|
free(tmp); // Free the last pointer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_refresh_clicked(GtkWidget *widget, gpointer data)
|
||||||
|
{
|
||||||
|
if (running_info[0] != NULL)
|
||||||
|
{
|
||||||
|
set_connected_devices_label();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void loadStyles(){
|
static void loadStyles(){
|
||||||
provider = gtk_css_provider_new();
|
provider = gtk_css_provider_new();
|
||||||
@ -360,6 +410,9 @@ int initUi(int argc, char *argv[]){
|
|||||||
button_create_hp = (GtkButton *) gtk_builder_get_object(builder, "button_create_hp");
|
button_create_hp = (GtkButton *) gtk_builder_get_object(builder, "button_create_hp");
|
||||||
button_stop_hp = (GtkButton *) gtk_builder_get_object(builder, "button_stop_hp");
|
button_stop_hp = (GtkButton *) gtk_builder_get_object(builder, "button_stop_hp");
|
||||||
button_about = (GtkButton *) gtk_builder_get_object(builder, "button_about");
|
button_about = (GtkButton *) gtk_builder_get_object(builder, "button_about");
|
||||||
|
button_refresh = (GtkButton *)gtk_builder_get_object(builder, "button_refresh");
|
||||||
|
|
||||||
|
grid_devices = (GtkGrid *)gtk_builder_get_object(builder, "grid_devices");
|
||||||
|
|
||||||
entry_ssd = (GtkEntry *) gtk_builder_get_object(builder, "entry_ssid");
|
entry_ssd = (GtkEntry *) gtk_builder_get_object(builder, "entry_ssid");
|
||||||
entry_pass = (GtkEntry *) gtk_builder_get_object(builder, "entry_pass");
|
entry_pass = (GtkEntry *) gtk_builder_get_object(builder, "entry_pass");
|
||||||
@ -403,6 +456,7 @@ int initUi(int argc, char *argv[]){
|
|||||||
g_signal_connect (button_create_hp, "clicked", G_CALLBACK(on_create_hp_clicked), NULL);
|
g_signal_connect (button_create_hp, "clicked", G_CALLBACK(on_create_hp_clicked), NULL);
|
||||||
g_signal_connect (button_stop_hp, "clicked", G_CALLBACK(on_stop_hp_clicked), NULL);
|
g_signal_connect (button_stop_hp, "clicked", G_CALLBACK(on_stop_hp_clicked), NULL);
|
||||||
g_signal_connect (button_about, "clicked", G_CALLBACK(on_about_open_click), NULL);
|
g_signal_connect (button_about, "clicked", G_CALLBACK(on_about_open_click), NULL);
|
||||||
|
g_signal_connect (button_refresh, "clicked", G_CALLBACK(on_refresh_clicked), NULL); //new
|
||||||
|
|
||||||
g_signal_connect (entry_mac, "changed", G_CALLBACK(entry_mac_warn), NULL);
|
g_signal_connect (entry_mac, "changed", G_CALLBACK(entry_mac_warn), NULL);
|
||||||
g_signal_connect (entry_ssd, "changed", G_CALLBACK(entry_ssid_warn), NULL);
|
g_signal_connect (entry_ssd, "changed", G_CALLBACK(entry_ssid_warn), NULL);
|
||||||
|
@ -70,4 +70,6 @@ static void set_error_text(char * text);
|
|||||||
|
|
||||||
gchar* get_accepted_macs();
|
gchar* get_accepted_macs();
|
||||||
|
|
||||||
|
static void set_connected_devices_label(); // new
|
||||||
|
|
||||||
#endif //WIHOTSPOT_UI_H
|
#endif //WIHOTSPOT_UI_H
|
||||||
|
Loading…
Reference in New Issue
Block a user