fix: check before destroy

This commit is contained in:
Alex 2019-07-15 10:06:01 +02:00
parent 0834551161
commit bb99e6cf5b
2 changed files with 19 additions and 7 deletions

View File

@ -1,10 +1,10 @@
#pragma once #pragma once
#include <glibmm/refptr.h> #include <glibmm/refptr.h>
#include <gtkmm/box.h>
#include <gtkmm/cssprovider.h> #include <gtkmm/cssprovider.h>
#include <gtkmm/main.h> #include <gtkmm/main.h>
#include <gtkmm/window.h> #include <gtkmm/window.h>
#include <gtkmm/box.h>
#include <json/json.h> #include <json/json.h>
#include "AModule.hpp" #include "AModule.hpp"
#include "idle-inhibit-unstable-v1-client-protocol.h" #include "idle-inhibit-unstable-v1-client-protocol.h"
@ -15,10 +15,10 @@ namespace waybar {
class Factory; class Factory;
struct waybar_output { struct waybar_output {
struct wl_output * output; struct wl_output * output = nullptr;
std::string name; std::string name;
uint32_t wl_name; uint32_t wl_name;
struct zxdg_output_v1 *xdg_output; struct zxdg_output_v1 *xdg_output = nullptr;
}; };
class Bar { class Bar {

View File

@ -65,8 +65,14 @@ void waybar::Client::handleGlobalRemove(void * data, struct wl_registry * /*re
client->outputs_.end(), client->outputs_.end(),
[&name](const auto &output) { return output->wl_name == name; }); [&name](const auto &output) { return output->wl_name == name; });
if (it != client->outputs_.end()) { if (it != client->outputs_.end()) {
zxdg_output_v1_destroy((*it)->xdg_output); if ((*it)->xdg_output != nullptr) {
wl_output_destroy((*it)->output); zxdg_output_v1_destroy((*it)->xdg_output);
(*it)->xdg_output = nullptr;
}
if ((*it)->output != nullptr) {
wl_output_destroy((*it)->output);
(*it)->output = nullptr;
}
client->outputs_.erase(it); client->outputs_.erase(it);
} }
} }
@ -151,8 +157,14 @@ void waybar::Client::handleName(void * data, struct zxdg_output_v1 * /*xdg_
output->name = name; output->name = name;
auto configs = client->getOutputConfigs(output); auto configs = client->getOutputConfigs(output);
if (configs.empty()) { if (configs.empty()) {
wl_output_destroy(output->output); if (output->output != nullptr) {
zxdg_output_v1_destroy(output->xdg_output); wl_output_destroy(output->output);
output->output = nullptr;
}
if (output->xdg_output != nullptr) {
zxdg_output_v1_destroy(output->xdg_output);
output->xdg_output = nullptr;
}
} else { } else {
wl_display_roundtrip(client->wl_display); wl_display_roundtrip(client->wl_display);
for (const auto &config : configs) { for (const auto &config : configs) {